比较两张图片,其中一张被略微裁剪(缩放)

4
我正在使用ruby的图片库rmagick来比较两个图片,以便检测它们是否是同一张图片(避免重复)。
我通常的做法是使用difference方法:
require 'rmagick'

img1.difference(img2)
#=> [238.738932291668, 0.001389172567175018, 0.0184313725490196]

上面的示例是两个图像的输出,它们肯定是相同的。这对我来说曾经非常有效,直到我遇到一个新的场景,这种方法处理得不太好-如果图像是相同的(甚至是相同的大小),但其中一个图像已经被裁剪了例如10px的边框。现在突然间,即使两个图像在人眼中看起来完全相同,计算机也会认为它们非常不同,因为其中一个图像只被裁剪了一点点。
有没有办法处理这种情况,以便我仍然可以检测到它们是相同的图像,即使其中一个图像被裁剪了一点点?

1
这是一个棘手的主题领域。有很多可能有效的裁剪方式,而且并不完全清楚你想要允许多极端的裁剪。你需要仔细定义“相同”。最好给出您的图像匹配目标 - 不一定能够实现,但它可能有助于避免解决机器视觉问题,这样的问题可能会退化。 - Neil Slater
肯定一个故意裁剪的图像不是重复的,如果这是用于内容管理系统(CMS)等方面,那么您可以将裁剪版本视为原始版本的修订。它只是一种微妙的编辑。您要避免什么样的重复 - 版权侵犯吗? - Neil Slater
1个回答

1

虽然您的示例图片可能看起来与人类非常相似,但原始图像数据却非常不同。

您需要一些更复杂的图像处理算法,它不会比较原始数据,而是对操作(如转换、缩放或旋转)具有不变性。

通常,我建议您使用计算机视觉库,例如 OpenCV;它也有 ruby绑定。您可以在文档的 this 部分中查看所谓的 图像矩。归一化中心矩 nu_ij 应该对平移和缩放具有不变性;如果您为两个图像计算这些值并进行比较,则应该得到略微裁剪的图像的几乎相同的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接