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

C# 如何比较两个图像以检测重复和裁剪的重复?,c#,.net,image-processing,zero-pad,C#,.net,Image Processing,Zero Pad,我如何比较两幅图像并确定它们是否100%相似,或者只是在颜色或裁剪上有所改变?以下是一种相当简单的方法来解决这个问题,并且无法从稍微不同的角度拍摄同一主题的两张不同照片,但是,如果您有两份要验证的同一图像的副本,则可以使用 两个相同图像的情况很简单——只需循环通过像素阵列从另一个图像减去RGB值即可。如果差异小于小公差,则像素相同。因此,一旦您发现像素差异大于公差,您就知道图像是不同的 您可以考虑一定数量或百分比的差异,以考虑压缩人工制品引起的差异 要检查颜色的变化,可以查看HLS(色调、亮度和

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

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

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

您可以考虑一定数量或百分比的差异,以考虑压缩人工制品引起的差异

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


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

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

  • 比较图像的大小
  • 如果图像大小相同,只需相互减去像素即可
  • if(sum(abs(pixel_1_i-pixel_2_j))/num_pixels
对于不同颜色或裁剪的图像

  • 对两幅图像应用边缘检测器
  • 计算互相关(在频域中,FFT)
  • 找到最高峰
  • 将(较小的)边贴图放置在确定的位置
  • 计算绝对误差
  • if(错误<阈值)返回true
顺便说一句:如果您的图像被缩放或旋转,这种方法将不起作用

进一步研究:

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

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

筛选-

冲浪

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

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


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

您是说经过人工着色的精确副本吗?或者你指的是同一事物的两张不同的图片。这可能会在方法上产生显著的不同。我只寻找经过数字修改的拷贝,包括彩色拷贝。这里不可能使用校验和方法…这是非常有趣和有用的。我必须确定如何处理每种图像格式。这应该是像素的内部循环,还是在不循环所有像素的情况下可以工作“如果(sum(abs(pixel_1_I-pixel_2_j))/num_pixels