我得到了一个图像,我应用高斯模糊来同时使用cv2.GaussianBlur
和skimage.gaussian_filter
库,但得到的结果却大不相同。我很好奇为什么,以及怎样才能使skimage
看起来更像cv2
。我知道skimage.gaussian_filter
是scipy.scipy.ndimage.filters.gaussian_filter
的包装。为了清楚地说明这个问题,为什么这两个功能不同,可以做些什么使它们更相似?
这是我的测试图像:
这里是cv2
版本(看起来更模糊):
这里是skimage
/scipy
版本(看起来更清晰):
详细信息:
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
两者相等:
整个高斯核仅由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内核。
此外,对于这两个库,我强烈建议使用最新的库版本。
相关问题 更多 >
编程相关推荐