我使用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和过滤器的大小是足够大的,它不应该有什么不同。Imagemagick covnert -gaussian-blur 0x2在视觉上与cv2一致。
版本:cv2=2.4.10,skimage=0.11.3,scipy=0.13.3
发布于 2017-07-11 03:44:35
如果有人想知道如何使skimage.gaussian_filter()与Matlab的等效imgaussfilt()匹配(这就是我发现这个问题的原因),请将参数'truncate=2‘传递给skimage.gaussian_filter()。skimage和Matlab都将内核大小作为sigma的函数进行计算。Matlab的默认值是2。Skimage的默认值是4,这导致默认情况下内核要大得多。
发布于 2016-03-29 02:08:53
对于GaussianBlur,您使用的是一个相当大的内核(size=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中,“大小”由sigma定义,它与内核大小有关,如下所示:https://en.wikipedia.org/wiki/Gaussian_filter
定义可以在这里找到:http://scikit-image.org/docs/dev/api/skimage.filters.html#skimage.filters.gaussian
为了获得相应的结果,您必须使用较小的OpenCV内核。
此外,对于这两个库,我强烈建议使用最新的库版本。
发布于 2019-06-20 08:26:58
这两个是相等的:
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中)定义的。
https://stackoverflow.com/questions/36263738
复制相似问题