为什么高斯滤波器在cv2和skipage之间是不同的?

2024-05-15 23:55:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个图像,我应用高斯模糊来同时使用cv2.GaussianBlurskimage.gaussian_filter库,但得到的结果却大不相同。我很好奇为什么,以及怎样才能使skimage看起来更像cv2。我知道skimage.gaussian_filterscipy.scipy.ndimage.filters.gaussian_filter的包装。为了清楚地说明这个问题,为什么这两个功能不同,可以做些什么使它们更相似?

这是我的测试图像:

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)

所以sigma=2,过滤器的大小足够大,不应该有什么区别。Imagemagickcovnert -gaussian-blur 0x2在视觉上与cv2一致。

版本:cv2=2.4.10,skimage=0.11.3,scipy=0.13.3


Tags: 图像功能版本response详细信息scipygaussianfilter
3条回答

两者相等:

gau_img = cv2.GaussianBlur(img, (5,5), 10.0) # 5*5 kernal, 2 on each side. 2 = 1/5 * 10 = 1/5 * sigma
gau_img = skimage.filters.gaussian(img, sigma=10, truncate=1/5)

整个高斯核仅由sigma定义。但是你用高斯核的哪个部分来模糊图像是由truncate(在skimage中)或ksize(在opencv中)定义的。

如果有人想知道如何使skimage.gaussian_filter()与Matlab的等效imgaussfilt()匹配(我找到这个问题的原因),请将参数“truncate=2”传递给skimage.gaussian_filter()。sklimage和Matlab都根据sigma计算内核大小。Matlab的默认值是2。skipage的默认值是4,默认情况下会产生一个大得多的内核。

对于GaussianBlur,您使用的是一个相当大的内核(size=33),这会导致很多平滑。平滑将很大程度上取决于您的内核大小。使用参数,每个新像素值在33*33像素的“窗口”中“平均”。

可以在这里找到cv2.GaussianBlur的定义 http://docs.opencv.org/3.1.0/d4/d13/tutorial_py_filtering.html#gsc.tab=0

相比之下,skipage.filters.gaussian似乎在较小的内核上工作。在skimage中,“size”是由sigma定义的,它与这里描述的内核大小相关:https://en.wikipedia.org/wiki/Gaussian_filter

定义可以在这里找到:http://scikit-image.org/docs/dev/api/skimage.filters.html#skimage.filters.gaussian

为了得到相应的结果,您必须使用一个更小的OpenCV内核。

此外,对于这两个库,我强烈建议使用最新的库版本。

相关问题 更多 >