5.14. Làm mịn Gaussian và phát hiện cạnh¶
Hai công việc thống trị cách sử dụng cửa sổ lân cận trong thị giác máy cổ điển: làm mịn sự biến đổi điểm ảnh theo từng điểm một cách sạch sẽ, và tìm các cạnh nơi ảnh thay đổi đột ngột. Bộ lọc Gaussian là công cụ chuẩn cho công việc đầu tiên, các bộ phát hiện dựa trên Laplacian là công cụ chuẩn cho công việc thứ hai -- và cả hai kết hợp tốt với nhau, vì mọi bộ phát hiện cạnh đều hoạt động tốt hơn trên đầu vào được làm mịn nhẹ.
5.14.1. Bộ lọc Gaussian¶
gaussian() là người anh em có trọng số trung tâm của mean(). Cả hai đều tính trung bình trên lân cận của mỗi điểm ảnh, nhưng trọng số của Gaussian không đồng đều: các điểm ảnh gần tâm lân cận được tính nhiều hơn, các điểm ảnh ở rìa lân cận được tính ít hơn, với trọng số tuân theo đường cong hình chuông quen thuộc đặt tên cho bộ lọc.
Trọng số hình chuông là điều làm cho bộ lọc Gaussian mịn hơn trung bình hộp. Bộ lọc trung bình có thể tạo ra các hiện tượng nhìn thấy được ở rìa của các vật thể -- một ngưỡng cắt cứng trong trọng số tạo ra các mẫu dao động nhỏ ở các chuyển tiếp sắc nét. Trọng số giảm dần mượt mà của Gaussian tránh được dao động đó và tạo ra kết quả trông gần hơn với "mờ" thực sự. Chi phí là nhiều tính toán trên mỗi điểm ảnh hơn bộ lọc trung bình, nhưng không đáng kể -- chi phí trên mỗi điểm ảnh vẫn thấp hơn nhiều so với bộ lọc song phương.
img.gaussian(1) # 3x3 Gaussian -- a clean light blur
img.gaussian(2) # 5x5 Gaussian -- stronger smoothing
Làm mịn Gaussian là giai đoạn đầu tiên chuẩn của hầu hết mọi pipeline phát hiện cạnh. Các bộ phát hiện cạnh bên dưới đều khuếch đại nội dung tần số cao, bao gồm cả nhiễu cảm biến mà thuật toán thực ra không muốn phát hiện. Chạy một lần Gaussian nhẹ trước để loại bỏ nhiễu đó mà không làm mềm các cạnh thực sự nhiều, để bộ phát hiện cạnh tìm thấy các cạnh thực sự thay vì nhiễu hạt.
5.14.2. Mặt nạ unsharp¶
Bản sao bị làm mờ Gaussian của ảnh là nguyên liệu thô mà kỹ thuật mặt nạ unsharp sử dụng để làm sắc nét cổ điển. Đặt unsharp=True trên bộ lọc chuyển đổi nó từ "tạo ra ảnh bị làm mờ" sang "trừ ảnh bị làm mờ khỏi bản gốc và cộng sự khác biệt trở lại vào bản gốc" -- hiệu ứng là các cạnh tần số cao được khuếch đại so với các vùng nội thất mịn.
img.gaussian(1, unsharp=True)
Các tham số tùy chọn mul và add điều chỉnh cường độ kết quả unsharp; các giá trị mặc định (mul=1.0, add=0.0) là làm sắc nét vừa phải không làm phóng đại nhiễu cảm biến.
5.14.3. Bộ lọc Laplacian¶
laplacian() chạy một xấp xỉ rời rạc của đạo hàm không gian bậc hai của ảnh. Đầu ra lớn ở nơi các giá trị điểm ảnh thay đổi nhanh chóng, gần không ở nơi chúng hằng số hoặc thay đổi tuyến tính. Cách đọc tự nhiên của kết quả là phản hồi cạnh: các điểm ảnh nơi ảnh thay đổi nhanh sáng lên, các điểm ảnh trong vùng nội thất mịn vẫn tối.
img.laplacian(1) # 3x3 Laplacian -- edge response
Có các tham số tương tự như gaussian. sharpen=True tạo ra ảnh được làm sắc nét (Laplacian cộng trở lại vào bản gốc thay vì trả về riêng lẻ). mul và add điều chỉnh phản hồi.
Một ứng dụng thực tế ngoài phát hiện cạnh là đo độ hội tụ. Phản hồi Laplacian trung bình trên một vùng cho thấy một ước tính thô về lượng nội dung tần số cao mà vùng đó chứa; trên một khung hình được hội tụ tốt, trung bình đó cao, trên một khung hình bị mờ, nó giảm xuống. So sánh phản hồi Laplacian qua các khung hình là cách rẻ tiền để hỏi "ống kính có đang hội tụ không?" mà không cần một chỉ số tương phản đắt hơn.
5.14.4. Phương thức find_edges¶
find_edges() chạy một pipeline phát hiện cạnh hoàn chỉnh thay vì chỉ là một bộ lọc phản hồi cạnh. Nó hoạt động trên ảnh thang xám, và kết quả là một ảnh nhị phân có các điểm ảnh khác không đánh dấu các vị trí mà đầu vào có loại thay đổi độ sáng đáng được coi là một cạnh.
Phương thức nhận tham số edge_type để chọn giữa hai thuật toán:
EDGE_SIMPLE chạy bộ lọc thông cao, áp dụng ngưỡng, và trả về kết quả. Nhanh, nhưng đầu ra bao gồm mọi thay đổi độ sáng trên ngưỡng, bao gồm cả nhiễu và kết cấu mà ứng dụng có lẽ không quan tâm. Hợp lý cho các ảnh sạch và cho các trường hợp nhiễu sẽ được làm sạch bằng một lần xử lý hình thái học sau.
EDGE_CANNY chạy bộ phát hiện cạnh Canny -- thuật toán đa giai đoạn cổ điển. Nó tính gradient độ sáng, loại bỏ mọi phản hồi không cực đại theo hướng gradient (vì vậy mỗi cạnh rộng một điểm ảnh), và áp dụng ngưỡng trễ (vì vậy một cạnh mạnh ở một chỗ được truy tìm ngay cả khi nó mờ dần ở những chỗ khác). Kết quả là một tập hợp sạch, mỏng, liên kết của các điểm ảnh cạnh mà mọi thuật toán dựa trên cạnh cổ điển đều cần.
Tham số threshold là một tuple hai phần tử (low, high). Với EDGE_CANNY, giá trị high là ngưỡng cắt trên đó một điểm ảnh chắc chắn là cạnh, và giá trị low là ngưỡng cắt trên đó một điểm ảnh là cạnh chỉ khi nó được kết nối với một điểm ảnh chắc chắn. Với EDGE_SIMPLE, chỉ giá trị high có tác dụng; đó là ngưỡng cắt duy nhất trên đó một điểm ảnh được tính là cạnh. Mặc định (100, 200) là điểm khởi đầu đáng để điều chỉnh cho cảnh cụ thể.
img.gaussian(1) # pre-smooth
img.find_edges(image.EDGE_CANNY, threshold=(50, 100))
Bộ phát hiện Canny là lựa chọn tốt hơn cho hầu hết mọi ứng dụng nơi các cạnh quan trọng. EDGE_SIMPLE nhanh hơn đáng nhớ cho các trường hợp khi chi phí của Canny là vấn đề và khả năng loại bỏ nhiễu của ngưỡng trễ thực sự không cần thiết.
5.14.5. Ngưỡng thích ứng trên Gaussian¶
Giống như các bộ lọc thống kê, gaussian() chấp nhận cặp từ khóa threshold=True / offset=N cho ngưỡng thích ứng. Hành vi giống như với mean(): thống kê Gaussian tại mỗi vị trí trở thành ngưỡng cắt cục bộ, và điểm ảnh nguồn được so sánh với thống kê cộng với phần bù để tạo ra kết quả nhị phân.
Biến thể Gaussian thường là lựa chọn sạch nhất cho ngưỡng thích ứng khi đầu vào tương đối không có nhiễu. Trung bình có trọng số cho ngưỡng cắt mượt mà hơn so với bộ lọc trung bình tạo ra, với ít hiện tượng hơn ở các chuyển tiếp chiếu sáng sắc nét.