检测两个图像在视觉上是否相同

有时两个图像文件在文件级别上可能会有所不同,但是人类会认为它们在感知上是相同的。 鉴于此,现在假设你有一个巨大的图像数据库,并且你想知道一个人是否会认为图像X是存在于数据库中的。 如果所有图像都具有敏感的散列/指纹,那么可以对图像X进行散列,并且查看它是否在数据库中是简单的事情。

我知道有关于这个问题的研究,还有一些algorithm存在,但是有没有工具,比如UNIX命令行工具或者我可以用来计算这样一个散列的库,而不用从头开始实现一些algorithm?

编辑:从findimagedupes相关代码,使用ImageMagick

try $image->Sample("160x160!"); try $image->Modulate(saturation=>-100); try $image->Blur(radius=>3,sigma=>99); try $image->Normalize(); try $image->Equalize(); try $image->Sample("16x16"); try $image->Threshold(); try $image->Set(magick=>'mono'); ($blob) = $image->ImageToBlob(); 

编辑: 警告! ImageMagick $ image对象似乎包含有关读入的图像文件的创build时间的信息。这意味着即使对于相同的图像,如果在不同的时间检索到的图像,blob也会不同。 为了确保指纹保持不变,使用$ image-> getImageSignature()作为最后一步。

findimagedupes是相当不错的。 例如,您可以运行“findimagedupes -v指纹图像”,让它打印“感知性散列”。

互相关或相位相关会告诉您图像是否相同,即使有噪声,降级和水平或垂直偏移。 使用基于FFT的方法将比问题中描述的algorithm快得多。

尽pipe如此,通常的algorithm不适用于不同比例或旋转的图像。 您可以预先旋转或预先缩放它们,但是这真的是处理器密集型的。 显然,你也可以在对数极坐标空间中进行相关运算,它对于旋转,平移和缩放是不变的,但我不清楚细节是否足以解释这一点。

MATLAB示例: 使用标准化互相关注册图像

维基百科称之为“ 相位相关性 ”,并且还描述了它的缩放和旋转不变性 :

该方法可以被扩展以通过首先将图像转换为对数极坐标来确定两幅图像之间的旋转和缩放差异。 由于傅里叶变换的特性,旋转和缩放参数可以以对平移不变的方式来确定。

颜色直方图适用于已resize,重新采样等的图像
如果你想匹配同一地标的不同人物的照片,这是棘手的 – 看看哈尔分类器。 Opencv是一个很好的image processing免费库。

我不知道它背后的algorithm,但微软实时图像search刚刚添加这个function。 Picasa还能够识别图像中的脸部,并将脸部看起来类似。 大多数时候,这是同一个人。

一些机器学习技术,如支持向量机,neural network,朴素贝叶斯分类器或贝叶斯networking在这类问题上是最好的。 我已经写了前三个分类手写数字,这本质上是图像模式识别。

将图像大小调整为1×1像素…如果它们是确切的,则它们是相同图像的小概率…现在将其重新调整为2×2像素图像,如果所有4个像素都精确,那么它们有更大的概率是确切的…然后3×3,如果所有的9像素是确切的…好机会等4×4,如果所有16像素是确切的,…更好的机会。

等等…

这样做,你可以提高效率…如果1×1像素网格closures了很多,为什么麻烦检查2×2网格? 等等

如果你有很多的图像,可以使用一个颜色直方图来获得粗略的图像,然后再对每幅图像进行完整的图像比较(即O(n ^ 2))。

有DPEG , “重复媒体pipe理器” ,但是它的代码没有打开。 这是一个非常老的工具 – 我记得在2003年使用它。

你可以使用差异来看看它们是否真的不同。我想它会删除大量无用的比较。 然后,对于algorithm,我将使用概率方法..他们看起来相同的机会是什么?我基于每个像素的rgb数量。 你也可以find一些其他的指标,如光度和类似的东西。