5.15. Các phép toán hình thái học¶
Các phép toán hình thái học làm việc trên ảnh nhị phân -- các mặt nạ xuất phát từ ngưỡng hóa và phát hiện cạnh. Mỗi phép toán duyệt qua cùng loại vùng lân cận trượt mà các bộ lọc làm mịn sử dụng, nhưng câu hỏi nó đặt ra tại mỗi vị trí là có/không: mọi điểm ảnh trong vùng lân cận có bật không, bất kỳ điểm ảnh nào trong vùng lân cận có bật không, mẫu bật/tắt trông như thế nào? Các câu trả lời mở rộng các vùng, thu nhỏ chúng, và cắt lại ranh giới của chúng theo những cách mà bộ lọc lấy trung bình không thể làm.
Hình thái học là thứ đứng giữa mặt nạ nhị phân ban đầu -- đầu ra của ngưỡng hóa, phát hiện cạnh, hoặc một bộ phân loại khác -- và mặt nạ nhị phân sạch mà phần còn lại của pipeline có thể sử dụng. Đầu ra ngưỡng thô thường có các điểm ảnh nhiễu đơn lẻ rải rác qua các vùng tiền cảnh thực, các lỗ nhỏ đục vào các vùng nguyên khối khác, và ranh giới lởm chởm nơi ngưỡng cắt gần mép đối tượng. Hình thái học loại bỏ những khuyết điểm đó.
5.15.1. Bốn phép toán cổ điển¶
Hai phép toán nguyên thủy, và hai tổ hợp của chúng, tạo thành bộ công cụ hình thái học:
dilate() mở rộng mọi vùng tiền cảnh. Quy tắc là: bất kỳ điểm ảnh nào có ít nhất một điểm lân cận tiền cảnh trong cửa sổ (2 * size + 1) của nó sẽ trở thành tiền cảnh. Hiệu ứng nhìn thấy là các vùng tiền cảnh lớn hơn size điểm ảnh theo mọi hướng, và các lỗ bên trong chúng thu nhỏ (hoặc biến mất) theo cùng lượng.
erode() thực hiện phép đảo ngược. Bất kỳ điểm ảnh nào không có mọi điểm lân cận trong cửa sổ của nó ở tiền cảnh sẽ trở thành nền. Các vùng tiền cảnh nhỏ hơn size điểm ảnh theo mọi hướng, các điểm ảnh tiền cảnh đơn lẻ (không có điểm lân cận tiền cảnh) biến mất hoàn toàn, và các kết nối nhỏ giữa các vùng lớn hơn bị cắt đứt.
Bốn phép toán hình thái học cổ điển được áp dụng cho một vùng nhị phân nhiễu. Erode thu nhỏ; dilate mở rộng; open là erode rồi dilate (loại bỏ nhiễu); close là dilate rồi erode (lấp đầy lỗ).¶
open() là erode theo sau bởi dilate. Ảnh đã erode đã loại bỏ mọi điểm ảnh nhiễu đơn lẻ, nhưng nó cũng đã bị thu nhỏ size điểm ảnh theo mọi hướng. Theo erode với dilate cùng kích thước sẽ khôi phục các vùng tiền cảnh thực về gần ranh giới ban đầu của chúng trong khi vẫn loại bỏ nhiễu. Tổ hợp này là điều làm cho open trở thành phép toán "loại bỏ nhiễu" tiêu chuẩn trong hình thái học cổ điển: các điểm ảnh tiền cảnh đơn lẻ biến mất, các vùng thực trở lại không bị tổn hại.
close() là ảnh gương -- dilate theo sau bởi erode. Dilate lấp đầy các lỗ nhỏ bên trong các vùng tiền cảnh và kết nối các vùng được phân tách bởi các khoảng hở nhỏ; erode thu nhỏ kết quả về ranh giới ngoài ban đầu của nó trong khi giữ lại nội thất đã lấp đầy đặc. close là phép toán "lấp đầy khoảng hở nhỏ" tiêu chuẩn.
binary_mask.open(1) # remove single-pixel noise
binary_mask.close(2) # fill small holes and gaps
Tham số size có cùng ý nghĩa như trong các bộ lọc độ sáng: size=1 có nghĩa là vùng lân cận 3x3, size=2 có nghĩa là 5x5, v.v. Kích thước lớn hơn có nghĩa là làm sạch mạnh hơn -- và chi phí trên mỗi điểm ảnh cao hơn.
5.15.2. Top-hat và black-hat¶
Hai tổ hợp thêm đáng biết vì chúng trích xuất chính xác các đặc trưng mà open và close loại bỏ:
top_hat() trả về sự khác biệt giữa ảnh gốc và phiên bản đã mở của nó -- các điểm ảnh tiền cảnh mà open sẽ đã loại bỏ. Đó thực sự là một mặt nạ của các điểm ảnh nhiễu, các vùng tiền cảnh nhỏ đơn lẻ, các cấu trúc tiền cảnh mỏng mà phép mở không thể bảo toàn. Hữu ích để trích xuất các đặc trưng tiền cảnh nhỏ khi những đặc trưng đó là thứ ứng dụng quan tâm, thay vì loại bỏ chúng.
black_hat() trả về sự khác biệt giữa phiên bản đã đóng của ảnh và ảnh gốc -- các điểm ảnh nền mà close sẽ đã lấp đầy. Đó là một mặt nạ của các lỗ nhỏ bên trong các vùng tiền cảnh, các khoảng hở hẹp giữa các vùng mà phép đóng sẽ đã bắc cầu.
Cả hai đều ít được dùng hơn bốn phép toán cơ bản, nhưng mẫu đáng nhớ -- khi một ứng dụng cần trích xuất các đặc trưng nhỏ hoặc mỏng mà lượt làm sạch tiêu chuẩn loại bỏ, top-hat và black-hat là cách tự nhiên để lấy lại chúng.
5.15.3. Chế độ ngưỡng¶
Bốn phép toán hình thái học cơ bản đều chấp nhận từ khóa nguyên threshold để làm mềm phép kiểm tra bật/tắt tại mỗi vị trí. Không có nó, các phép toán hoạt động theo cách các mô tả trên đã nói: erode() yêu cầu mọi điểm lân cận phải bật, dilate() yêu cầu ít nhất một. Với threshold được đặt, mỗi phép toán chấp nhận rằng nhiều điểm lân cận đó bầu theo cách khác. Đối với erode, threshold là số điểm lân cận nền một điểm ảnh có thể có và vẫn tồn tại: threshold=4 giữ bất kỳ điểm ảnh nào có ít nhất bốn trong tám điểm lân cận bật (trong cửa sổ 3x3, điểm ảnh trung tâm có tám điểm lân cận), vì vậy nó không erode mạnh như vậy. Đối với dilate, threshold là số điểm lân cận tiền cảnh mà một điểm ảnh nền phải có nhiều hơn trước khi bật: threshold=2 yêu cầu ít nhất ba điểm lân cận tiền cảnh thay vì một, vì vậy nó phát triển ít mạnh hơn.
Dạng ngưỡng hữu ích để điều chỉnh mức độ mạnh của một lượt hình thái học mà không thay đổi kích thước cửa sổ của nó, điều này cũng sẽ thay đổi tỷ lệ của các đặc trưng mà nó tác động lên. Hầu hết các ứng dụng giữ hành vi mặc định; dạng ngưỡng ở đó cho các trường hợp mà mặc định hơi quá nhiều hoặc quá ít.