Làm quen với Thresholding trong OpenCV

Công nghệ

Trong bài đọc này, chúng ta sẽ tìm hiểu về ngưỡng ảnh. Thông thường, đây là phương pháp mà chúng ta sẽ sử dụng khi muốn chuyển đổi từ ảnh xám thành ảnh nhị phân – giá trị các điểm ảnh là 0 hoặc 1. Bạn đọc hẳn còn nhớ, ảnh xám bao gồm các điểm ảnh có giá trị trong khoảng từ 0 tới 255, phương pháp xét ngưỡng cơ bản để có thể chuyển đổi qua ảnh nhị phân đó là chúng ta chọn một giá trị điểm ảnh là p, và cài đặt toàn bộ điểm ảnh có giá trị nhỏ hơn p thành giá trị 0, những điểm ảnh còn lại mang giá trị 1. Như vậy, chúng ta đã thu được một bức ảnh nhị phân từ ảnh xám

Ảnh xám

Ảnh nhị phân
Việc chúng ta áp dụng xét ngưỡng trong xử lý ảnh nhằm tập trung vào các đối tượng hoặc vùng ảnh cụ thể mà ta quan tâm. Bạn đọc sẽ thấy rõ ràng hơn qua ví dụ tìm đồng xu trong bức ảnh dưới đây.
1.Phương pháp xét ngưỡng cơ bản
Phương pháp cơ bản đầu tiên mà chúng ta tìm hiểu sẽ khá thủ công, phụ thuộc phần lớn vào bản thân bạn đọc. Trước hết, ta cần định nghĩa giá trị ngưỡng là T. Tất cả điểm ảnh có giá trị nhỏ hơn T được cài đặt giá trị mới là 0, và tất cả điểm ảnh lớn hơn T cài đặt giá trị mới là 255. Bạn đọc cũng có thể cài đặt giá trị ngược lại do ảnh nhị phân chỉ gồm hai giá trị là 0 và 1 như mình đã trình bày trong những bài mở đầu. Ta sẽ cùng nhau xem xét ví dụ sau:

Dòng 1-15, chúng ta thực hiện các thao tác quen thuộc: khai báo thư viện, định nghĩa tham số đầu vào, thay đổi kích thước và hiển thị hình ảnh. Trong đó, dòng 13 thực hiện chuyển đổi ảnh đầu vào hệ màu RGB thành ảnh xám. Tiếp đó ở dòng 14, ta áp dụng kỹ thuật làm mờ Gaussian trong bài học trước giúp loại bỏ một số đường nét từ đồng xu.

 


AnhDemo: Bức ảnh đầu vào sau khi chuyển đổi từ hệ màu RGB thành ảnh xám
Threshold Binary: áp dụng ngưỡng nhị phân cơ bản, đồng xu hiển thị có màu đen và nền trắng
Threshold Binary Inverse: áp dụng nghịch đảo kết quả threshold binary. Đồng xu mang giá trị điểm ảnh ngược lại có màu trắng, nền từ trắng chuyển thành đen
Coins: Áp dụng mặt nạ là kết quả threshold binary inverse trong ảnh xám. Chúng ta thu được ảnh cuối tập trung vào duy nhất các đồng xu.
Sau khi áp dụng kỹ thuật làm mờ ảnh, ta tính toán ngưỡng ảnh qua hàm cv2.threshold tại dòng 17. Hàm này nhận vào 4 tham số: thứ nhất là ảnh xám mà ta muốn áp dụng xét ngưỡng – ta cung cấp ảnh xám đã được xử lý làm mờ cho tham số này. Tiếp đó, chúng ta cung cấp giá trị ngưỡng chọn thủ công T = 155. Tham số thứ ba là ngưỡng tối đa mà ta áp dụng. Tất cả các điểm ảnh có giá trị p lớn hơn T sẽ mang giá trị tham số thứ ba này. Và tất giá trị nhỏ hơn 155 sẽ được cài đặt là 0. Cuối cùng, chúng ta cung cấp phương thức ngưỡng: cv2.THRESH_BINARY để thực hiện thay đổi các giá trị điểm ảnh theo ngưỡng cung cấp từ các tham số phía trước.
Hàm cv2.threshold trả về hai giá trị: T và ảnh đã được biến đổi theo ngưỡng cài đặt. Kết quả thu được như bạn đọc có thể theo dõi ở hình trên cùng phía bên phải: đồng xu có màu đen và nền trắng.
Qua dòng 20, ta áp dụng ngưỡng đảo ngược cho ảnh qua phương thức cv2.THRESH_BINARY_INVERSE và thu được kết quả là đồng xu màu trắng nền đen. Cuối cùng, để có thể thu được kết quả chỉ bao gồm những đồng xu từ bức ảnh ban đầu, ta thực hiện tác vụ ở dòng 23 bằng cách sử dụng cv2.bitwise_and. Ta cung cấp ảnh cần lọc xu cho tham số thứ nhất và mặt nạ sử dụng là kết quả áp dụng ngưỡng đảo ngược. Kết quả cuối cùng ta thu được bức ảnh chỉ gồm giá trị điểm ảnh của các đồng xu. Ứng dụng phương pháp này bạn đọc hẳn không còn xa lạ gì khi xem các streamer xóa nền và chỉ hiển thị khuôn mặt khi tương tác.
2.Phương pháp ngưỡng thích ứng
Một trong những nhược điểm của việc xét ngưỡng cơ bản hẳn bạn đọc có thể dễ dàng nhận thấy chính là việc phải chọn giá trị T một cách thủ công, cảm tính hoặc phải qua nhiều lần cài đặt để tìm ra giá trị phù hợp cho bài toán. Phương pháp thứ hai mà mình giới thiệu không chỉ tìm ra giá trị T mà còn hỗ trợ nhiều cài đặt tinh chỉnh tham số. Áp dụng ngưỡng thích ứng hoạt động trên cơ chế tìm giá trị tối ưu T của các điểm ảnh lân cận.

