使用OpenCV在一张图像中查找相似的图像

3

我需要了解如何判断一张图片是否包含另外一张相似的图片。以下是两个例子:

在这张图片中:enter image description here,我需要找到这张图片:enter image description here

或者在这张图片中enter image description here,找到这张图片:enter image description here

我的想法是:给定一张输入图片和一组图标,在输入图片中查找哪些图标出现过。

我尝试使用 MatchTemplate、ORB 和 SIFT 进行特征匹配,但没有找到任何有效的匹配结果。

以下是我在 Go 中使用 MatchTemplate 的尝试:

package main

import (
    "fmt"
    "image/color"

    "gocv.io/x/gocv"
)

func main() {
    matImage := gocv.IMRead("/Users/pioz/Desktop/samplex.jpg", gocv.IMReadGrayScale)
    // gocv.Canny(matImage, &matImage, 200, 400)
    matTemplate := gocv.IMRead("/Users/pioz/Desktop/eld.jpg", gocv.IMReadGrayScale)
    // gocv.Canny(matTemplate, &matTemplate, 20, 40)
    matResult := gocv.NewMat()
    mask := gocv.NewMat()
    gocv.MatchTemplate(matImage, matTemplate, &matResult, gocv.TmCcoeffNormed, mask)
    mask.Close()
    minConfidence, maxConfidence, minLoc, maxLoc := gocv.MinMaxLoc(matResult)
    fmt.Println(minConfidence, maxConfidence, minLoc, maxLoc)

    gocv.Circle(&matImage, minLoc, 10, color.RGBA{0, 0, 255, 1}, 10)
    gocv.Circle(&matImage, maxLoc, 10, color.RGBA{0, 0, 255, 1}, 10)

    gocv.IMWrite("out/out.jpg", matImage)
}

你有没有什么建议或片段来解决这种问题?

分享一些代码。可能写错了一些bug。或者可能管道缺少一些过滤器。 - user4466350
@mh-cbon,我已经编辑了我的代码的问题。 - Pioz
很好。但是其中没有使用sift或orb。另一个线程中提到的模板匹配方法无法处理比例问题。它更像是补丁检测。如https://dev59.com/a1MH5IYBdhLWcg3w0DS9#58160295所解释的那样,“模板匹配不能直接帮助您匹配缩放、旋转或扭曲的物体。模板匹配严格关注于精确测量两个图像的相似性,就像它们出现的一样。” - user4466350
1
模板匹配是具有尺度和旋转敏感性的。它只寻找相同大小和方向的位置匹配。因此,如果模板和较大图像中的区域相似但大小不同,则除非尝试所有模板的大小,否则模板匹配将无法工作。有专门的工具用于进行尺度和旋转不变的模板匹配。但我不确定它们是否存在于OpenCV中。 - fmw42
@fmw42 我已经尝试过使用相同比例和方向的模板来运行我的示例,但是我找不到任何有效的匹配。 - Pioz
@Pioz 这很可能是由于颜色差异和对比度反转(白字黑底与蓝字黑底相比)造成的。也许在边缘提取图像上进行模板匹配会更好。 - fmw42
2个回答

1
我相信这个问题已经被问过了 - 这里
模板匹配被认为是这种图像处理的最佳技术之一。所以,如果它对你不起作用,请尝试审查/分享你已经实现的代码。

2
你所链接的问题的答案是:“这可以通过模板匹配来完成。简而言之(我的理解),模板匹配会在另一张图片中寻找一个_完全_匹配的图像。”但在我的情况下,它并不是完全匹配,实际上我需要找到的图标是相似的,而不是完全相同的。 - Pioz
请注意,在您的情况下,您可以尝试使用 https://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/ 中描述的各种比例进行模板匹配。 - user4466350
@Pioz,问题在于,作为人类,您拥有先进的大脑,可以识别相似但不同的事物。但是您使用哪些参数呢?如果您使用颜色,或者使用结构/边缘,您将得到不同的图像。在找到适合您的算法之前,您需要在数学上定义“相似”。 - Ander Biguri

1

这个链接与OpenCV有关,它解释了特征匹配和不同的技术。还有一些带有代码的示例,可能会有用。如果SIFT不能给出令人满意的结果,请尝试仿射SIFT或ASIFT


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