Я знаю, что важно применить размытие по Гауссу к изображению, прежде чем использовать Canny для обнаружения краев. Мой вопрос: cv2.Canny()
делает размытие по Гауссу само по себе или необходимо применять cv2.GaussianBlur()
перед cv2.Canny()
? Документация не ясна в этом вопросе.
Выполняет ли cv2.Canny() размытие по Гауссу?
Ответы (2)
Напомним, что использование OpenCV в Python на самом деле является оболочкой интерфейса OpenCV C++. Файл реализации алгоритма обнаружения границ Canny на C++ можно найти здесь: https://github.com/opencv/opencv/blob/master/modules/imgproc/src/canny.cpp
Если вы изучите этот источник, вы увидите, что на изображении нет никакого размытия. Однако благодаря поправке, сделанной Ивом Даустом (см. ниже), для нахождения градиента используется алгоритм обнаружения края Собеля. Существует входной параметр aperture
, который определяет размер ядра Sobel. Использование по умолчанию означает, что вы используете ядро 3 x 3, и размытие не применяется. Однако все, что выше 3 x 3, будет использовать ядро Гаусса. Поэтому, если вы хотите использовать ядро Sobel по умолчанию, вам нужно будет применить размытие самостоятельно. Если вы меняете размер ядра Sobel, вам не нужно выполнять размытие самостоятельно.
Фактически, в официальном руководстве по OpenCV, где демонстрируется использование Canny, изображение размывается вручную перед обнаружением: https://docs.opencv.org/3.4/da/d5c/tutorial_canny_detector.html. Тем не менее, они используют блочный фильтр 3 x 3 здесь до алгоритма, поскольку вы используете ядро 3 x 3 Sobel.
tl;dr
- Вам необходимо самостоятельно размыть изображение перед использованием алгоритма обнаружения краев Canny, если вы решите использовать апертуру по умолчанию / размер ядра Sobel. Если вы выберете больше 3, вам не нужно размывать изображение.
Аргумент aperture
функции Canny
управляет размером фильтра Собеля (от 1 до 7?), который фактически применяет фильтр нижних частот перед получением производной. К сожалению, в документации нет подробного описания этого фильтра нижних частот, хотя упоминается фильтр Гаусса.
Бьюсь об заклад, что на самом деле используется биномиальный фильтр (который является близким приближением к гауссову).