Canny Edge Detection
Детектор границ Канни — многоэтапный алгоритм, который снижает шум, обнаруживает резкие изменения яркости и создает тонкие карты границ для компьютерного зрения.
Детектор границ Канни — это многоэтапный алгоритм обработки изображений, который обнаруживает резкие изменения яркости и преобразует их в тонкую бинарную карту границ. Он снижает шум, находит переходы интенсивности и соединяет надежные пиксели границ в контуры. В компьютерном зрении эти контуры описывают структуру изображения для анализа формы и измерений.
Джон Канни разработал этот метод в 1983 году и описал его в статье 1986 года «Вычислительный подход к обнаружению границ». При разработке метода учитывались три цели: обнаруживать реальные границы, точно определять их расположение и получать один отклик на каждую границу. «Детектор границ Канни» — синоним названия алгоритма.
Как работает детектор границ Канни#
Алгоритм объединяет предварительную обработку данных, фильтрацию и анализ связности. Каждый из пяти этапов выполняет свою задачу:
- Снижение шума: Гауссово сглаживание усредняет значения соседних пикселей с весами, зависящими от расстояния, подавляя колебания, которые могли бы создать нежелательные границы.
- Оценка градиента: Горизонтальные и вертикальные производные измеряют скорость изменения яркости. Вместе они задают силу границы и направление, перпендикулярное ей. На этом этапе OpenCV использует производные Собеля.
- Утончение границ: Подавление немаксимумов сохраняет локальные пики градиента вдоль его направления, формируя узкие гребни вместо широких полос.
- Двойная пороговая обработка: Высокий порог выделяет сильные границы, а низкий отсекает слабые отклики. Пиксели между порогами становятся кандидатами.
- Связывание по гистерезису: Пиксели-кандидаты сохраняются, если соединены с сильной границей через другие пиксели-кандидаты. Изолированные кандидаты удаляются.
Пороговые значения, сглаживание и типичные сбои#
Пороговые значения применяются к силе градиента, а не к исходной яркости или уверенности модели. При снижении порогов сохраняется больше деталей и шума; при повышении — слабые границы удаляются. Повышение верхнего порога также уменьшает число сильных граничных пикселей, доступных для связывания методом гистерезиса.
Масштаб гауссова сглаживания задаёт отдельный компромисс. Более сильное сглаживание подавляет шум, но удаляет мелкие структуры. В примере scikit-image с зашумлённым квадратом изменение стандартного отклонения гауссова распределения влияет на то, сколько шума остаётся вокруг квадрата.
При проверке трещин на шероховатых бетонных поверхностях появляются нежелательные текстурные границы и неполные контуры трещин. Повышение порогов удаляет часть ложных границ, но при этом теряются и реальные участки трещин.
Оператор Sobel оценивает производные интенсивности; Canny объединяет оценку градиента со сглаживанием, прореживанием и отбором на основе связности. На этапе прореживания Canny сравнивает соседние пиксели, а NMS для обнаружения объектов сравнивает перекрывающиеся предсказанные рамки.
Детекция границ методом Canny на 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)
gray = cv2.imdecode(encoded, cv2.IMREAD_GRAYSCALE)
# Сгладь изображение перед вычислением градиентов интенсивности.
smoothed = cv2.GaussianBlur(gray, (5, 5), 1.4)
edges = cv2.Canny(smoothed, 50, 150, L2gradient=True)
cv2.imwrite("canny_edges.png", edges)На сохранённом PNG оставшиеся границы отображаются белым на чёрном фоне. В рабочем процессе обнаружения границ в OpenCV второй и третий аргументы Canny задают нижний и верхний пороги. L2gradient=True использует евклидову величину градиента; по умолчанию используется сумма абсолютных значений горизонтальной и вертикальной производных. Эти варианты меняют значения градиента и, следовательно, поведение порогов.
Применение и смежные задачи компьютерного зрения#
Canny подходит для геометрического извлечения признаков: в примере обнаружения линий из scikit-image метод применяется к фотографии оператора, после чего вероятностное преобразование Хафа извлекает прямые отрезки. Canny определяет граничные пиксели; голосование Хафа объединяет их в линии. Обнаружение объектов присваивает объектам категории и рамки, а сегментация экземпляров относит пиксели к отдельным объектам.
Сегментация в Ultralytics YOLO26 возвращает маски для выделения объектов, с помощью которых можно выбирать области изображения для отдельной обработки методом Canny. Так обученный выбор объектов сочетается с классическим выделением границ.
В генеративном ИИ ControlNet использует карты Canny как пространственные условия для диффузионных моделей. Его реализация с условием Canny направляет генерацию в Stable Diffusion 1.5, используя извлечённые контуры вместе с текстовым запросом.










