7

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

这是我的测试图像:

原始图像

这是cv2版本(看起来更模糊):

cv2 图像

这是skimage/scipy版本(看起来更清晰):

skimage版本

细节:

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

4

4 回答 4

6

如果有人对如何使 skimage.gaussian_filter() 与 Matlab 的等效 imgaussfilt() 匹配(我发现这个问题的原因)感到好奇,请将参数 'truncate=2' 传递给 skimage.gaussian_filter()。skimage 和 Matlab 都将内核大小计算为 sigma 的函数。Matlab 的默认值为 2。Skimage 的默认值为 4,默认情况下会产生明显更大的内核。

于 2017-07-10T19:44:34.993 回答
4

对于 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 中,“大小”由与内核大小相关的 sigma 定义,如下所述:https ://en.wikipedia.org/wiki/Gaussian_filter

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

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

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

于 2016-03-28T18:08:52.793 回答
4

这两个是相等的:

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中)定义的。

于 2019-06-20T00:26:57.597 回答
0

根据[Scipy0.15.1 API][1]

scipy.ndimage.filters(img, sigma=sigma, truncate = 4.0)

它使用truncate * sigma中的内核大小设置高斯滤波器。在这种理解下,以下两个函数在灰度图像上会给出相同的结果:

trunc_val = 3
sigma_val = 3
k_size = int(sigma_val * trunc_val)
gau_img1 = cv2.GaussianBlur(img, (k_size,k_size), sigma_val)
gau_img2 = gaussian_filter(img, sigma = sigma_val, truncate = trunc_val) 

cv2.imshow("cv2 res", gau_img1)
cv2.imshow("scipy res", gau_img2)
cv2.waitKey(-1)

一些测试结果:trunc_val = 3; sigma_val = 3 在此处输入图像描述

截断值 = 3;sigma_val = 1 在此处输入图像描述

截断值 = 3;sigma_val = 9 在此处输入图像描述

于 2021-04-06T09:28:13.433 回答