如何比较两个图像以检测重复和裁剪重复?

时间:2010-11-04 04:12:22

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

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

3 个答案:

答案 0 :(得分:3)

嗯,抽象地说,你需要定义一个比较两个图像的相似度函数。要确定图像是否“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一样)

答案 1 :(得分:2)

以下是一个相当简单的问题解决方法,对于同一主题的两张不同照片从略微不同的角度拍摄效果不佳,但是如果你有两张同样想要验证的图像副本就可以使用

两个相同图像的情况很简单 - 只需循环通过像素阵列从另一个中减去RGB值。如果差异小于小公差,则像素是相同的。因此,只要您发现像素差异大于公差,就会知道图像不同。

您可以允许一定数量或百分比的差异,以允许压缩文物产生差异。

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

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

答案 2 :(得分:1)

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

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

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

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

描述符也包括定向渐变,这意味着这些描述符对照明和颜色变化也很稳健。

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