Python 为什么我的高斯模糊与OpenCV';高斯蓝?

Python 为什么我的高斯模糊与OpenCV';高斯蓝?,python,opencv,gaussianblur,Python,Opencv,Gaussianblur,我写了一些高斯滤波器代码,但是它看起来不像OpenCV的GaussianBlur,具有相同的参数: #!/usr/bin/env python3 import numpy as np import math import cv2 def get_raw_data(image_dims, rescale_factor=5): img = np.random.rand( image_dims[0] // rescale_factor, image_dims[1] //

我写了一些高斯滤波器代码,但是它看起来不像OpenCV的GaussianBlur,具有相同的参数:

#!/usr/bin/env python3

import numpy as np
import math
import cv2


def get_raw_data(image_dims, rescale_factor=5):
    img = np.random.rand(
        image_dims[0] // rescale_factor, image_dims[1] // rescale_factor, 1)
    return cv2.resize(img, (0, 0),
                      fx=rescale_factor, fy=rescale_factor,
                      interpolation=cv2.INTER_NEAREST)


def psf(diameter):
    radius = diameter / 2
    kernel = np.zeros((diameter, diameter, 1), dtype="float")
    for i in range(-diameter // 2, diameter // 2 + 1):
        for j in range(-diameter // 2, diameter // 2 + 1):
            new_val = normal_pdf(i, 0, radius) * \
                normal_pdf(j, 0, radius)
            kernel[i + diameter // 2, j + diameter // 2] = new_val
    return kernel


def normal_pdf(x, m, s):
    inv_sqrt_2pi = 0.3989422804014327
    a = (x - m) / s
    return inv_sqrt_2pi / s * math.exp(-0.5 * a * a)


def main():
    print(psf(5))
    raw_data = get_raw_data((50, 100))
    blurred = cv2.filter2D(raw_data, -1, psf(5))
    cv2.imshow("raw", cv2.resize(raw_data,
                                 (1800, 900),
                                 interpolation=cv2.INTER_NEAREST))
    cv2.waitKey()
    cv2.imshow("blurred", cv2.resize(blurred,
                                     (1800, 900),
                                     interpolation=cv2.INTER_NEAREST))
    cv2.waitKey()
    blurred = cv2.GaussianBlur(raw_data, (5, 5), 0, 0)
    cv2.imshow("blurred", cv2.resize(blurred,
                                     (1800, 900),
                                     interpolation=cv2.INTER_NEAREST))
    cv2.waitKey()

if __name__ == '__main__':
    main()
在大多数情况下,我的模糊图像看起来比OpenCV生成的图像暗。我怀疑我计算PSF的方法有问题,但我不确定我做错了什么


编辑:将模糊=cv2.GaussianBlur(原始数据,(5,5),0,0)替换为模糊=cv2.GaussianBlur(原始数据,(5,5),5,5),虽然我的模糊仍然产生比OpenCV更暗的值。

您可以通过在黑色背景上使用一个白色像素的图像上应用模糊来获得并比较两个高斯核,这可能有助于您发现错误。@jadsq或者仅仅使用?对于其中一个,您的OpenCV
GaussianBlur
的stddev为0(我仍然不明白为什么这是允许的,我应该仔细研究一下)而你的PDF的stddev是5。你混淆了半径和stddev。两个(来自同一个问题),您使用的是一个连续的PDF用于自己的模糊,但OpenCV使用的是一个截断的离散PDF。@AlexanderReynolds我需要它的原因是,标准偏差只需要与半径成比例。关于
sigmaX
sigmaY
是如何从
ksize
计算的,这是一个很好的发现。但是,在提供了半径作为在stddev中,它看起来仍然比OpenCV结果暗。@DanMašek好主意;我将比较getGaussianKernel内核和我的内核,看看有什么不同