如何在图像之间实现完美匹配?

时间:2016-12-06 16:09:49

标签: python opencv

这是我找到的链接 How do I find an image contained within an image

我在上面的链接中获得了代码。

这是我的代码

import re
import os
import time
import cv2
from cv2 import cv

METHOD = cv.CV_TM_SQDIFF_NORMED

ROOTDIR = 'GeneralIMG/'

# Load The Deck Img
LARGE_IMAGE = cv2.imread('deck.bmp')

for subdir, dirs, files in os.walk(ROOTDIR):
    for myfile in files:
        filepath = os.path.join(subdir, myfile)

# Read the images from the file
        # small_image = cv2.imread(myfile)
        # small_image = cv2.imread('GeneralIMG/cfrB.bmp')
        Ffile = subdir + myfile 
        small_image = cv2.imread(Ffile)

        result = cv2.matchTemplate(small_image, LARGE_IMAGE, METHOD)

# We want the minimum squared difference
        mn,_,mnLoc,_ = cv2.minMaxLoc(result)
        MPx,MPy = mnLoc
        if MPx == 0 and MPy == 0:
            print 'Match failure!'
        else:
            print MPx, MPy
            print re.sub(r"B|D", "", os.path.splitext(myfile)[0])

# Draw the rectangle:
# Extract the coordinates of our best match
        MPx,MPy = mnLoc

# Step 2: Get the size of the template. This is the same size as the match.
        trows,tcols = small_image.shape[:2]

# Step 3: Draw the rectangle on LARGE_IMAGE
        cv2.rectangle(LARGE_IMAGE, (MPx,MPy),(MPx+tcols,MPy+trows),(0,0,255),2)

# Display the original image with the rectangle around the match.
        cv2.imshow('output',LARGE_IMAGE)

# The image is only displayed if we call this
        cv2.waitKey(0)
        # time.sleep(5)

这是我想在大图中找到的小图片,但是大图片不包含小图片。令我惊讶的是,matchTemplate仍然得到了结果。

12~07_00-03-03.bmp http://7xpvdr.com1.z0.glb.clouddn.com/12~07_00-03-03.bmp

但我得到的比赛结果不够精确,如下图所示。 红色矩形是匹配结果。

12~07_00-01-58.bmp http://7xpvdr.com1.z0.glb.clouddn.com/12~07_00-01-58.bmp

在这里,我希望在大型照片中找到完全相同的照片。如果不包含它,只需返回false即可。我不想进行模糊搜索,我该怎么办?

---更新---

这是小img:

small img

这是原始较大的bmp图像

large image

上传图像时,格式将会改变。小img是png文件,较大的是bmp。

我想知道matchtemplate是否在这里使用模糊搜索。所以我在这里得到错误搜索结果的问题似乎是合理的。我想知道如何准确地进行搜索。谢谢〜

更新:

我查看了[matchtemplate]的文档

我发现这意味着它是最佳匹配搜索不完美匹配。

那我怎样才能让它完美匹配?

什么是模板匹配? 模板匹配是一种用于查找与模板图像(补丁)匹配(相似)的图像区域的技术。

2 个答案:

答案 0 :(得分:1)

您是否尝试对minMaxLoc给出的结果应用阈值?

我从未使用过matchTemplateminMaxLoc,所以我不知道它是如何运作的,但据我所知,如果你想要的是一个完美的匹配,那么你的价值就是寻找可能是0(或1,取决于您的METHOD参数)。因此,如果你丢弃其他所有价值,除非你有完美的匹配,否则你不应该得到积极的结果。

答案 1 :(得分:0)

您可以使用 cv.matchTemplate 获得完美匹配: 使用方法 cv.TM_SQDIFF 和阈值 <= 1/16

结果的绝对值

从数学上讲,所有具有完美匹配的补丁都应具有 0 的平方差异,而不是 [-0.0625,0.0625]。但是,在实际实现 cv.matchTemplate 中的优化导致了细微的差异(至少 OpenCV 4.5.1 中使用的函数 ippiSqrDistanceNorm 是针对 uint8 输入和 3x3 uint8 掩码所做的)

请注意,匹配是从左/上角开始进行比较,而不是从模板的中心开始,因此如果您想获得与模板完全相同的所有像素,则必须添加模板宽度一半的偏移量和身高。