图像处理中的模板匹配

目录

概念:

原理:

问题:

方法的基本分类:


概念:

把对同一景物在不同时间、不同成像条件下获取的多幅图像在空间上对准;根据已知模式到另一幅图中寻找相应模式的处理方法。

原理:

在待搜寻的图像中,移动模板图像,在每个位置测量待搜寻图像的子图像和模板图像的差值,当相似度最大时,记录其相应位置,完成匹配。

 搜索域:以两幅图像的原点为参考点,参考图像R在待 搜寻图像 I 中平移(r,s)个单位,所能移动的最大区域为搜索区域。

将模板图像块,从左到右,从上到下,每次移动一个像素。在每一个位置上,都进行一次计算来度量匹配的好坏程度。把度量值保存到结果图像矩阵R中,在R的每个位置(x,y)上都存有一个度量值。最后,利用MinMaxLoc函数来定位矩阵中的最大值或最小值,找到最佳匹配区域。

问题:

        1.如何选取合适的距离测量方法?

        2.如何处理不同亮度下的情况?

        3.相似度的阈值设置(达到多少才算匹配成功)?

方法的基本分类:

1.基于像素的模板匹配根据模板图像和待匹配图像中子图像的灰度信息计算两者的相似度

        优点:操作简单,易于实现;

        缺点:该方法基于图像的灰度信息,易受光照影响;抗干扰能力差,在遮挡或模糊情况下很难识别;计算量大,运行速度慢。

2.基于特征的模板匹配首先提取出输入图像的特征点,通过算法求出对应的特征,然后得到这些特征点之间的函数关系。

        优点:对灰度值不敏感;对目标的旋转、尺度变化和光照变化等因素具有很好的鲁棒性;

        缺点:特征提取的好坏决定这模板匹配的好坏;在特征的数量不足的情况下结果较差(eg,天空,海洋)。

        常用特征:点、线、面

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#模板匹配 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) 第一个参数:要在哪个图像上画? 第二个参数:矩阵的左上角点坐标 第三个参数:矩阵的右下角点坐标 第四个参数:颜色
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值