Разница между filter2d() с гауссовским ядром и GaussianBlur()

Я неофит opencv. Я должен выполнить операции для проекта, включающего использование двухмерного низкочастотного фильтра Гаусса. Используемый мной OpenCV версии 2.2 и внутри есть две функции: filter2d() и GaussianBlur().

Выполнять ту же работу? Позвольте мне объяснить, если filter2d () перейдет к гауссовскому ядру getGaussiankernel, созданному с помощью (), применит фильтр и запустит его непосредственно с помощью GaussianBlur (), у меня будет тот же результат? Очевидно, что я приму одинаковые значения для двух функций ядра.


person Antonio Inglese    schedule 26.01.2012    source источник
comment
Попробуйте и посмотрите - выполните обе операции и сохраните в два разных файла, посмотрите, идентичны ли файлы.   -  person Mark Ransom    schedule 26.01.2012
comment
нет, не дают того же результата. Так что на данный момент неправильно применять гауссово размытие (src, dst, cvSixe (5.5), 1,1), чтобы получить 2D-фильтр Гаусса с фильтром размера 5? или правильно применить один раз gaussianblur (src, dst, cvSixe (5.5), 1) и после gaussianblur (dst, dst2, cvSixe (5.5), NULL, 1)?   -  person Antonio Inglese    schedule 26.01.2012
comment
Боюсь, я не знаком с работой OpenCV, поэтому не могу ответить на ваши дополнительные вопросы, извините.   -  person Mark Ransom    schedule 26.01.2012
comment
Теоретически фильтр Гаусса можно разделить, затем применить сначала в направлении x, а затем в направлении y применить весь 2D-фильтр.   -  person Antonio Inglese    schedule 26.01.2012


Ответы (2)


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

person Sam    schedule 29.01.2012
comment
Большое спасибо, но при применении filter2D() и Gaussianblur() не возвращаются одинаковые результаты. Есть много, но незначительные различия. - person Antonio Inglese; 30.01.2012

Разница, которую вы могли заметить, заключается в том, что filter2D выполняет взаимную корреляцию вместо операции свертки. X-корреляция и свертка дают одинаковые результаты при использовании симметричных ядер/фильтров. Чтобы выполнить свертку с использованием ядра, вам нужно перевернуть его и установить точку привязки в середине ядра. См. документацию: http://opencv.willowgarage.com/documentation/cpp/image_filtering.html#cv-filter2d

Я не уверен, что отсюда возникают различия, но мне нужно было использовать свертку в моем приложении, и именно так я ее реализовал, и она работала, как и ожидалось.

person greven    schedule 26.01.2012
comment
чтобы применить 2D-фильтр, я должен использовать двойное применение GaussianBlur, как указано выше? - person Antonio Inglese; 27.01.2012
comment
В OpenCV есть собственная реализация GaussianBlur, почему бы вам просто не использовать ее? :) Вот этот: opencv.willowgarage.com/documentation/cpp/< /а> - person greven; 27.01.2012
comment
Я не уверен, что применение его таким образом даст мне правильный результат... я просто применяю GaussianBlur - person Antonio Inglese; 27.01.2012