【问题标题】:How can I compare two images to detect duplicates and cropped duplicates?如何比较两张图像以检测重复和裁剪的重复?
【发布时间】:2011-05-04 21:03:17
【问题描述】:

我如何比较两张图片并确定它们是否 100% 相似,或者只是颜色有所改变或裁剪?

【问题讨论】:

  • 您指的是经过人工着色的精确复制品吗?或者你的意思是同一件事的两张不同的照片。它可能会对方法产生重大影响。
  • 我只是在寻找经过数字修改的副本,包括彩色副本。没有校验和方法可能在这里工作......

标签: c# .net image-processing zero-pad


【解决方案1】:

嗯,抽象地说,您需要定义一个相似度函数,用于比较两个图像。要确定图像是否“100% 相似”(相等),您可以执行以下操作:

  • 比较图片的大小
  • 如果图像大小相同,只需将像素彼此相减
  • if ( sum( abs( pixel_1_i - pixel_2_j ) ) / num_pixels < threshold ) return true

对于图像颜色不同或被裁剪的情况

  • 对两个图像应用边缘检测器
  • 计算互相关(在频域中,FFT)
  • 找到最高峰
  • 将(较小的)边缘图放置在确定的位置
  • 计算绝对误差
  • if (error < threshold) return true

顺便说一句:如果您的图像被缩放或旋转,这种方法将不起作用。

进一步研究:

  • cross-correlation:FFT(快速傅立叶变换,link1link2FFT in C#),零填充(如果输入信号大小不同,则需要 FFT)
  • 边缘检测:SobelCanny(这些是非常常见的图像处理过滤器,它们应该在 C# 库中可用,就像 FFT 一样)

【讨论】:

  • 这应该是在像素循环内部还是可以在不循环遍历所有像素的情况下工作“if (sum(abs(pixel_1_i - pixel_2_j)) / num_pixels
  • 您引用的那条线应该是绝对差异的总和,因此对所有像素执行此操作是有意义的。如果您必须将其与许多其他图像进行比较,您可以模糊图像并将其缩小。
  • 我从来没有用过 C# 编码...只是谷歌一下或者打开一个新问题,这样你就可以获得更多合格的帮助。
【解决方案2】:

以下是解决问题的一种相当简单的方法,不适用于从稍微不同的角度拍摄的同一主题的两张不同照片,但如果您有两张要验证的相同图像的副本,则可以使用.

两个相同图像的情况很简单 - 只需遍历像素数组,从另一个中减去 RGB 值。如果差异小于小容差,则像素是相同的。因此,一旦您发现像素差异大于容差,您就知道图像是不同的。

您可以允许一定数量或百分比的差异,以允许由压缩伪影引起的差异。

要检查颜色的变化,您可以查看 HLS(色相、亮度和饱和度)值。如果像素具有相同的 L 和 S 值但不同的 H 值,那么只是颜色不同(我认为)。

裁剪比较困难,因为您必须尝试在较大的图像中找到较小图像的位置。

【讨论】:

  • 这很有趣也很有帮助。我必须确定如何处理每种图像格式。
【解决方案3】:

您可以使用对象描述符,例如:

SIFT - http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

冲浪 - http://en.wikipedia.org/wiki/SURF

然后使用计算的描述符比较图像。这些描述符将使您能够处理旋转、缩放和轻微变化的图像。

此外,描述符由定向梯度组成,这意味着这些描述符对光照和颜色变化也很稳健。

您可以使用 Accord.NET(SURF 实现)。

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2013-01-18
    • 2020-05-17
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多