2016-03-28 3 views
1

У меня есть изображение, которое я применяю Gaussian Blur для использования как библиотек cv2.GaussianBlur, так и skimage.gaussian_filter, но я получаю значительно разные результаты. Мне любопытно, почему, и что можно сделать, чтобы сделать skimage больше похож на cv2. Я знаю, skimage.gaussian_filter - обертка вокруг scipy.scipy.ndimage.filters.gaussian_filter. Чтобы четко сформулировать вопрос, почему две функции различны и что можно сделать, чтобы сделать их более похожими?Почему Gaussian Filter отличается между cv2 и skimage?

Вот мое тестовое изображение:

Original Image

Вот cv2 версия (появляется размывание):

cv2 image

Вот версия skimage/scipy (кажется резче):

skimage version

Детали:

skimage_response = skimage.filters.gaussian_filter(im, 2, multichannel=True, mode='reflect')

cv2_response = cv2.GaussianBlur(im, (33, 33), 2)

Так сигма = 2, и размер фильтра достаточно велик, что он не должен делать различие. Imagemagick covnert -gaussian-blur 0x2 визуально соглашается с cv2.

Версия: cv2 = 2.4.10, skimage = 0.11.3, scipy = 0.13.3

ответ

1

Для GaussianBlur, вы используете довольно большое ядро ​​(размер = 33), что вызывает много сглаживания. Сглаживание будет зависеть от вашего размера ядра. С вашими параметрами каждое новое значение пикселя «усредняется» в 33 * 33-пиксельном «окне».

Определение cv2.GaussianBlur можно найти здесь http://docs.opencv.org/3.1.0/d4/d13/tutorial_py_filtering.html#gsc.tab=0

В отличие от этого, skimage.filters.gaussian, кажется, работает на меньшем ядре. В skimage, «размер» определяется сигмы, которая связана ядра размером, как описано здесь: https://en.wikipedia.org/wiki/Gaussian_filter

Определение можно найти здесь: http://scikit-image.org/docs/dev/api/skimage.filters.html#skimage.filters.gaussian

Для того, чтобы получить соответствующие результаты, вы должны были бы работать с меньшим ядром для OpenCV.

Кроме того, для обеих библиотек я настоятельно рекомендую использовать современные версии библиотек.

+0

Сумма сглаживания контролируется сигмой, а не размером. Пиксели не имеют прямого усреднения, они взвешиваются усредненным гауссовым ядром. Размер просто обрезает вычисления и skimage вычисляет размер, который составляет 4 * сигма. Варианты не должны быть проблемой. Это старая и базовая функциональность. – waldol1

+0

Насколько я могу прочитать здесь, вы используете устаревший funtion gaussian_filter http://scikit-image.org/docs/dev/api/skimage.filters.html#skimage.filters.gaussian_filter, но вы правы, что это является базовой функциональностью. Вы также верно, что сигма коррелирует с размером ядра. Однако я не понимаю, почему сига из 2, которую вы используете в scikit, должна быть эквивалентна размеру ядра 33 в OpenCV. – tfv

+0

Я не математик, но способ, которым я читал https://en.wikipedia.org/wiki/Gaussian_filter, [quote] «Гауссовское ядро ​​требует значений 6 {\ sigma} -1, например, для {\ sigma} 3 ему требуется ядро ​​длиной 17 ". Это означало бы, что ваш sima = 2 эквивалентен ядру размером 6 * 2-1 = 11. Извините, я не эксперт по этому вопросу, но вы можете просмотреть свои предположения о размерах. – tfv

0

Если кому-то интересно, как сделать skimage.gaussian_filter() соответствие эквивалента Matlab imgaussfilt() (причина, по которой я нашел этот вопрос), передать параметр 'truncate = 2' в skimage.gaussian_filter(). Как skimage, так и Matlab вычисляют размер ядра как функцию сигмы. По умолчанию Matlab - 2. Значение по умолчанию Skimage равно 4, что приводит к значительному увеличению ядра по умолчанию.

+0

Полезно знать, но на самом деле это не ответ. Иногда я злоупотребляю сайтом, размещающим комментарий в качестве ответа, потому что текст не подходит для комментария или потому, что комментарий включает код, а система комментариев не обрабатывает более длинные фрагменты кода, но я думаю, что ваш текст соответствует комментарию. –

 Смежные вопросы

  • Нет связанных вопросов^_^