前一段时间,我花了一些时间寻找方法来确定两个图像是否相同,以回答
this question.我现在面临一个稍微不同的问题:我手上有大约两千幅图像,其中一些图像具有相同的内容,但是是相互缩放/旋转的版本(旋转始终是90°的倍数),以及不同的压缩和图像格式的问题(主要是jpg,一些png,没有别的).缩放比例大约不超过2:1.我想做的是消除重复,同时保留最高质量的实例.由于Java是我熟练掌握的唯一语言,所以我需要使用Java.
The answers到另一个问题提供了许多有用的链接,但它们看起来不像任何一个可以在缩放/旋转时识别重复的.
This question along with the answers建议首先将所有图像缩放到非常小的尺寸(例如32 * 32或16 * 16),然后基本上进行一些散列,并根据散列进行比较.这听起来对我来说足够聪明,图像可以在比较之前进行预先排序,这将在排序后成为O(n)问题.然而,鉴于图像可能会旋转,我不知道如何处理它;考虑到他们所描述的具有明确的方向(人眼可以很容易地决定哪种方式“应该是”),一个选择是手动地通过所有的图像并决定旋转.如果可能,我想避免.
有没有建立方法/算法(链接提到SSIM)来处理这种问题,还是可以有任何人提出比上述更好的方法?也许有人知道Java的库可能适合于任务(在链接的问题中,提到OpenCV的Java包装,然后是ImageJ,imgsclr)?任何帮助是赞赏.
解决方法
我认为这个问题的一般答案需要一种无人值守的机器学习方法,它可以产生局部不变特征 – 基本上是一种通过缩放或旋转而不改变散列的花哨方法,然后运行聚类算法.以下是一些可能相关的论文:
> Clustering Near-Duplicate Images in Large Collections
> A Novel Duplicate Images Detection Method Based on PLSA Model
> Efficient image duplicate detection based on image analysis – 这里有很多东西,因为它是一些花花公子的整个博士论文