2张图片具有相同的颜色,图案等。一个图像从另一个图像裁剪。我发现的算法主要使用位置来比较图像之间的差异,因此它会对裁剪后的图像产生错误的结果。如何知道这2张图片是否相似?
谢谢
答案 0 :(得分:2)
您确实需要提供更多信息,但也许您可以使用互相关算法?您基本上将裁剪后的图像滑过图像中的每个点以匹配,并找到相似性。如果存在匹配超过特定阈值的点,则可以假设较小的图像是该位置中较大图像的子集。
使用FFT算法而不是实际滑动算法可以大大加快这个过程。
维基百科称之为“phase correlation”
MATLAB示例:Registering an Image Using Normalized Cross-Correlation
(来源:mathworks.com)
答案 1 :(得分:1)
了解有关您的问题域的更多信息会很有帮助。例如,您是否试图挑选出裁剪样本来自100张图像中的哪一幅?或者您甚至不知道裁剪样本是否来自图书馆中的任何图像?
我不是图像处理专家,但我使用过一种或一些东西。首先要想到的是,您可以尝试进行某种颜色平均,看看是否可以创建一个可以让您找到可能的候选者的启发式算法。
查找裁剪样本的平均RGB。然后,要查看它是否与样本匹配,请在图像中的多个点中找到局部RGB颜色平均值。如果裁剪的RBG平均值与图像中的所有局部平均值相差太远,则它们很可能不相关。
一旦你缩小了一些候选人,找到确切的位置仍然会很棘手。尝试处理图像的子采样版本。如果原点。图像为2000x2000,对两个图像进行二次采样,得到200x200的主图像。对裁剪后的图像执行相同的子样本,并查看最适合的位置。然后迭代地减少子采样量并微调裁剪图像的确切位置。你仍然在做一些蛮力,但它的图像要小100倍。
答案 2 :(得分:1)
这可能有点矫枉过正,但我会查看SIFT算法。它通常用于排列全景图像。
答案 3 :(得分:0)
糟糕!多年前我对抗这个问题,但我从来没有为我的问题找到可行的答案。我已经有了一些想法,因为我没有尝试实施,我会抛弃它们以防它们对你有任何好处:
我不同意Al Crowley关于平均RGB值的陈述 - 裁剪很可能是移除一个与目标完全不同的物体。
此外,还有一个观察结果:将图像缩小为8x8缩略图(对于人眼来说不够大)并且取每个组件差异的平方,可以很好地挑选出重复的图像,即使是小作物也可以使用在边缘。理想情况下,对比度应该在缩略图之前进行标准化,我没有这样做,并且发现当它们完全没有相似性时,宣称一堆低对比度图像是彼此的欺骗。这种方法每个图像只使用192个字节,因此允许您比较内存中的大量图像,尽管它仍然是O(n ^ 2)算法。 (我这样做是为了你可以随时关闭程序,它会转储状态信息并关闭,下次它会从中断处继续。)
鉴于您所描述的问题,我倾向于尝试对图像进行一组测试作物并对每种作物进行比较。当你找到一个可能的候选人然后开始使用更大的图像,并尝试通过慢跑几个像素缩小它,看看它是好还是坏。除了这样的例行公事,我无法想象其他任何事情。
答案 4 :(得分:0)
如果你使用OpenCV,你想要的功能是MatchTemplate(),然后MinMaxLoc()来找到最佳匹配。