9

我想知道是否有一个预先存在的算法/库/框架来比较两个图像,看看一个是不是另一个的调整大小的版本?在这个阶段,编程语言并不重要。

如果那里没有任何东西,我需要写一些东西。到目前为止我的想法是:

  • (昂贵)将较大的尺寸调整为较小的尺寸并逐像素比较。

  • 更好的是,只需调整图片上一些随机“区域”的大小并进行比较。如果它们匹配,则转换更多,等等......

  • 将图像分成许多行和列,并对颜色值进行某种奇偶校验数学。

我特别看到前两个想法的问题是,首先有不同的方法可以重新调整图片的大小,因此数学计算结果可能根本不一样。一些重新调整大小会增加模糊等....

如果有人能指点我一些关于这个主题的好文献,那就太好了。我的谷歌搜索主要是共享软件应用程序,这不是我想要的。

目标是让它在网络服务器的后面运行。

4

2 回答 2

2

最佳方法取决于您要比较的图像的特征,图像相同的概率百分比,以及当它们不同时,它们通常会相差很多还是可能像单个像素一样微小区别?

如果上面的答案是您需要比较的图像将是完全随机的,那么使用昂贵的解决方案,或者一些可用的软件包可能是最好的选择。

如果您知道图像经常不同,并且图像通常差异很大,并且您真的想要手动推出解决方案,您可以实施一些初始“快速比较”步骤,这些步骤会更少价格昂贵,并且可以快速识别出许多图像不同的情况。

例如,您可以调整较大图像的大小,然后逐像素比较(或计算像素值的哈希)仅图像的“对角线”(左上角像素到右下角像素)并通过这样做排除不同的图像,并且只对通过此测试的图像进行更昂贵的比较。

或者根据图像的类型在“良好分布”的任何地方取一个预设数量的点,并且只对通过此测试的那些进行更昂贵的比较。

如果您对要比较的图像有很多了解,它们具有已知的特征,并且它们的不同之处多于相同,那么按照上述思路实施廉价的“快速消除比较”可能是值得的。

于 2012-10-26T18:56:03.687 回答
1

您需要为此研究 dHash 算法。

就在这几天前,我写了一个纯 Java 库。您可以使用目录路径(包括子目录)来提供它,它会列出列表中的重复图像以及您要删除的绝对路径。或者,您也可以使用它来查找目录中的所有唯一图像。

它在内部使用了 awt api,因此不能用于 Android。由于 imageIO 在读取很多新类型的图像时遇到问题,我正在使用内部使用的 12 个猴子 jar。

https://github.com/srch07/Duplicate-Image-Finder-API

可以从https://github.com/srch07/Duplicate-Image-Finder-API/blob/master/archives/duplicate_image_finder_1.0.jar下载内部捆绑了依赖项的 Jar

该 api 也可以在不同大小的图像中找到重复项。

于 2016-01-26T17:45:54.447 回答