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

时间:2008-12-03 02:19:48

标签: algorithm image image-processing hash

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

我知道有关于这个问题的研究,并且存在一些算法,但是有没有任何工具,比如UNIX命令行工具或我可以用来计算这样一个哈希的库而不从头开始实现某些算法?

编辑:来自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对象似乎包含有关已读入的图像文件的创建时间的信息。这意味着即使对于同一图像,您获得的blob也会有所不同,如果它是在不同的时间检索的。要确保指纹保持不变,请使用$ image-> getImageSignature()作为最后一步。

8 个答案:

答案 0 :(得分:14)

findimagedupes非常好。例如,您可以运行“findimagedupes -v指纹图像”来打印“感知哈希”。

答案 1 :(得分:5)

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

但是,通常的算法不适用于不同比例或旋转的图像。您可以预先旋转或预缩放它们,但这确实是处理器密集型的。显然你也可以在对数极坐标空间中进行相关,它对旋转,平移和缩放都是不变的,但我不太清楚这些细节来解释它。

MATLAB示例:Registering an Image Using Normalized Cross-Correlation

维基百科称之为“phase correlation”,并且还描述了making it scale- and rotation-invariant

  

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

答案 2 :(得分:4)

颜色直方图适用于已调整大小,重新采样等的相同图像 如果你想匹配同一地标的不同人物的照片,那就更难了 - 看看哈尔分类器。 Opencv是一个很棒的图像处理免费库。

答案 3 :(得分:1)

我不知道它背后的算法,但Microsoft Live Image Search只有added这种能力。 Picasa还可以识别图像中的面部,并对看起来相似的面部进行分组。大多数时候,它都是同一个人。

支持向量机,神经网络,朴素贝叶斯分类器或贝叶斯网络等一些机器学习技术最适合这类问题。我已经写了前三个中的一个来分类手写数字,这实际上是图像模式识别。

答案 4 :(得分:0)

将图像调整为1x1像素...如果它们是精确的,那么它们是相同图片的可能性很小...... 现在将其调整为2x2像素图像,如果所有4个像素都是精确的,那么它们的概率就越大...... 然后3x3,如果所有9个像素都是准确的......好机会等等。 然后4x4,如果所有16个像素都是精确的,......更好的机会。

等...

这样做,你可以提高效率...如果1x1像素网格大量关闭,为什么还要检查2x2网格呢?等

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

你可以使用diff来看看它们是否真的不同......我猜它会删除许多无用的比较。然后,对于算法,我会使用概率方法......它们看起来相同的几率是多少......我的基础是每个像素中的rgb量。你还可以找到一些其他指标,如光度和类似的东西。

答案 7 :(得分:-1)

DPEG“重复媒体管理器”,但其代码未打开。这是一个非常古老的工具 - 我记得在2003年使用它。