【问题标题】:Different results with cv2.GaussianBlur and cv2.filter2D with a gaussian kernel?使用高斯核的 cv2.GaussianBlur 和 cv2.filter2D 的结果不同?
【发布时间】:2019-09-20 09:50:09
【问题描述】:

我正在尝试在 Python 中移植一些 lua/torch 代码,有一个序列在图像上运行高斯模糊,如下所示:

local gauK = image.gaussian(math.ceil(3*sigma)*2+1, sigma)
inp = image.convolve(inp, gauK, 'same')

为了在我的方法中复制这一点,我一直在查看 cv2.GaussianBlur() 和 cv2.filter2D 并传入一个高斯内核。

方法一(cv2.GaussianBlur):

kernel_size = int(math.ceil(3 * sigma) * 2 + 1)  # same size as the lua code
blurred_image = cv2.GaussianBlur(img, ksize=(kernel_size, kernel_size), sigma)

方法二(cv2.filter2D)

kernel_size = int(math.ceil(3 * sigma) * 2 + 1)  # same size as the lua code
gaussian_kernel = cv2.getGaussianKernel(kernel_size, sigma)
blurred_image_2 = cv2.filter2D(img, -1, gaussian_kernel)

在方法 1 和方法 2 之间,我得到不同的图像。似乎方法 1 的图像比方法 2 中的图像更模糊。有什么原因我可能会在这里得到不同的结果吗?我试图找出哪一个会匹配 lua 代码。谢谢。

【问题讨论】:

    标签: python opencv torch cv2


    【解决方案1】:

    这很奇怪;出于实用性的考虑,我建议您只选择一个您满意的并使用它。除此之外,我猜测如何处理多个参数的语义会导致这种不匹配。此外,opencv 用于从 kernelsize 推断 sigma 的方程式,反之亦然,似乎与您的不匹配。

    来自GaussianBlur docs

    • ksize:高斯核大小。 ksize.width 和 ksize.height 可以不同,但​​它们都必须是正数和奇数。或者,它们可以是零和 然后根据 sigma 计算它们。
    • sigmaX:X 方向的高斯核标准差。
    • sigmaY:Y方向的高斯核标准差;如果 sigmaY 为零,则设置为等于 sigmaX,如果两个 sigma 都为零, 它们分别由 ksize.width 和 ksize.height 计算得出(参见 cv::getGaussianKernel 了解详情); 完全控制结果 无论将来可能对所有这些语义进行修改,它 建议指定所有 ksize、sigmaX 和 sigmaY。

    还有getGaussianKernel docs

    • 如果是非正数,则从 ksize 计算为sigma = 0.3\*((ksize-1)\*0.5 - 1) + 0.8

    所有的重点都是我的。你的sigma有可能是负的吗?这可能会导致不匹配。

    编辑:刚刚注意到您希望它与 lua 代码匹配。我的建议是保存结果,然后在 Photoshop 或您最喜欢的图像编辑器中进行比较。如果您从参考中减去测试,您应该能够看到差异,并且随着您的尝试越来越接近,整体差异应该较小。除此之外,您可以尝试阅读源代码以找出定义中的差异,或者自己编写!

    祝你好运!

    【讨论】:

    • “\*”符号是什么意思?
    【解决方案2】:

    cv2.getGaussianKernel 函数返回一维向量,要使其成为二维高斯矩阵,可以将其与转置相乘(@ 用于矩阵乘法)。你能试试这个代码吗:

    gaussian_kernel = cv2.getGaussianKernel(kernel_size, sigma)
    kernel_2D = gaussian_kernel @ gaussian_kernel.transpose()
    blurred_image_2 = cv2.filter2D(img, -1, kernel_2D)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多