Hough Transform
Biến đổi Hough là kỹ thuật thị giác máy tính dựa trên cơ chế bỏ phiếu, giúp phát hiện đường thẳng, đường tròn và hình dạng, kể cả khi có khoảng đứt đoạn hoặc cạnh ảnh nhiễu.
Biến đổi Hough là kỹ thuật trích xuất đặc trưng hình học, phát hiện đường thẳng, đường tròn và các hình dạng tham số hóa khác bằng cách để các điểm ảnh bỏ phiếu cho những hình dạng có thể có. Các điểm thuộc cùng một cấu trúc củng cố lẫn nhau, tạo thành đỉnh nổi bật trong bảng bỏ phiếu. Trong thị giác máy tính, kỹ thuật này giúp khôi phục hình dạng có khoảng đứt đoạn hoặc đường biên nhiễu.
Paul V. C. Hough giới thiệu kỹ thuật này vào năm 1959 trong Machine Analysis of Bubble Chamber Pictures, nhằm xử lý các vệt hạt trong ảnh chụp vật lý. Richard Duda và Peter Hart giới thiệu cách biểu diễn góc–khoảng cách được sử dụng rộng rãi trong bài báo phát hiện đường thẳng và đường cong năm 1972 của họ.
Cách thức bỏ phiếu Hough hoạt động#
Quy trình điển hình bắt đầu bằng tiền xử lý dữ liệu và phát hiện cạnh. Bộ phát hiện cạnh xác định các thay đổi độ sáng cục bộ; biến đổi Hough nhóm các pixel cạnh thành cấu trúc hình học. Toán tử Sobel ước tính gradient độ sáng, còn Canny tạo bản đồ cạnh mảnh phù hợp cho việc bỏ phiếu tìm đường thẳng.
Mỗi đường thẳng ứng viên được biểu diễn bằng rho, khoảng cách vuông góc có dấu từ gốc tọa độ ảnh, và theta, góc của đường vuông góc đó so với trục x. Cách biểu diễn này xử lý được các đường thẳng đứng mà không cần độ dốc vô hạn. Mỗi pixel cạnh bỏ phiếu cho các cặp rho–theta tương thích trong bộ tích lũy, một bảng chia không gian tham số thành các ô rời rạc. Các pixel thẳng hàng đóng góp vào cùng một ô, ngay cả khi chúng nằm cách nhau trong ảnh. Các đỉnh cho biết những đường thẳng được nhiều điểm hỗ trợ.
Hình học và quy tắc bỏ phiếu quyết định đầu ra. Bộ phát hiện học sâu học các mẫu thị giác từ dữ liệu huấn luyện; phát hiện Hough sử dụng mô hình hình dạng được chọn và các ngưỡng số học thay vì trọng số model đã học.
Biến đổi đường thẳng, xác suất và đường tròn#
Ba cách triển khai phổ biến khác nhau về phương thức tìm kiếm và đầu ra:
- Biến đổi đường thẳng tiêu chuẩn:
cv2.HoughLines()trả về các cặp rho–theta mô tả đường thẳng vô hạn. Cần xử lý bổ sung để xác định hai đầu mút của đoạn thẳng. - Biến đổi đường thẳng xác suất:
cv2.HoughLinesP()giảm khối lượng tính toán bỏ phiếu bằng cách lấy mẫu điểm và trả về trực tiếp hai đầu mút của đoạn thẳng.minLineLengthloại bỏ các đoạn ngắn;maxLineGapkiểm soát khoảng cách tối đa giữa các đoạn thẳng hàng được phép nối với nhau. - Biến đổi đường tròn: Các ứng viên đường tròn cần có tâm và bán kính.
cv2.HoughCircles()sử dụng phương pháp dựa trên gradient, còn các giới hạn bán kính giúp thu hẹp phạm vi tìm kiếm. Đầu vào của hàm này là ảnh thang độ xám, trong khi các hàm đường thẳng nhận ảnh nhị phân.
Phát hiện đoạn thẳng trong Python#
Cài đặt các phần phụ thuộc bằng pip install opencv-python numpy. Ví dụ này dùng OpenCV để phát hiện và vẽ các đoạn thẳng trên ả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)
image = cv2.imdecode(encoded, cv2.IMREAD_COLOR)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Trích xuất cạnh để bỏ phiếu.
edges = cv2.Canny(gray, 50, 150)
# Phát hiện các đoạn thẳng hữu hạn được phiếu trong bộ tích lũy hỗ trợ.
lines = cv2.HoughLinesP(
edges,
1,
np.pi / 180,
threshold=80,
minLineLength=80,
maxLineGap=10,
)
if lines is not None:
for x1, y1, x2, y2 in lines[:, 0]:
cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imwrite("hough_segments.jpg", image)Ảnh đã lưu phủ các đoạn thẳng được trả về bằng màu đỏ. Các ô rho rộng một pixel, các ô theta trải dài một độ, còn threshold=80 đặt ngưỡng phiếu của bộ tích lũy. Các thiết lập về độ dài đoạn thẳng và khoảng đứt đoạn được tính bằng pixel.
Ứng dụng và giới hạn thực tế#
Trong xử lý tài liệu, việc trích xuất các đường lưới hỗ trợ phân tích cấu trúc: OpenCV minh họa khả năng phát hiện Hough trên ảnh Sudoku. Phương pháp bỏ phiếu hình tròn định vị tâm và bán kính đồng xu trong các ví dụ về đường tròn và elip của scikit-image. Các kết quả này mô tả hình học; phát hiện đối tượng bổ sung các danh mục ngữ nghĩa, còn phân đoạn instance gán pixel cho từng đối tượng riêng lẻ.
Một nguyên mẫu đo dầm thép kết hợp mask YOLOv8, cạnh Canny và đường thẳng Hough xác suất để hỗ trợ trích xuất góc. Phân đoạn bằng Ultralytics YOLO26 cung cấp mask cho tách riêng đối tượng, cho phép áp dụng cùng phương pháp đầu vào đã tạo mask trước khi xử lý hình học riêng biệt.
Các ô bộ tích lũy nhỏ hơn làm tăng mức sử dụng bộ nhớ; các ô thô hơn gộp những ứng viên ở gần nhau. Trong trích xuất đường biên bảng, đường viền không hoàn chỉnh làm giảm số đường biên có thể phát hiện, trong khi các đường không liên quan có thể dẫn đến hiệu chỉnh đường biên sai. Tăng maxLineGap sẽ nối các đoạn thẳng hàng có khoảng đứt lớn hơn; tăng minLineLength sẽ loại bỏ các đoạn ngắn hơn.










