【问题标题】:After blurring image using GaussianBlur and subtracting, I have more non-zero pixels使用 GaussianBlur 模糊图像并减去后,我有更多的非零像素
【发布时间】:2021-01-14 12:52:03
【问题描述】:

我试图通过将它们彼此相减来检查两张图像是否相同。 我正在使用 cv2.countNonZero 检查非零像素的数量。 问题是,在对图像进行任何更改之前,我得到了大约 3000 个非零像素,并且在新图像中(由减法创建)我可以看到所有这些像素,但是在我使用高斯之后- blur (cv2.GaussianBlur(image1,(3,3),0)) 我得到了大约 6000 个非零像素,但新图像全是黑色的。

如果我的描述不清楚,这里是代码:

image1 = cv2.imread(path1)
image2 = cv2.imread(path2)


#Gaussian Filtering
gaus_image1  = cv2.GaussianBlur(image1,(3,3),0)
gaus_image2  = cv2.GaussianBlur(image2,(3,3),0)

gaus_diff = cv2.subtract(gaus_image1, gaus_image2)

print(str(cv2.countNonZero(cv2.cvtColor(gaus_diff, cv2.COLOR_BGR2GRAY))))
cv2.imshow('gaus_diff.png', gaus_diff)

什么会导致这种行为? 黑色图像有这么多非零像素是否有意义? 如果是,是否有其他方法可以验证图像是否全黑?

谢谢。

【问题讨论】:

    标签: python opencv gaussianblur


    【解决方案1】:
    1. 为什么看不到它的答案:

    考虑到像素的灰度值介于 0-255 之间,对于 0 差,两个像素必须采用相同的值。由于高斯模糊,像素值收敛。例如,让我们成为同一坐标中两张图片中的像素 p1 和 p2。高斯模糊前的值为p1 = 330, p2 = 301 diff(p1, p2) = 29,而高斯模糊后的值为p1 = 315, p2 = 313,即diff(p1, p2 ) = 2。由于 29 的灰度值比 2 的值更白,因此看起来更清晰。

    1. 拥有更多非零值的答案:

    高斯模糊的目的是减少目标边缘的数量以获得平滑的图像。当你这样做时,像素的值会收敛,你会得到更平滑的过渡。但是,这并不意味着相似的图像在相同的像素坐标处具有相同的值。对图片应用独特的平滑处理,并根据相邻像素将每个像素值重新分配给图片。事实上,你得到的结果正是证实了这一点。因为像素值接近,所以无法准确观察,但是由于高斯,相同的像素数会减少。

    1. 建议:

    有一种更具统计性但更简单的方法来判断两张图片是否相同。 用(means, stds) = cv2.meanStdDev(image1)求出每个RGB通道的均值和标准差值,并计算另一幅图像的值和距离。几次尝试后,您可以观察到相同图像的接近程度。 “颜色通道统计”一词可用于谷歌搜索。

    【讨论】:

    • 非常感谢,我会尝试您的建议。
    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2017-04-22
    • 2013-08-29
    • 2021-08-20
    • 1970-01-01
    • 2015-08-13
    • 2013-06-15
    相关资源
    最近更新 更多