Từ dòng 1-15, ta thực hiện tương tự phương pháp thứ nhất. Chúng ta áp dụng ngưỡng thích ứng ở dòng 17 qua hàm cv2.adaptiveThreshold với tham số thứ nhất là bức ảnh ta muốn áp dụng ngưỡng, tham số thứ 2 cung cấp giá trị điểm ảnh tối đa áp dụng ngưỡng – 255 như ở ngưỡng cơ bản. Tham số thứ ba mà chúng ta cung cấp là cv2.ADAPTIVE_THRESH_MEAN_C – tính T bằng trung bình giá trị các điểm ảnh lân cận. Tiếp theo là phương thức cài đặt ngưỡng để chuyển đổi ánh xám qua ảnh nhị phân, sau đó, ta cung cấp kích thước vùng xét ngưỡng – giá trị này phải là số lẻ. Ở đây, 11 nghĩa là ta sẽ xét vùng áp dụng ngưỡng có kích thước 11×11 thay vì toàn bộ bức ảnh như phương pháp thứ nhất.Tham số cuối cùng là C – giá trị trừ đi từ giá trị trung bình để điều chỉnh ngưỡng. Kết quả thu được như sau:

Tổng quan, chúng ta thấy rằng ở phương pháp thứ hai, việc lựa chọn ngưỡng trung bình hay ngưỡng theo Gauss thì vẫn yêu cầu một số tham số cuối phụ thuộc vào quá trình thực nghiệm. Tham số quan trọng nhất ở phương pháp này chính là kích thước vùng lân cận xét T và giá trị hiệu chỉnh C. Bằng cách thử nghiệm các tham số này, bạn đọc sẽ tìm ra cách xử lý ảnh phù hợp nhất với từng bài toán.
3.Phương pháp Otsu và Riddler-Calvard
Một phương pháp khác giúp bạn đọc có thể tự động tính toán ngưỡng T chính là phương pháp Otsu. Phương pháp này giả sử tồn tại hai đỉnh trong biểu đồ ảnh xám (bạn đọc hẳn còn nhớ kiến thức trong bài histograms chứ?), khi đó, bằng cách tìm giá trị tối ưu giữa hai đỉnh này, ta thu được ngưỡng T. Chúng ta sẽ tìm hiểu thực nghiệm phương pháp này qua thư viện mahotas

 

Dòng 1-16, ta thực hiện tương tự các ví dụ trên. Để có thể tìm được ngưỡng T phù hợp, chúng ta sử dụng hàm mahotas.thresholding.otsu với tham số truyền vào là bức ảnh cần xử lý, và như vậy ta đã thu được giá trị T = 187


Để có thể thu được kết quả của phương pháp Otsu, ta thực hiện từ dong 21-25. Trước hết, ta tạo một bản sao từ ảnh xám để có thể áp dụng ngưỡng. Dòng 22 thay đổi tất cả giá trị lớn hơn T thành màu trắng, và dòng 23 làm điều ngược lại – thay đổi các giá trị nhỏ hơn T thành màu đen. Cuối cùng, ta áp dụng cv2.bitwise_not để áp dụng ngưỡng vào bức ảnh – bạn đọc tham khảo thêm trong bài viết về phép toán bit, sau đó ta hiển thị kết quả ở dòng 25. Bạn đọc thực hiện tương tự với phương pháp Riddler-Calvard dòng 27-34.