Canny Edge Detection
Phát hiện biên Canny là thuật toán nhiều giai đoạn giúp giảm nhiễu, phát hiện những thay đổi độ sáng đột ngột và tạo bản đồ biên mảnh cho thị giác máy tính.
Phát hiện biên Canny là thuật toán xử lý ảnh nhiều giai đoạn, xác định những thay đổi độ sáng đột ngột rồi chuyển chúng thành bản đồ biên nhị phân mảnh. Thuật toán giảm nhiễu, định vị các điểm chuyển tiếp cường độ và liên kết những pixel biên đáng tin cậy thành các đường bao. Trong thị giác máy tính, các đường bao này mô tả cấu trúc ảnh để phân tích hình dạng và đo lường.
John Canny phát triển phương pháp này vào năm 1983 và trình bày trong bài báo năm 1986, Phương pháp tính toán để phát hiện biên. Thiết kế của phương pháp cân bằng ba mục tiêu: phát hiện biên thực, định vị biên chính xác và tạo một phản hồi cho mỗi biên. "Bộ phát hiện biên Canny" là tên gọi khác của thuật toán.
Cách hoạt động của phát hiện biên Canny#
Thuật toán kết hợp tiền xử lý dữ liệu với lọc và phân tích tính liên thông. Năm giai đoạn của thuật toán đảm nhiệm các chức năng riêng:
- Giảm nhiễu: Làm trơn Gaussian lấy trung bình các pixel lân cận với trọng số phụ thuộc vào khoảng cách, nhờ đó triệt tiêu những dao động có thể tạo ra biên không mong muốn.
- Ước lượng gradient: Đạo hàm theo chiều ngang và chiều dọc đo tốc độ thay đổi độ sáng. Kết hợp hai đạo hàm cho biết độ mạnh của biên và hướng vuông góc với ranh giới. OpenCV dùng đạo hàm Sobel ở giai đoạn này.
- Làm mảnh biên: Khử cực đại cục bộ chỉ giữ lại các đỉnh gradient theo hướng gradient, tạo ra các đường gờ hẹp thay vì các dải rộng.
- Ngưỡng kép: Ngưỡng cao xác định biên mạnh; ngưỡng thấp loại bỏ các phản hồi yếu. Pixel nằm giữa hai ngưỡng được xem là ứng viên.
- Liên kết bằng hysteresis: Pixel ứng viên được giữ lại nếu nối với một biên mạnh thông qua các pixel ứng viên khác. Các pixel ứng viên cô lập sẽ bị loại bỏ.
Ngưỡng, làm mượt và các chế độ lỗi#
Các ngưỡng tác động lên độ mạnh của gradient, thay vì độ sáng thô hoặc độ tin cậy của model. Giảm ngưỡng sẽ giữ lại nhiều chi tiết và nhiễu hơn; tăng ngưỡng sẽ loại bỏ các đường biên yếu. Tăng ngưỡng cao cũng làm giảm số điểm biên mạnh có thể dùng để liên kết bằng thuật toán trễ.
Mức độ làm mượt Gaussian kiểm soát một sự đánh đổi riêng. Làm mượt nhiều hơn sẽ khử nhiễu nhưng loại bỏ các cấu trúc nhỏ. Trong ví dụ hình vuông nhiễu của scikit-image, thay đổi độ lệch chuẩn Gaussian sẽ làm thay đổi lượng nhiễu còn sót lại quanh hình vuông.
Trong kiểm tra vết nứt, bề mặt bê tông gồ ghề tạo ra các cạnh kết cấu không mong muốn và đường viền vết nứt không liền mạch. Tăng ngưỡng sẽ loại bỏ một số cạnh giả, đồng thời làm mất các đoạn vết nứt thực sự.
Sobel ước tính các đạo hàm cường độ; Canny kết hợp ước tính gradient với làm mượt, làm mảnh và lựa chọn dựa trên tính liên thông. Giai đoạn làm mảnh của Canny so sánh các pixel lân cận, trong khi NMS trong phát hiện đối tượng so sánh các hộp dự đoán chồng lấp.
Phát hiện cạnh Canny bằng Python#
Cài đặt các dependency bằng pip install opencv-python numpy. Ví dụ này dùng OpenCV để lưu bản đồ cạnh của ảnh mẫu xe buýt:
from urllib.request import urlopen
import cv2
import numpy as np
with urlopen("https://ultralytics.com/images/bus.jpg") as response:
encoded = np.frombuffer(response.read(), dtype=np.uint8)
gray = cv2.imdecode(encoded, cv2.IMREAD_GRAYSCALE)
# Làm mượt ảnh trước khi tính các gradient cường độ.
smoothed = cv2.GaussianBlur(gray, (5, 5), 1.4)
edges = cv2.Canny(smoothed, 50, 150, L2gradient=True)
cv2.imwrite("canny_edges.png", edges)PNG đã lưu hiển thị các cạnh được giữ lại bằng màu trắng trên nền đen. Trong quy trình phát hiện cạnh của OpenCV, đối số thứ hai và thứ ba của Canny xác định ngưỡng thấp và ngưỡng cao. L2gradient=True sử dụng độ lớn gradient Euclid; mặc định sử dụng tổng các đạo hàm ngang và dọc lấy giá trị tuyệt đối. Các lựa chọn này làm thay đổi giá trị gradient và do đó ảnh hưởng đến cách hoạt động của ngưỡng.
Ứng dụng và các tác vụ thị giác liên quan#
Canny hỗ trợ trích xuất đặc trưng hình học: ví dụ phát hiện đường thẳng của scikit-image áp dụng phương pháp này lên ảnh chụp người quay phim, sau đó biến đổi Hough xác suất trích xuất các đoạn thẳng. Canny cung cấp các pixel cạnh; phép bỏ phiếu Hough nhóm chúng thành các đường thẳng. Phát hiện đối tượng gán danh mục và hộp, trong khi phân đoạn đối tượng gán pixel cho từng đối tượng.
Phân đoạn của YOLO26 từ Ultralytics trả về các mask để tách riêng đối tượng, qua đó có thể chọn các vùng ảnh để xử lý Canny riêng. Phương pháp này kết hợp lựa chọn đối tượng bằng mô hình học được với trích xuất đường biên cổ điển.
Trong AI tạo sinh, ControlNet sử dụng bản đồ Canny làm điều kiện không gian cho model khuếch tán. Triển khai có điều kiện Canny hướng dẫn quá trình tạo ảnh bằng Stable Diffusion 1.5, sử dụng các đường nét trích xuất cùng với prompt văn bản.










