【发布时间】:2010-09-25 01:32:30
【问题描述】:
有时两个图像文件在文件级别上可能不同,但人们会认为它们在感知上是相同的。鉴于此,现在假设您有一个庞大的图像数据库,并且您想知道人类是否会认为数据库中存在某些图像 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();
edit: 警告! ImageMagick $image 对象似乎包含有关读取的图像文件的创建时间的信息。这意味着即使对于相同的图像,您获得的 blob 也会有所不同,如果它是在不同的时间检索到的。为确保指纹保持不变,请使用 $image->getImageSignature() 作为最后一步。
【问题讨论】:
-
这个过程听起来非常消耗处理器。
-
这意味着即使是同一张图片,如果在不同时间检索到的 blob 也会有所不同。
"$blob"字符串不是这样(如果放在双引号中),如果图像像素相同,那将是完全相同的 32 个字节。
标签: algorithm image image-processing hash