我正在寻找一种算法,可用于比较两个图像并确定两者之间是否存在显着差异。我所说的“显着”是指,如果你拍了两张房间的照片,其中一张的墙上明显有一只大蜘蛛,你就能检测到它。我对检测到的内容或什至在哪里并不真正感兴趣 - 只是有一些不同的东西。该算法需要忽略亮度。如果房间在白天变得更亮或更暗,算法应该忽略它。
即使您不知道算法,任何正确方向的提示都会有所帮助。
谢谢!
我会尝试对您的二维数据进行高通滤波。
根据傅里叶,每个信号都可以通过分析信号中的频率来转换为“频率空间”。这也适用于二维信号,如图像。
通过“高通滤波器”,您可以删除所有低频部分,例如恒定偏移和慢梯度。如果应用于图像,它可以用作简单的“边缘检测”算法。查看示例可能会更容易理解:
我从网络上的某个地方(左上角)拍了一张墙上蜘蛛的图像。然后我降低了这张图片的亮度(左下)。对于这两个版本,我使用 GIMP (This plugin)应用了高通滤波器。对于两个输入图像,输出看起来非常相似。
我的建议:首先应用高通滤波器,然后查看差异。
可能的问题
根据要求,这里有一些我可以想象的问题。
没有锐利边缘:如果您要检测的对象没有锐利边缘,您可能会使用 HF 通滤波将其滤除。但那可能是什么物体?它们必须是巨大的、平坦的(不产生阴影)和非结构化的。
只有颜色不同,而不是亮度:如果对象只是颜色不同,但亮度与背景相同,则灰度转换可能会出现问题。但如果遇到这个问题,只需分别分析 R、G、B 数据,那么至少有一个通道应该有助于检测物体——否则,无论如何你都看不到它。
Edit As reply to ???, if you also adjust the levels of the high-pass filtered image (which of course is all around 0.5*256) by just normalizing it to the range 0, 256 again you get
Which probably isn't worse than your result. But, HP-filters are simple and, when using FFT, very fast.
如果相机是完全静止的,并且所有差异都是由于环境照明和/或相机曝光设置造成的,那么可以通过对 2 个图像进行归一化来忽略亮度(和对比度)。
从每个图像的所有像素中减去相应的图像平均值(平均像素值)并取差。这将照顾亮度。
如果您也想处理对比度,请计算每个图像的方差(在将均值设为 0 之后),并将像素值乘以使它们具有相同方差的因子。现在,差异对于对比度也是不变的(假设没有过度/不足曝光区域)。
A common approach with such a problem is to average the images taken by your camera over time, and detect any difference above a given threshold.
You need to keep an image in memory that will be the averaged image. Let's call it "avg".
Each time your camera takes a picture (called "pic"), you gonna :
avg = avg * 0.95 + pic * 0.05
。在这里,您的参考图像会在一天中发生变化,以适应太阳和阴影的变化。
如何从像素中删除亮度分量:
Red_ratio = Red / (Red + Blue + Green)
Blue_ratio = Blue / (Red + Blue + Green)
Green_ratio = Green / (Red + Blue + Green)