前一段时间,我花了一些时间来寻找确定两个图像是否相同的方法,以回答[这个问题](http://codingdict.com/questions/100055。我现在面临一个稍微不同的问题:我手头大约有两千张图像,其中一些具有相同的内容,但是彼此缩放/旋转(旋转始终为90°的倍数),还有一个问题。不同的压缩方式和图像格式(主要是jpg,一些png和其他格式)。缩放比例不会超过2:1。我想做的是消除重复,同时保留最高质量的实例。由于Java是我精通的唯一语言,因此我需要使用Java。 一个不同问题的答案提供了许多有用的链接,但是看起来它们当中的任何一个都无法在缩放/旋转时识别重复项。
这个问题以及答案]建议先将所有图像缩放到非常小的尺寸(例如32 * 32或16 * 16),然后基本上进行一些哈希处理,然后根据哈希进行比较。这对我来说听起来足够聪明,可以在比较之前对图像进行预排序,排序后将是O(n)问题。但是,鉴于图像可能会旋转,因此我不确定如何处理它。一种选择是手动浏览所有图像并决定旋转,因为它们所描绘的内容具有明确的方向(人眼可以很容易地确定“向上”应采用的方式)。如果可能的话,我想避免这种情况。
是否存在解决此类问题的既定方法/算法(链接中提到了SSIM),或者你们中谁能提出比上述更好的方法?也许有人知道适合该任务的Java库(在链接的问题中提到了OpenCV的Java包装器,然后是ImageJ和imgsclr)?任何帮助表示赞赏。
我认为,对该问题的一般回答需要一种无监督的机器学习方法,该方法会生成局部不变特征-基本上,这是一种寻找不随缩放或旋转而变化的哈希的奇特方法- 然后运行聚类算法。以下是一些可能相关的论文: