我使用图像库rmagick
来比较两个图像,以便检测它们是否实际上是同一个图像(避免重复)。
我通常使用difference方法:
require 'rmagick'
img1.difference(img2)
#=> [238.738932291668, 0.001389172567175018, 0.0184313725490196]
上面的例子是两幅图像的输出,这些图像肯定是相同的。这对我来说非常好用,直到我偶然发现一个新方案,这个方法处理得不好 - 如果图像是相同的(甚至相同的大小),但其中一个已被裁剪,例如10px的边界。现在突然间,即使这两个图像看起来与人眼完全相同,计算机也会认为它们非常不同,因为其中一个图像只被裁剪了一小部分。
无论如何我可以处理这种情况,所以我仍会发现它是相同的图像,即使其中一个被裁剪了一点?
答案 0 :(得分:1)
虽然您的示例图片可能看起来与人类非常相似,但原始图像数据看起来非常不同。
您需要一些更复杂的图像处理算法,它不会比较原始数据,但对转换,缩放或旋转等操作不变。
一般来说,我建议您使用像OpenCV这样的计算机视觉库;它也有ruby bindings。您可以在文档的Image Moments部分中查看所谓的this。标准化的中心矩nu_ij应该对平移和缩放不变;如果你为这两个图像计算这些图像并进行比较,那么对于略微裁剪的图像,你应该得到接近相同的值。