【问题标题】:Detecting if two images are visually identical检测两个图像在视觉上是否相同
【发布时间】: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


【解决方案1】:

您可以使用 diff 来查看它们是否真的不同。我想它会消除很多无用的比较。然后,对于算法,我将使用概率方法..它们看起来相同的可能性有多大..我会根据每个像素中的 rgb 数量来计算。您还可以找到其他一些指标,例如亮度和类似的东西。

【讨论】:

    【解决方案2】:

    findimagedupes 很不错。例如,您可以运行“findimagedupes -v 指纹图像”让它打印“感知哈希”。

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      等等……

      这样做,您可以提高效率...如果 1x1 像素网格偏离很多,为什么还要检查 2x2 网格?等等

      【讨论】:

      • 这不适用于对一张图像进行了轻微调整,使其稍微更暗或更饱和,或者被裁剪了少量的情况。您还必须考虑到重采样是一项代价高昂的事情,尤其是在对大图像使用双三次插值时。
      • 当然,第一步是将原始图像缩小到最小尺寸。 “山上的树”图像无需为 10GB 即可与“山上的花”图像区分开来。
      【解决方案5】:

      DPEG"The" Duplicate Media Manager,但它的代码没有打开。这是一个非常古老的工具 - 我记得在 2003 年使用它。

      【讨论】:

      • 为什么投了两次反对票?用户要求的是命令行工具,而不是编程解决方案。
      • @pts:链接对我来说没有损坏;它重定向到当前链接。无论如何,我已经更新了答案。
      【解决方案6】:

      如果您有很多图像,在对每张图像进行完整图像比较之前,可以使用颜色直方图来获得图像的粗略接近度(即 O(n^2))。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多