10

前段时间,为了回答这个问题,我花了一些时间寻找确定两个图像是否相同的方法。我现在面临一个稍微不同的问题:我手头有大约两千张图像,其中一些具有相同的内容,但是彼此的缩放/旋转版本(旋转总是 90° 的倍数),以及问题不同的压缩和图像格式(主要是 jpg,一些 png,仅此而已)。缩放比例不超过大约 2:1。我想做的是消除重复,同时保留最高质量的实例。由于Java是我相当精通的唯一语言,因此我需要使用Java。

不同问题的答案提供了许多有用的链接,但看起来它们中的任何一个都不能在缩放/旋转时识别重复项。

这个问题连同答案建议首先将所有图像缩放到非常小的尺寸(比如 32*32 或 16*16),然后基本上进行一些散列,并基于散列进行比较。这对我来说听起来很聪明,可以在比较之前对图像进行预排序,在排序之后这将是一个 O(n) 问题。但是,鉴于图像可能会旋转,我不知道如何处理它;一种选择是手动浏览所有图像并决定旋转,因为它们所描绘的内容具有明确的方向(人眼可以很容易地决定应该“向上”的方向)。如果可能的话,我想避免这种情况。

是否有既定的方法/算法(链接提到 SSIM)来处理此类问题,或者你们中的任何人都可以提出比上述更好的方法吗?也许有人知道适合该任务的 Java 库(在链接的问题中提到了 OpenCV 的 Java 包装器,然后是 ImageJ、imgsclr)?任何帮助表示赞赏。

4

2 回答 2

5

我认为这个问题的一般答案需要一种生成局部不变特征的无监督机器学习方法——基本上,这是一种寻找不随缩放或旋转而变化的散列的奇特方法——然后运行聚类算法。以下是一些可能相关的论文:

于 2013-03-06T02:12:59.087 回答
0

好吧,我认为 dHash 是您需要的。您只需要改进 dHash 以考虑旋转,这意味着 2000 张图像将被视为 8000 张图像。

就在这几天前,我写了一个纯 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:42:43.163 回答