图像处理之模板匹配

本文介绍了模板匹配的基本原理和工作方式,包括其简单直接的优点和旋转、尺度不变性的缺点。接着讨论了利用Surf算法进行图像匹配的流程,并展示了匹配效果。最后,探讨了FAsT-Match快速模板匹配算法,强调其在2D仿射变换下的效率和近似保证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板匹配法

       模板匹配是一种用于在源图像S中寻找定位给定目标图像T(即模板图像)的技术。其原理很简单,就是通过一些相似度准则来衡量两个图像块之间的相似度Similarity(S,T)。

模板匹配的工作方式

       模板匹配的工作方式跟直方图的反向投影基本一样,大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配。假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:

 (1)从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;

 (2)用临时图像和模板图像进行对比,对比结果记为c;

 (3)对比结果c,就是结果图像(0,0)处的像素值;

 (4)切割输入图像从(0,1)至(10,11)的临时图像,对比,并记录到结果图像;

 (5)重复(1)~(4)步直到输入图像的右下角。

模板匹配方法的优缺点:

       优点:简单、直接

       缺点:不具有旋转不变性、不具有尺度不变性

	代码如下:  
	int main()  
	{  
	    Mat img, templ, result;  
	    img = imread("match_dst.jpg");  
	    templ = imread("match_src.jpg");  
	    /*img = imread("1.jpg"); 
	    templ = imread("2.jpg");*/  
	
        int result_cols = img.cols - templ.cols + 1;  
	    int result_rows = img.rows - templ.rows + 1;  
	    result.create(result_cols, result_rows, CV_32FC1);  
	  
	    //进行匹配和标准化  
	    matchTemplate(img, templ, result, CV_TM_SQDIFF_NORMED);  
	    normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());  
	  
	    double minVal;  //匹配最小值  
	    double maxVal;  //匹配最大值  
	    Point maxLoc;  //匹配最大值的位置坐标  
        Point minLoc;   //匹配最小值的位置坐标  
	    Point matchLoc;    
	  
	    //通过函数minMaxLoc定位最匹配的位置  
	    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());  
	  
	    cout << "匹配度:" << minVal << endl;  
	    cout << "匹配度最小值的坐标" << minLoc.x << "," << minLoc.y << endl;  
	  
	    /*Mat H = findHomography(templ,img, CV_RANSAC); 
	 
	    Mat trans1
#模板匹配 import cv2 as cv import numpy as np def template_demo(): dog = cv.imread("E:/opencv/picture/dog.jpg") dog_nose = cv.imread("E:/opencv/picture/nose.jpg") cv.imshow("dog",dog) result = cv.matchTemplate(dog,dog_nose,cv.TM_CCORR_NORMED) h,w =dog_nose.shape[:2] min_val,max_val,min_loc,max_loc=cv.minMaxLoc(result) pt1 = max_loc pt2 = (pt1[0]+w,pt1[1]+h) cv.rectangle(dog,pt1,pt2,(0,255,0),2) cv.imshow("match",dog) print(result) #src = cv.imread("E:/opencv/picture/dog.jpg") #cv.imshow("inital_window",src) template_demo() cv.waitKey(0) cv.destroyAllWindows() 分析: 模板匹配通常用于目标检测。本文我们检测狗图片的鼻子。 • 我们需要两个主要组件: 1. 源图像(I):我们期望找到与模板图像匹配的图像 2. 模板图像(T):将与模板图像进行比较的补丁图像 1. result = cv.matchTemplate(dog,dog_nose,cv.TM_CCORR_NORMED) void cv::matchTemplate( cv::InputArray image, // 待匹配图像W*H cv::InputArray templ, // 模板图像,和image类型相同, 大小 w*h cv::OutputArray result, // 匹配结果图像, 类型 32F, 大小 (W-w+1)*(H-h+1) int method // 用于比较的方法 ); 其中method有: TM_SQDIFF_NORMED匹配数值越低表示匹配效果越好 TM_CCORR_NORMED,TM_CCOEFF_NORMED匹配数值越大表示匹配效果越好 result参数:(保存各个点匹配结果的参数) 模板匹配函数cvMatchTemplate依次计算模板与待测图片的重叠区域的相似度,并将结果存入映射图像result当中,也就是说result图像中的每一个点的值代表了一次相似度比较结果 模板在待测图像上每次在横向或是纵向上移动一个像素,并作一次比较计算 我们可以通过cv.minMaxLoc函数来确定结果矩阵的最大值和最小值的位置。 2. cv.minMaxLoc(result) 返回result数值中最小值以及最小值所在的位置和最大值以及最大值所在的位置。 3. 当知道哪个点匹配度最高时这个时候我们需要用矩阵把模板给标出来 C++: void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0) 第一个参数:要在哪个图像上画? 第二个参数:矩阵的左上角点坐标 第三个参数:矩阵的右下角点坐标 第四个参数:颜色
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值