模板匹配函数python 模板匹配函数

模板匹配概述【模板匹配函数python 模板匹配函数】 模板匹配是通过一张模板图片去另一张图中找到与模板相似部分的一种算法 。一个模板是一张小图片,这个图片有一定的尺寸,有角度(一般是不旋转的矩形 ,  角度为0) 。
模板匹配算法一般是通过滑窗的方式在待匹配的图像上滑动,通过比较模板与子图的相似度,找到相似度最大的子图 。这种算法最核心部分在于如何设计一个相似性函数 。
最容易想到的一个相似性函数便是欧式距离:
将这个相似性函数展开,可以得:
可以看出,只有第二项是有意义的,因为第一项和第三项的值在选定模板后是固定的 。对于欧式距离相似函数,值越大表示越不相似,也就是说,第二项的值越小则越不相似 。
将第二项进行归一化:
那么当R(i, j)为1时,表示模板与子图完全相等 。
cv::matchTemplate(const CvArr* image, //欲搜索的图像 。它应该是单通道、8-比特或32-比特 浮点数图像
const CvArr* template,//搜索模板,不能大于输入图像,且与输入图像具有一样的数据类型
CvArr* result, //比较结果的映射图像 。单通道、32-比特浮点数.
若图像是W×H而templ是w×h,则result一定是(W-w+1)×(H-h+1)
int method//CV_TM_SQDIFF、CV_TM_SQDIFF_NORMED、CV_TM_CCORR、
CV_TM_CCORR_NORMED、CV_TM_CCOEFF、CV_TM_CCOEFF_NORMED
);
函数来进行模板匹配 。其中的method参数具体如下:
在通过matchTemplate函数进行模板匹配后,可以得到一个映射图,这张图中最大值的地方便是匹配度最大的子图的左上角坐标,可以使用cv::minMaxLoc函数获得子图位置和相应分数,再进行后续操作 。
使用传统的模板匹配速度较快,但是无法应对旋转和缩放问题 。要解决旋转不变的 问题,必须要得到旋转不变的特征量,例如特征点 。
使用SIFT或SURF计算得到模板和待匹配图像的特征点,然后使用RANSAC或者FLANN进行特征点匹配 ,  最后进行仿射变换便可得到匹配的位置 。
python opencv实现(surf):
# - - coding:utf-8 - -
author= 'Microcosm'
运行的具体信息如下:
操作系统:ubuntu 14.04
运行环境:
opencv版本:opencv 3.0
模板大?。?26x96 png
匹配图像大?。?50x407 jpg
特征提取时间:0.15 s
KNN匹配时间:0.0024s
匹配效果:
验证码识别之模板匹配方法在写爬虫的时候难免会遇到验证码识别的问题,常见的验证码识别的流程为:
- 图像灰度化
- 图像去噪(如图像二值化)
- 切割图片
- 提取特征
- 训练
但这种方法要切割图片,而且破解验证码的重点和难点就在于 能否成功分割字符。
本文要介绍的算法 不需要进行图片切割 , 也不需要进行机器训练 ,这种方法就是模板匹配:将待识别的文字切割成一个个模板,在待识别的图像中去匹配模板 。
这篇文章将分为两个部分:
第一部分介绍模板匹配的基本概念以及模板匹配的一种实现算法:快速归一化互相关匹配算法;
第二部分是一个具体实例 。
模板匹配是在图像中寻找目标的方法之一 , 目的就是在一幅图像中寻找和模板图像最相似的区域 。
模板匹配的大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配 。
假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:
从输入图像的左上角(0,0)开始 , 切割一块(0,0)至(10,10)的临时图像;
用某种方法得出临时图像与模板的相似度c,存放到相似度矩阵中(矩阵大小为91 x91);

推荐阅读