有时两个图像文件在文件级别上可能不同,但人类会认为它们在感知上是相同的.鉴于此,现在假设您有一个庞大的图像数据库,并且您希望知道人是否会认为数据库中存在某些图像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()作为最后一步.
findimagedupes非常好.例如,您可以运行"findimagedupes -v指纹图像"让它打印"感知哈希".
即使有噪声,降级,水平或垂直偏移,互相关或相位相关也会告诉您图像是否相同.使用基于FFT的方法将使其比问题中描述的算法快得多.
但是,通常的算法不适用于不同比例或旋转的图像.您可以预先旋转或预缩放它们,但这确实是处理器密集型的.显然你也可以在对数极坐标空间中进行相关,它对旋转,平移和缩放都是不变的,但我不太清楚这些细节来解释它.
MATLAB示例:使用归一化互相关注册图像
维基百科称之为" 相位相关 ",并且还描述了使其具有缩放和旋转不变性:
通过首先将图像转换为对数极坐标,可以扩展该方法以确定两个图像之间的旋转和缩放差异.由于傅立叶变换的特性,可以以对平移不变的方式确定旋转和缩放参数.