2016-03-28 833 views
1

我有一个图像,我应用高斯模糊使用cv2.GaussianBlurskimage.gaussian_filter库,但我得到明显不同的结果。我很好奇为什么,以及可以做些什么来使skimage看起来更像cv2。我知道skimage.gaussian_filter是围绕scipy.scipy.ndimage.filters.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

对于高斯模糊,使用的是一个相当大的内核(大小= 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

据我可以在这里阅读,你正在使用不推荐的函数gaussian_filter http://scikit-image.org/docs/dev/api/skimage.filters.html#skimage.filters.gaussian_filter,但你是正确的,这是基本功能。你也是正确的,西格玛与内核大小相关。但是,我不明白为什么你在scikit中使用的siga 2应该等于OpenCV中的33的内核大小。 – 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

很高兴知道,但这不是一个真正的答案。有时我滥用网站发表评论作为答案,因为文本不适合评论,或者因为评论包含代码,评论系统不能处理更长的代码片段 - 但我猜你的文本适合评论。 –