Как мне показать ядро ​​Гаусса для 2d? (opencv)

Я использую это:

 blur = cv2.GaussianBlur(dst,(5,5),0)

И я хотел показать матрицу ядра следующим образом:

print(cv2.getGaussianKernel(ksize=(5,5),sigma=0))

Но я получаю ошибку типа:

TypeError: an integer is required (got type tuple)

Если я поставлю только 5, то получу матрицу 5х1. Разве ядро ​​блюра не 5х5? Или я упускаю что-то фундаментальное?


person Gargameli    schedule 23.04.2020    source источник


Ответы (1)


Ядро Гаусса сепарабельно. Следовательно, сгенерированное ядро ​​является 1D. Функция GaussianBlur применяет это одномерное ядро ​​по очереди к каждому измерению изображения. Свойство разделимости означает, что этот процесс дает точно такой же результат, как и применение 2D-свертки (или 3D в случае 3D-изображения). Но объем работы сильно сокращается. Для вашего ядра 5x5 2D-свертка выполняет 25 умножений и сложений, разделяемая реализация выполняет только 5+5=10. Для более крупных ядер выигрыш становится все более значительным.

Чтобы увидеть полное 2D-ядро, примените функцию GaussianBlur к изображению, состоящему из нулей и имеющему один пиксель в середине со значением 1. Это дискретный эквивалент дельта-функции Дирака, которую мы можем использовать для анализа линейного времени. инвариантные функции (== сверточные фильтры).

person Cris Luengo    schedule 23.04.2020
comment
@sandesh: это хорошее дополнение, но, пожалуйста, опубликуйте его как свой собственный ответ. Вы можете редактировать чужой код для исправления опечаток, неработающих ссылок и т. д., но не для добавления новых вещей в ответ. Кроме того, если вы опубликуете свой собственный ответ, вы можете получить бесплатные интернет-очки! :) Вы можете вернуть свой отредактированный текст, перейдя в режим «временной шкалы» (маленькая кнопка слева от ответа). - person Cris Luengo; 23.10.2020