4

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

4

4 回答 4

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 框架使用 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

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

于 2013-08-29T16:40:18.683 回答
2

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

除了简单的图像减法之外,OpenCV 解决的特定用途之一是运动检测或对象跟踪

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

于 2013-08-28T22:51:31.917 回答
2

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

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

该算法假设您不是在寻找单个像素差异的坐标。

于 2013-08-28T22:57:25.033 回答
0

Imagemagick 的比较(命令行)功能基本上是这样做的,您可以阅读/查看此处的示例。但是,一个限制是两个图像必须具有相同的大小并且没有被平移/旋转/缩放。如果它们的大小/方向/比例不同,您需要先处理好。OpenCV 包含一些算法。您可以在此处找到有关可用于校正图像的 OpenCV 函数的良好教程。

于 2013-08-30T23:41:23.387 回答