Выполняет ли cv2.Canny() размытие по Гауссу?

Я знаю, что важно применить размытие по Гауссу к изображению, прежде чем использовать Canny для обнаружения краев. Мой вопрос: cv2.Canny() делает размытие по Гауссу само по себе или необходимо применять cv2.GaussianBlur() перед cv2.Canny()? Документация не ясна в этом вопросе.


person DLopezG    schedule 23.08.2020    source источник


Ответы (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, вам не нужно размывать изображение.

person rayryeng    schedule 25.08.2020
comment
... что немного грустно, потому что Кэнни показал в своей основополагающей статье, что градиенты по Гауссу являются лучшим выбором для вычисления производных, но большинство реализаций либо используют размытие по Гауссу и фильтры Собеля, либо вообще пропускают размытие по Гауссу. OpenCV всегда ставит скорость выше точности или даже правильности. - person Cris Luengo; 25.08.2020
comment
Этот учебник довольно вводит в заблуждение. Он поддерживает ядро ​​Гаусса 5x5, хотя в коде используется блочный фильтр 3x3 и вызывается Canny с апертурой 3x3! - person Yves Daoust; 26.08.2020
comment
@YvesDaoust Спасибо за подсказку о документации. Если вы выберете ядро ​​​​Собеля 3 x 3 в Canny, оно не выполняет сглаживание по Гауссу, поэтому теперь мне понятно, почему они предварительно сглаживают вручную. ... однако им определенно следует использовать ядро ​​Гаусса. Эти документы необходимо обновить. - person rayryeng; 26.08.2020
comment
@rayryeng: между размытием по Гауссу и размытием в Собеле очень мало различий. - person Yves Daoust; 26.08.2020
comment
@ Ив, есть большая разница между гауссианом и размытием в Собеле. Ядро Собеля использует треугольное ядро ​​с тремя вкладками в ориентации, перпендикулярной производной, и без размытия в направлении производной. Я не знаю, кто придумал более крупные расширения ядра Sobel и как они устроены. Но это не ядра Собеля, Собел описал ядро ​​3x3, не назначайте этому человеку другие случайные вещи! - person Cris Luengo; 26.08.2020
comment
Это напомнило мне о предыдущем обсуждении. Вот что я думаю об этих расширениях ядра Sobel: stackoverflow.com/a/50313678/7328782 знаете, как их определяет OpenCV, документы не говорят). - person Cris Luengo; 26.08.2020
comment
@CrisLuengo: мы говорим о реализации Собеля в OpenCV. Кстати, наличие фильтра нижних частот лучше, чем ничего, а идеальная гауссиана не обязательна. - person Yves Daoust; 26.08.2020

Аргумент aperture функции Canny управляет размером фильтра Собеля (от 1 до 7?), который фактически применяет фильтр нижних частот перед получением производной. К сожалению, в документации нет подробного описания этого фильтра нижних частот, хотя упоминается фильтр Гаусса.

Бьюсь об заклад, что на самом деле используется биномиальный фильтр (который является близким приближением к гауссову).

person Yves Daoust    schedule 26.08.2020