我正在寻找一种算法或库,可以发现两个图像之间的差异(例如在“查找错误”游戏中)并输出包含这些更改的边界框的坐标。我对 Python、C 或几乎任何其他语言的算法持开放态度。
4 回答
如果您只想显示差异,则可以使用下面的代码。
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
免责声明:我是这个框架的作者,但我认为这会有所帮助。
有很多,适合不同的目的。您可以通过查看OpenCV开始,它是一个免费的计算机视觉库,具有 C、C++ 中的 API,以及与 Python 和许多其他语言的绑定。它可以轻松地进行减法,并且还具有边界或分组点集的功能。
除了简单的图像减法之外,OpenCV 解决的特定用途之一是运动检测或对象跟踪。
您可以在Signal Processing stackexchange 站点中询问更具体的图像相关算法相关问题。
通过裁剪原始图像将两个图像“解析”成多个较小的图像。每个“子图像”的大小将是您扫描操作的“分辨率”。例如,如果原始图像是 100 像素 x 100 像素,您可以将分辨率设置为 10 x 10,并且每个原始图像都有一百个 10 x 10 子图像。将子图像保存到磁盘。
接下来,比较每一对子图像文件,每个原始图像中的一个。如果存在文件大小或数据差异,则可以将该“坐标”标记为与原始图像有差异。
该算法假设您不是在寻找单个像素差异的坐标。