3

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

4

3 回答 3

4

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

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

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

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

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

进一步的研究:

  • 互相关:FFT(快速傅立叶变换,link1link2C#中的 FFT),零填充(如果输入信号具有不同大小,则需要 FFT)
  • 边缘检测:SobelCanny(这些是非常常见的图像处理过滤器,它们应该在C#库中可用,就像 FFT 一样)
于 2010-11-04T12:51:48.600 回答
2

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

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

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

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

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

于 2010-11-04T12:18:28.897 回答
1

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

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

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

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

此外,描述符由定向梯度组成,这意味着这些描述符对照明和颜色变化也具有鲁棒性。

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

于 2014-04-12T22:59:34.273 回答