模板匹配原理与实现

模板匹配

模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.通过目标图片在待匹配图片进行遍历,通过选择一定的匹配方式能够得到每个起始像素点的匹配值,最终匹配值最大的位置就是候选匹配位置,也就达到了匹配查找的效果。

本例是通过鼠标选取图像中的一块矩形区域,遍历原图像后得到一个匹配值矩阵,将矩阵转换成0-255的灰度图像形式显示出来,实验结果图如下


参考代码

#decoding:utf-8  
#!/usr/bin/env python  
import numpy as np  
from math import *  
import sys  
import os  
import glob  
import argparse  
import cv2 as cv  
  
drag_start = None#全局变量取方块鼠标拖拽时使用  
sel = (0,0,0,0)#全局变量 长方形左上颌右下定点坐标存储  
  
def onmouse(event, x, y, flags, param):#鼠标事件响应函数  
    global drag_start, sel   
    if event == cv.EVENT_LBUTTONDOWN:#左键按下时记录当前初始坐标,并初始化矩形sel  
        drag_start = x, y  
        sel = 0,0,0,0  
    elif event == cv.EVENT_LBUTTONUP:#鼠标左键叹弹起时响应  
        if sel[2] > sel[0] and sel[3] > sel[1]:#判断右下角坐标是否大于左上角  
            patch = gray[sel[1]:sel[3],sel[0]:sel[2]]#取矩形区域内像素作为patch图像  
            result = cv.matchTemplate(gray,patch,cv.TM_CCOEFF_NORMED)  
            result = np.abs(result)**3  
            val, result = cv.threshold(result, 0.01, 0, cv.THRESH_TOZERO)#将低于0。01的值赋值为0  
            result8 = cv.normalize(result,None,0,255,cv.NORM_MINMAX,cv.CV_8U)#将result转化到0-255区间  
            cv.imshow("result", result8)  
        drag_start = None  
    elif drag_start:  
        #print flags  
        if flags & cv.EVENT_FLAG_LBUTTON:#取当前坐标与初始坐标较小的为矩形坐标左上,较大的为右下  
            minpos = min(drag_start[0], x), min(drag_start[1], y)  
            maxpos = max(drag_start[0], x), max(drag_start[1], y)  
            sel = minpos[0], minpos[1], maxpos[0], maxpos[1]  
            img = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)  
            cv.rectangle(img, (sel[0], sel[1]), (sel[2], sel[3]), (0,255,255), 1)  
            cv.imshow("gray", img)  
        else:  
            print "selection is complete"  
            drag_start = None  
              
if __name__ == '__main__':  
    parser = argparse.ArgumentParser(description='Demonstrate mouse interaction with images')  
    parser.add_argument("-i","--input", default='../', help="Input directory.")  
    args = parser.parse_args()  
    path = args.input#获取图像路径参数  
   
    cv.namedWindow("gray",1)  
    cv.setMouseCallback("gray", onmouse)  
    '''''Loop through all the images in the directory'''  
    for infile in glob.glob( os.path.join(path, '*.*') ):#遍历文件夹下的图片文件  
        ext = os.path.splitext(infile)[1][1:] #get the filename extenstion  
        if ext == "png" or ext == "jpg" or ext == "bmp" or ext == "tiff" or ext == "pbm":  
            print infile  
              
            img=cv.imread(infile,1)  
            if img == None:  
                continue  
            sel = (0,0,0,0)  
            drag_start = None  
            gray=cv.cvtColor(img, cv.COLOR_BGR2GRAY)  
            cv.imshow("gray",gray)  
            if (cv.waitKey() & 255) == 27:  
                break  
    cv.destroyAllWindows() 


关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值