2010-11-04 87 views
3

如何比较两幅图像并确定它们是否100%相似,或只是改变了颜色或裁剪?如何比较两张图像来检测重复项和裁剪重复项?

+0

您是否在谈论人工染色的确切副本?或者你的意思是同一件事的两张不同的照片。这可能会在方法上产生重大影响。 – Pace 2010-11-04 12:16:46

+0

我只是在寻找数字修改过的拷贝,包括彩色拷贝。没有校验和的方法可能会在这里工作... – LamonteCristo 2010-11-04 19:49:44

回答

2

以下是一个相当简单的方法来解决这个问题,并且对于从不同角度拍摄的同一主题的两张不同照片将无法很好地工作,但是如果您有两张您想要的相同图像的副本校验。

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

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

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

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

+0

这是非常有趣和有益的。我必须确定如何针对每种图像格式进行处理。 – LamonteCristo 2010-11-04 19:53:27

3

好,抽象地说,你需要定义一个相似度函数,它比较两张图片。为了确定如果图像是“100%相似”(等于),可以执行以下操作:

  • 比较图像的尺寸
  • 如果图像尺寸是相同的简单地从彼此
  • 减去像素
  • if (sum(abs(pixel_1_i - pixel_2_j))/num_pixels < threshold) return true

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

  • 申请一封DGE检测器,用于两个图像
  • 计算的互相关(在频域中,FFT)
  • 找到最高峰
  • 发生在所确定的位置的(较小的)边缘映射
  • 计算绝对误差
  • if (error < threshold) return true

BTW:这种做法不会,如果你的图像缩放或旋转工作。

进一步研究:

  • cross-correlation:FFT(快速傅立叶变换,link1link2FFT in C#),零填充(所需FFT如果输入信号具有不同的尺寸)
  • 边缘检测: Sobel,Canny(这些是非常常见的图像处理滤波器,它们应该可在C#库中得到,就像FFT一样)
+0

这应该是在像素的循环内,或者可以在没有循环遍历所有像素的情况下工作“if(sum(abs(pixel_1_i - pixel_2_j))/ num_pixels Josh 2012-10-06 21:22:34

+0

您所引用的这一行应该是绝对差异的总和,因此对所有像素执行此操作是有意义的。如果您必须将其与其他图像进行比较,则可以模糊图像并将其缩小。 – bjoernz 2012-10-07 18:08:58

+0

你能帮我用C#代码吗? – Josh 2012-10-10 11:59:42