我正在寻找一种算法,我可以用它来比较两个图像,并确定两者之间是否存在显着差异。 “重要”,我的意思是,如果你拍了一张房间的两张照片,而其中一张房子的墙上有一只大蜘蛛,你就能够发现它。我并不真正感兴趣的是检测到什么,甚至在哪里 - 只是有不同之处。该算法需要忽略亮度。如果房间在白天变得更亮或更暗,算法应该忽略它。
即使您不知道算法,任何正确方向的提示都会有所帮助。
谢谢!
答案 0 :(得分:4)
我会尝试对您的2d数据执行高通滤波。
根据Fourier,通过分析信号中的哪些频率,可以将每个信号转换为“频率空间”。这也适用于2D信号,如图像。
通过“高通滤波器”,您可以移除所有低频部分,例如恒定偏移和慢速渐变。如果应用于图像,它可以用作简单的“边缘检测”算法。查看示例可能会使其更容易理解:
我从网上的某个地方(左上角)拍了一张蜘蛛的照片。然后我降低了这张图片的亮度(左下角)。对于这两个版本,我使用GIMP (This plugin)应用了高通滤波器。对于两个输入图像,输出看起来非常相似。
我的建议:首先应用高通滤波器,然后查看差异。
可能出现的问题
根据要求,这里有一些我能想象到的问题。
没有锐边:如果您想要检测的物体没有锐边,您可能会使用HF-pass滤波将其滤除。但那可能是什么对象?它们必须是巨大的,平坦的(不产生阴影)和非结构化的。
只有颜色不同,而不是亮度:如果对象的颜色不同,但亮度与背景相同,则灰度转换可能会出现问题。但是如果遇到这个问题,只需分别分析R,G,B数据,那么至少有一个通道应该有助于检测物体 - 否则,你无论如何都看不到它。
修改强> 作为对???的回复,如果你也调整高通滤波图像的水平(当然大约是0.5 * 256),只需将其标准化为0,256再次得到
这可能不比你的结果差。但是,HP滤波器很简单,使用FFT时非常快。
答案 1 :(得分:0)
如果相机完全静止且所有差异都是由于环境光线和/或相机曝光设置造成的,则可以通过标准化2张图像来忽略亮度(和对比度)。
从每个图像的所有像素中减去相应的图像平均值(平均像素值)并取差。这将照亮亮度。
如果你想要处理对比度,则计算每个图像的方差(在将均值设为0之后),并将像素值乘以将使它们具有相同方差的因子。现在差异对比也是不变的(假设没有过度/不足曝光区域)。
答案 2 :(得分:0)
出现这种问题的一种常见方法是对相机拍摄的图像进行平均,并检测高于给定阈值的任何差异。
您需要将内存中的图像保留为平均图像。我们称之为“平均”。
每次你的相机拍照(称为“pic”),你都会:
avg = avg * 0.95 + pic * 0.05
。在这里,您的参考图像会在一天内发生变化,以适应日晒和阴影的变化。
答案 3 :(得分:0)
如何从像素中删除亮度分量:
Red_ratio = Red / (Red + Blue + Green)
Blue_ratio = Blue / (Red + Blue + Green)
Green_ratio = Green / (Red + Blue + Green)