Hough Transform
Преобразование Хафа — это основанный на голосовании метод компьютерного зрения, который обнаруживает линии, окружности и другие фигуры даже при разрывах или зашумлённых границах изображения.
Преобразование Хафа — это геометрический метод извлечения признаков, который обнаруживает линии, окружности и другие параметризованные фигуры, позволяя точкам изображения голосовать за возможные фигуры. Точки, принадлежащие одной структуре, усиливают голоса друг друга, создавая выраженный пик в таблице голосования. В компьютерном зрении это помогает восстанавливать фигуры с разрывами или зашумлёнными границами.
Пол В. К. Хаф представил этот метод в 1959 году в работе «Машинный анализ фотографий пузырьковой камеры», посвящённой следам частиц на физических снимках. Ричард Дуда и Питер Харт предложили широко используемое представление через угол и расстояние в своей работе 1972 года об обнаружении линий и кривых.
Как работает голосование Хафа#
Типичный рабочий процесс начинается с предобработки данных и обнаружения границ. Детектор границ выявляет локальные изменения яркости; преобразование Хафа группирует пиксели границ в геометрические структуры. Оператор Собеля оценивает градиенты яркости, а алгоритм Кэнни строит тонкую карту границ, подходящую для голосования за линии.
Каждая линия-кандидат представлена параметром rho — знаковым перпендикулярным расстоянием от начала координат изображения — и параметром theta — углом этого перпендикуляра относительно оси x. Такой способ позволяет работать с вертикальными линиями, не прибегая к бесконечному наклону. Каждый пиксель границы голосует за совместимые пары rho–theta в аккумуляторе — таблице, которая делит пространство параметров на дискретные ячейки. Коллинеарные пиксели попадают в одну ячейку, даже если на изображении они разделены. Пики указывают на линии, подтверждённые голосами.
Результат определяют геометрия и правила голосования. Детектор на основе глубокого обучения обучается распознавать визуальные закономерности на обучающих данных; обнаружение методом Хафа использует заданную модель фигуры и числовые пороги, а не обученные веса модели.
Стандартное, вероятностное и круговое преобразования#
Три распространённые реализации различаются способом поиска и результатом:
- Стандартное преобразование линий:
cv2.HoughLines()возвращает пары rho–theta, описывающие бесконечные линии. Чтобы получить конечные отрезки, нужна дополнительная обработка. - Вероятностное преобразование линий:
cv2.HoughLinesP()сокращает вычисления при голосовании за счёт выборки точек и сразу возвращает конечные отрезки.minLineLengthотбрасывает короткие отрезки;maxLineGapзадаёт максимальное расстояние между выровненными фрагментами, которые можно соединить. - Круговое преобразование: для кандидатов на окружности нужны центр и радиус.
cv2.HoughCircles()использует подход на основе градиентов, а ограничения на радиус сужают область поиска. На вход подаётся изображение в оттенках серого, тогда как функции для линий принимают бинарное изображение.
Обнаружение отрезков линий в Python#
Установи зависимости с помощью pip install opencv-python numpy. В этом примере используется OpenCV, чтобы обнаружить и нарисовать отрезки линий на тестовом изображении автобуса.
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)
# Извлеки границы для голосования.
edges = cv2.Canny(gray, 50, 150)
# Обнаружь конечные отрезки, подтверждённые голосами в аккумуляторе.
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)На сохранённом изображении возвращённые отрезки наложены красным цветом. Ширина ячеек rho составляет один пиксель, шаг ячеек theta — один градус, а threshold=80 задаёт порог голосования в аккумуляторе. Длины отрезков и разрывы измеряются в пикселях.
Применение и практические ограничения#
При обработке документов извлечение линий сетки помогает анализировать структуру: в OpenCV показано обнаружение линий методом Хафа на изображении судоку. Голосование по окружностям позволяет находить центры и радиусы монет, как показано в примерах с окружностями и эллипсами библиотеки scikit-image. Эти результаты описывают геометрию; обнаружение объектов добавляет семантические категории, а сегментация экземпляров относит пиксели к отдельным объектам.
В прототипе для измерения стальных балок маски YOLOv8, границы Кэнни и вероятностное преобразование Хафа используются для извлечения углов. Сегментация в Ultralytics YOLO26 создаёт маски для изоляции объектов, позволяя применять тот же подход с маскированным входом перед отдельной геометрической обработкой.
Мелкие ячейки аккумулятора увеличивают расход памяти; крупные объединяют близкие кандидаты. При извлечении границ таблиц неполные рамки мешают обнаруживать границы, а посторонние линии могут привести к их неправильной коррекции. Увеличение значения maxLineGap позволяет соединять более крупные разрывы между выровненными фрагментами; увеличение значения minLineLength удаляет более короткие отрезки.










