如何比较两张图像并确定它们是否 100% 相似,或者只是颜色改变或裁剪?
3 回答
嗯,抽象地说,你需要定义一个相似度函数,比较两个图像。要确定图像是否“100% 相似”(相等),您可以执行以下操作:
- 比较图像的大小
- 如果图像大小相同,只需将像素彼此相减
if ( sum( abs( pixel_1_i - pixel_2_j ) ) / num_pixels < threshold ) return true
对于图像颜色不同或裁剪的情况
- 对两个图像应用边缘检测器
- 计算互相关(在频域中,FFT)
- 找到最高峰
- 将(较小的)边缘图放置在确定的位置
- 计算绝对误差
if (error < threshold) return true
顺便说一句:如果您的图像被缩放或旋转,这种方法将不起作用。
进一步的研究:
以下是解决该问题的一种相当简单的方法,并且不适用于从稍微不同的角度拍摄的同一主题的两张不同照片,但如果您有两个要验证的相同图像的副本,则可以使用。
两个相同图像的情况很简单 - 只需遍历像素数组,从另一个中减去 RGB 值。如果差异小于小容差,则像素是相同的。因此,一旦您发现像素差异大于容差,您就知道图像是不同的。
您可以允许一定数量或百分比的差异,以允许由压缩伪影引起的差异。
要检查颜色的变化,您可以查看 HLS(色相、亮度和饱和度)值。如果像素具有相同的 L & S 值但不同的 H 值,那么只是颜色不同(我认为)。
裁剪更加困难,因为您必须尝试在较大的图像中找到较小图像的位置。
您可以使用对象描述符,例如:
SIFT - http://en.wikipedia.org/wiki/Scale-invariant_feature_transform
冲浪 - http://en.wikipedia.org/wiki/SURF
然后使用计算的描述符比较图像。这些描述符将使您能够处理旋转、缩放和略有变化的图像。
此外,描述符由定向梯度组成,这意味着这些描述符对照明和颜色变化也具有鲁棒性。
您可以使用 Accord.NET(SURF 实现)。