是否有算法来检测两个图像之间的差异?

时间:2013-08-28 22:46:17

标签: image image-processing

我正在寻找能够发现两个图像之间差异的算法或库(如“查找错误”游戏)并输出包含这些更改的边界框的协调。 我对使用Python,C或几乎任何其他语言的算法持开放态度。

4 个答案:

答案 0 :(得分:3)

如果您只想显示差异,那么您可以使用以下代码。

FastBitmap original = new FastBitmap(bitmap);
FastBitmap overlay = new FastBitmap(processedBitmap);

//Subtract the original with overlay and just see the differences.
Subtract sub = new Subtract(overlay);
sub.applyInPlace(original);

// Show the results
JOptionPane.showMessageDialog(null, original.toIcon());

对于比较两个图像,您可以在Catalano Framework中使用ObjectiveFideliy类。 Catalano Framework在Java中,因此您可以在另一个LGPL项目中移植此类。

FastBitmap original = new FastBitmap(bitmap);
FastBitmap reconstructed = new FastBitmap(processedBitmap);

ObjectiveFidelity of = new ObjectiveFidelity(original, reconstructed);

int error = of.getTotalError();
double errorRMS = of.getErrorRMS();
double snr = of.getSignalToNoiseRatioRMS();

//Show the results

免责声明:我是这个框架的作者,但我认为这会有所帮助。

答案 1 :(得分:2)

有很多,适合不同的目的。您可以通过查看OpenCV开始,这是一个带有C,C ++ API的免费计算机视觉库,还可以绑定到Python和许多其他语言。它可以轻松地进行减法,并且还具有对点集进行边界或分组的功能。

除了简单的图像减法之外,OpenCV解决的一个特定用途是motion detection or object tracking

您可以在Signal Processing stackexchange站点中询问更具体的与图像相关的算法相关问题。

答案 2 :(得分:1)

通过裁剪原始图像将两个图像“解析”为多个较小的图像。 每个“子图像”的大小将是扫描操作的“分辨率”。例如,如果原始图像是100像素x 100像素,则可以将分辨率设置为10 x 10,并且每个原始图像都有100个10 x 10子图像。将子图像保存到磁盘。

接下来,比较每对子图像文件,每个原始图像一个。如果存在文件大小或数据差异,则可以将“坐标”标记为原始图像上的差异。

此算法假设您没有查找单个像素差异的坐标。

答案 3 :(得分:0)

Imagemagick的比较(命令行)功能基本上就是这个,因为你可以阅读/看到here的例子。但是,一个约束是两个图像必须具有相同的尺寸而不是已经平移/旋转/缩放。如果它们的大小/方向/比例不同,则需要先处理。 OpenCV包含一些算法。您可以找到一个关于OpenCV函数的好教程,您可以使用它来纠正图像here