这是我想做的:

我定期用网络摄像头拍照。就像时间流逝一样。然而,如果没有什么真正的改变,也就是说,图片看起来几乎相同,我不想存储最新的快照。

我想有某种方法可以量化这种差异,我必须根据经验确定一个阈值。

我追求的是简单而不是完美。 我用的是python。


当前回答

我在工作中遇到了类似的问题,我正在重写我们的图像转换端点,我想检查新版本是否与旧版本产生相同或几乎相同的输出。所以我写了这个:

https://github.com/nicolashahn/diffimg

它对相同大小的图像进行操作,并在每个像素级别上测量每个通道的值的差异:R, G, B(, a),取这些通道的平均差值,然后对所有像素的差值进行平均,并返回一个比率。

例如,有一张10x10的白色像素的图像,而同一张图像只有一个像素变成了红色,该像素处的差异是1/3或0.33……(RGB 0,0,0 vs 255,0,0)并且在所有其他像素为0。总共100像素,0.33…/100 =一个~0.33%的图像差异。

我相信这将非常适合OP的项目(我意识到这是一个非常老的帖子,但张贴为未来的StackOverflowers谁也想用python比较图像)。

其他回答

推土机的距离可能正是你所需要的。 不过,要实时实现它可能有点重。

你见过寻找相似图像的算法问题吗?请查看相关建议。

我建议对你的框架进行小波变换(我已经写了一个使用Haar变换的C扩展);然后,比较两张图片之间最大(比例)小波因子的索引,你应该得到一个数值相似近似。

我特别要解决的问题是如何计算它们是否“足够不同”。我假设你能弄清楚如何一个一个地减去像素。

首先,我将取一堆没有任何变化的图像,并找出任何像素变化的最大量,仅仅是因为捕获的变化、成像系统中的噪声、JPEG压缩工件和照明的每时每刻的变化。也许你会发现,即使没有任何移动,1或2位的差异也是可以预期的。

对于“真实”测试,你需要一个这样的标准:

如果最多P个像素的差异不超过E,则相同。

所以,如果E = 0.02, P = 1000,这可能意味着(大约)如果任何单个像素改变超过5个单位(假设8位图像),或者如果超过1000个像素有任何错误,这将是“不同的”。

这主要是一种很好的“分类”技术,用于快速识别足够接近而不需要进一步检查的图像。“失败”的图像可能更多的是一种更复杂/昂贵的技术,例如,如果相机抖动,或者对光线变化更健壮,就不会产生假阳性。

I run an open source project, OpenImageIO, that contains a utility called "idiff" that compares differences with thresholds like this (even more elaborate, actually). Even if you don't want to use this software, you may want to look at the source to see how we did it. It's used commercially quite a bit and this thresholding technique was developed so that we could have a test suite for rendering and image processing software, with "reference images" that might have small differences from platform-to-platform or as we made minor tweaks to tha algorithms, so we wanted a "match within tolerance" operation.

如何计算这两幅图像的曼哈顿距离呢?得到n*n个值。然后你可以做一些事情,比如行平均,把值减少到n个,然后再用一个函数得到一个值。

我在工作中遇到了类似的问题,我正在重写我们的图像转换端点,我想检查新版本是否与旧版本产生相同或几乎相同的输出。所以我写了这个:

https://github.com/nicolashahn/diffimg

它对相同大小的图像进行操作,并在每个像素级别上测量每个通道的值的差异:R, G, B(, a),取这些通道的平均差值,然后对所有像素的差值进行平均,并返回一个比率。

例如,有一张10x10的白色像素的图像,而同一张图像只有一个像素变成了红色,该像素处的差异是1/3或0.33……(RGB 0,0,0 vs 255,0,0)并且在所有其他像素为0。总共100像素,0.33…/100 =一个~0.33%的图像差异。

我相信这将非常适合OP的项目(我意识到这是一个非常老的帖子,但张贴为未来的StackOverflowers谁也想用python比较图像)。