使用 GaussianBlur 和减法模糊图像后,我有更多的非零像素

问题描述

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

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

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


#Gaussian Filtering
gaus_image1  = cv2.GaussianBlur(image1,0)
gaus_image2  = cv2.GaussianBlur(image2,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)

什么会导致这种行为? 黑色图像有这么多非零像素有意义吗? 如果是,是否有另一种方法来验证图像是否全黑?

谢谢。

解决方法

  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通道的均值和标准差值,并计算其他图像的值和距离。尝试几次后,您可以观察到相同图像的接近程度。 “颜色通道统计”术语可用于谷歌搜索。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...