Lý thuyết về phân ngưỡng ảnh (threshold)

Mục tiêu:

  • Biết phân ngưỡnglà gì
  • Nguyên lý của các thuật toán phân ngưỡng
  • Tìm hiểu 2 hàm: threshold adaptiveThreshold


Phân ngưỡng ảnh đơn giản

Nếu pixel có giá trị lớn hơn giá trị ngưỡng thì nó được gán 1 giá trị (thường là 1), ngược lại nhỏ hơn giá trị ngưỡng thì nó được gán 1 giá trị khác (thường là 0).

Hàm sử dụng là threshold , tham số đầu tiên là 1 ảnh xám, tham số thứ 2 là giá trị ngưỡng, tham số thứ 3 maxval là giá trị được gán nếu giá pixel lớn hơn giá trị ngưỡng, tham số thứ 4 là loại phân ngưỡng. Tùy theo các loại phân ngưỡng mà pixel được gán giá trị khác nhau:

  • THRESH_BINARY
    • Nếu giá trị pixel lớn hơn ngưỡng thì gán bằng maxval
    • Ngược lại bằng gán bằng 0
  • THRESH_BINARY_INV
    • Nếu giá trị pixel lớn hơn ngưỡng thì gán bằng 0
    • Ngược lại bằng gán bằng maxval
  • THRESH_TRUNC
    • Nếu giá trị pixel lớn hơn ngưỡng thì gán giá trị bằng ngưỡng
    • Ngược lại giữ nguyên giá trị
  • THRESH_TOZERO
    • Nếu giá trị pixel lớn hơn ngưỡng thì giữ nguyên giá trị
    • Ngược lại gán bằng 0
  • THRESH_TOZERO_INV
    • Nếu giá trị pixel lớn hơn ngưỡng thì gán giá trị bằng 0
    • Ngược lại giữ nguyên

Hơi phức tạp đúng hông? Đây là hình minh họa trực quan với ngưỡng bằng 127:


Adaptive Thresholding (phân ngưỡng thích nghi)

Phương pháp phân ngưỡng ở trên không phù hợp cho nhiều trường hợp, như là ánh sáng không đồng đều trên ảnh. Trong trường hợp đó chúng ta dùng hàm adaptiveThreshold(). Phương thức này tính giá trị trung bình của các n điểm xung quanh pixel đó rồi trừ cho C chứ không lấy ngưỡng cố định (n thường là số lẻ, còn C là số nguyên bất kỳ).

Ngoài các tham số giống như phân ngưỡng thường, adaptiveThreshold có thêm các tham số:

  • Phương thức:
    • ADAPTIVE_THRESH_MEAN_C: giá trị của pixel phụ thuộc vào các pixel lân cận
    • ADAPTIVE_THRESH_GAUSSIAN_C: giá trị của pixel cũng phụ thuộc vào các pixel lân cận, tuy nhiên được khử nhiễu
  • Block Size: số pixel lân cận dùng để tính toán
  • C: hằng số trừ đi giá trị trung bình


Hình minh họa cho các phương pháp phân ngưỡng khác nhau.


Otsu’s Binarization

Tạm dịch là nhị phân hóa bằng thuật toán Otsu

Trong phương thức phân ngưỡng thường, bạn lấy ngưỡng tùy ý, nhưng giá trị ngưỡng đó cho kết quả tốt hay ko? Câu trả lời là thử mới biết.

Nhưng với ảnh có 2 đỉnh trong histogram, tức là ảnh có 2 vùng sáng nổi bật. Như hình có nhiễu bên dưới chẳng hạn, khi chưa lọc nhiễu thì chỉ có 1 đỉnh, sau khi lọc nhiễu có tới 2 đỉnh. Như vậy ngưỡng tốt nhất là giá trị trung bình của 2 đỉnh đó. Thuật toán này chỉ hiệu quả với ảnh có 2 đỉnh, do đó phải sử dụng hàm GaussianBlur để có được kết quả mong muốn.

Giải thích 1 chút tại sao ảnh sau khi GaussianBlur lại có 2 đỉnh:
– Ảnh gốc có nhiễu, các giá trị của pixel chênh lệch không nhiều nên historgram có dạng đồi thoai thoải
– Ảnh sau khi lọc nhiễu có 2 đỉnh, đỉnh cao là những pixel sáng nhất nằm trong hình nhữ nhật nhỏ. Đỉnh thấp là những pixel sáng hơn nằm bên ngoài.

Nguồn

Leave a Reply