在Java中识别具有相同内容的图像
前段时间,我花了一些时间寻找方法来确定两幅图像是否相同以回答this question。我现在面对一个稍微不同的问题:我手头上大约有两千张图像,其中一些图像的内容相同,但是彼此之间的缩放/旋转版本(旋转总是90°的倍数),以及不同的压缩和图像格式(大多数是JPG,一些PNG,没有其他)。缩放不超过大约2:1。我想要做的是消除重复,同时保留最高质量的实例。由于Java是我非常熟练的唯一语言,因此我需要使用Java。在Java中识别具有相同内容的图像
The answers到另一个问题提供了许多有用的链接,但它看起来不像其中任何一个可以识别缩放/旋转时的重复。
This question along with the answers建议先将所有图像缩放到一个非常小的尺寸(比如32 * 32或16 * 16),然后基本上做一些哈希和基于散列的比较。这对我来说听起来很聪明,图像可以在比较之前进行预先排序,排序后可能是O(n)问题。但是,鉴于图像可能会旋转,我不知道如何处理它。其中一个选项是手动完成的所有图像,并决定采取轮换,因为他们描述什么都有明确的方向(人眼可以非常容易地决定走哪条路“向上”应该是)。如果可能的话,我想避免这种情况。
是否有成熟的方法/算法(该链接提SSIM)来处理这类问题,或可以任你拿出一个比上述更好的方法?也许有人知道的Java库,将很好地适合于任务(在链接的问题,有一个Java包装提到了OpenCV的,然后ImageJ的,imgsclr)?任何帮助表示赞赏。
我认为这个问题的一般答案需要一个无监督的机器学习方法来生成局部不变特征 - 基本上,这是一种寻找不随缩放或旋转而改变的哈希方法,然后运行聚类算法。这里有一些文件,可能是相关的:
嗯,我想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
API进行下载可以找到太多不同大小的图像中重复。
干杯,我会看看那些 - 听起来很扎实! – 2013-03-06 04:23:09
看过这些材料之后,我会给你一些更多的赞扬;绰绰有余做我想做的事! – 2013-03-06 14:56:10