模板匹配算法

from:https://blog.csdn.net/zhi_neng_zhi_fu/article/details/51029864

模板匹配(Template Matching)算法

模板匹配(Template Matching)是图像识别中最具代表性的方法之一。它从待识别图像中提取若干特征向量与模板对应的特征向量进行比较,计算图像与模板特征向量之间的距离,用最小距离法判定所属类别。模板匹配通常事先建立好标准模板库。

一、简单计算样本之间距离的方法

在工作过程中遇到一个判断样本距离的方法,先把他记录如下: 

循环计算待测样本和训练集中已知样本之间的距离,比较所有的距离值,找出与待测样本最近的已知样品,其中所对应的样本所属的类别就是待测样本X所属的类别。

c实现代码如下:

<span style="color:#000000"><code>/****************************************
*参数:
*   src:待匹配特征向量
*   template:模板向量
*返回值:
*   int:返回匹配结果;-1:无匹配项
*意义:
*   输入待匹配特征向量,输出匹配结果*****************************************/
#define NFeature 25 //特征个数
#define NSample  10 //样本个数
int templateMatching(double src[], double template[][NFeature])
{double d[11] = {0.0}, temp, mind = 10.0; //匹配度int flag = -1, i, j;for(j = 0; j < NSample; j++) {for(i = 0; i < NFeature; i++) {temp = pow(src[i] - template[j][i], 2);d[j] += temp;}d[j] = sqrt(d[j]);if(mind > d[j]) {mind = d[j];flag = j;            }}return flag;
}
</code></span>

不足之处

以上算法有一个很大的问题,就是当特征向量值顺序改变之后,计算结果有很大的变化。例如: 
B = {1, 2, 3, 4}; A1 = {4, 3, 2, 1}; A2 = {1,2,3,4}。A1与B匹配,结果为{3*3+1*1+1*1+3*3} = 20;A2与B匹配,结果为{0+0+0+0} = 0;很明显特征向量A1与A2是相同的,在实际图像识别过程中有可能造成:一个图像旋转了一定角度,就无法识别出来。所以,这个算法只适合同方向的物体匹配,例如车牌字符识别等。

总结:

1. 只适合恒定方向特征匹配,例如车牌中的字符特征匹配

二、Hausdorff距离匹配

Hausdorff是描述两组点之间相似程度的一种度量,它是集合和集合之间距离的一种定义形式。下面我们慢慢讲解Hausdorff算法的过程。

- 点到点集的距离

- A集合到B集合的直接Hausdorff距离

还是以上面的例子为例来说明。例如:B = {1, 2, 3, 4}, A1 = {4, 3, 2, 1}, A2 = {1 ,2, 3, 4};A1与B匹配:Max{0, 0} = 0; A2与B的匹配:Max{0, 0} = 0;可以看到匹配的结果是:A1与A2是相同的,即使他们特征元素的顺序打乱了。一样可以把他们都正确匹配出来。 
这里写图片描述 
如图所示,X1、X2与T是一样的特征向量,只是顺序打乱了,但是匹配都是0;匹配效果还是很好的。X3是随机生成的其他的特征向量。 
代码:

下面按照最一般的情况,计算待测特征向量X与某一样本T的匹配度。特征元素为有理数。

<span style="color:#000000"><code>/********************************************************参数:X:输入特征向量数组T:模板库中某一样本特征向量n: 特征向量个数返回值:返回匹配结果函数意义:通过输入待测特征向量和模板特征向量,计算出待测特征向量的匹配度,数值越小,匹配程度越高。式中的距离范式是特征元素之间的差值绝对值。    ***************************************************/
double charrecognize(double X[], double T[], int n) 
{int i,j;double d[2] = {0.0};//存储X-->T的Hausdorff和T-->X的Hausdorff值double minTemp = 1000.0, sum;//计算X-->T的Hausdoff值for(i = 0; i < n; i++) {minTemp = 1000.0;for(j = 0; j < n; j++) {sum = fabs(X[i] - T[j]);if(sum < minTemp)minTemp = sum;      }d[0] += minTemp;        }//计算T-->X的Hausdorff值for(j = 0; j < n; j++) {minTemp = 1000.0;for(i = 0; i < n; i++) {sum = fabs(T[j] - X[i]);if(sum < minTemp)minTemp = sum;}d[1] += minTemp;        }//返回较大值if(d[0] > d[1])return d[0];return d[1];
}
</code></span>

当我们匹配要求特定方向、特定位置的图片时,其实也可以用Hausdorff距离进行特征匹配。 
这里写图片描述

如图所示,第一幅图是模板图片,后面都是要与模板进行匹配的图像。

  1. 第一幅图像是模板的copy,计算出的数值为:50500.
  2. 第二幅图像在模板的基础之上进行向左向右移动了一个像素:80254.
  3. 第三幅图像是把模板旋转了45°,计算出来的结果是:195405.

三幅图像虽然是一样的,只是位置和角度偏移了一些,出现的结果偏差却很大。这并非说明Hausdorff距离算法性能不佳,只是上述实验中的“特征选择”限定了Hausdorff距离算法对偏移和旋转过于敏感,也正是因为有了这种敏感,也更容易区分“非匹配项”。当我们图像特征限定在某一方向和位置时,Hausdorff将表现出优异的区分性能。例如:字符模板限定在“字符重心在图片重心,不旋转”,待测样本也如此限定。

代码流程

  1. 待测样本为二值化特征向量X, 模板为二值化特征向量T;
  2. 从上到下,从左到右,逐个像素扫描样本。如果为255(特征点),记录坐标P(x, y);如果为0,跳过。
  3. 在模板上,以P(x, y)为中心的3*3的邻域内,搜索255(特征点),寻找与P(x, y)最近的点,并计算最近距离;如果3*3域内没有255(特征点),就认为距离为一个设定的较大点(例如:5.0)。
  4. 把所有计算的距离累加到样本至模板的距离D(X, T);
  5. 以同样的方法计算模板至样本的距离D(T, D);
  6. 取D = Max{D(X, T), D(T, X)},作为匹配的结果。

    <span style="color:#000000"><code>/****************************************
    参数:X:样本二值图,只包含特征信息T:模板二值图,只包含特征信息
    返回值:double:返回匹配度,越低越匹配
    意义:以样本二值图特征像素坐标作为特征点进行
    匹配。
    *****************************************/
    double charrecognise(Mat X, Mat T) 
    {int i, j, m, n;double distemp = 5.0, distemp1, distsum, distsum1;//样本到模板的距离distsum = 0.0;for(i = 0; i < X.cols; i++) {for(j = 0; j < X.rows; j++) {if(X.at<uchar>(i, j) == 255) {distemp = 5.0;for(m = i - 3; m <= i + 3; m++) {for(n = j - 3; n <= j + 3; n++) {if(m < 0) m = 0;if(m > X.cols) m = X.cols;if(n < 0) n = 0;if(n > X.rows) n = X.rows;if(T.at<uchar>(m, n) == 255) {distemp1 = sqrt(pow((double)m - i, 2) + pow((double)n - j, 2));if(distemp1 < distemp) distemp = distemp1;}}}}distsum += distemp;}}//模板到样本的距离distsum1 = 0.0;for(i = 0; i < T.cols; i++) {for(j = 0; j < T.rows; j++) {if(T.at<uchar>(i, j) == 255) {distemp = 5.0;for(m = i - 3; m <= i + 3; m++) {for(n = j - 3; n <= j + 3; n++) {if(m < 0) m = 0;if(m > T.cols) m = T.cols;if(n < 0) n = 0;if(n > T.rows) n = T.rows;if(X.at<uchar>(m, n) == 255) {distemp1 = sqrt(pow((double)m - i, 2) + pow((double)n - j, 2));if(distemp1 < distemp) distemp = distemp1;}}}distsum1 += distemp;}}}if(distsum > distsum1)return distsum;return distsum1;
    }
    </code></span>

总结

  1. Hausdorff距离算法能无视特征元素的顺序进行匹配。
  2. Hausdorff距离算法对以位置为特征元素的特征向量进行匹配时,效果很差,但是对匹配条件加以限定还是可以达到很好的区分效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于linux用户权限的理解

创建用户useradd 用户名创建用户组groupadd 组名查看用户Idid 用户修改文件权限chmod 777 文件名或目录-R 递归修改用户数组chown 属主&#xff1a;属组 文件名或目录名-R 递归转载于:https://blog.51cto.com/1979431/1833512

IMEI串号

IMEI串号就是国际移动设备身份码&#xff0c;是电子设备的唯一身份证&#xff0c;由于它的唯一性&#xff0c;它可以用来查询电子设备的保修期还有产地&#xff0c;可以说用处直逼人民的身份证啊&#xff01; 在拨号键盘页面 输入【*#06#】五个字符转载于:https://www.cnblogs…

立体匹配十大概念综述---立体匹配算法介绍

from&#xff1a;https://blog.csdn.net/wintergeng/article/details/51049596 一、概念 立体匹配算法主要是通过建立一个能量代价函数&#xff0c;通过此能量代价函数最小化来估计像素点视差值。立体匹配算法的实质就是一个最优化求解问题&#xff0c;通过建立合理的能量函数…

zjnu1730 PIRAMIDA(字符串,模拟)

Description Sample Input 6 JANJETINA 5 1 J 1 A 6 N 6 I 5 E Sample Output 1 0 2 1 1题意&#xff1a;给你一个长度小于等于10^6的字符串&#xff0c;然后每次让它循环铺盖&#xff0c;构成层数为n的塔&#xff0c;让你求得第i层塔中某个字符的个数。 思路&#xff1a;首先要…

ICP算法理解

from&#xff1a;https://blog.csdn.net/linear_luo/article/details/52576082 1 经典ICP ICP的目的很简单&#xff0c;就是求解两堆点云之间的变换关系。怎么做呢&#xff1f;思路很自然&#xff0c;既然不知道R和t(针对刚体运动)&#xff0c;那我们就假设为未知量呗&#xf…

2016-8-2更新日志

1.修正版本管理器资源文件名 不能正确拉取 91Resource 文件下的资源的问题2.修正商城购买物品不计算负重的问题3.修正拾取叠加物品 只计算一个物品的重量的问题4.游戏参数-> 游戏选项2->增加物品使用间隔5.修正冷酷不加技能点的BUG6.自定义UI开放测试[目前只能针对热血传…

字符流缓冲区的使用之BufferedWriter和BufferedReader

从字符输入流中读取文本&#xff0c;缓冲各个字符&#xff0c;从而实现字符、数组和行的高效读取&#xff0c;代码中使用了输入缓冲区的特有的方法&#xff1a;readLine(),获取一行文本数据 import java.io.BufferedReader; import java.io.FileNotFoundException; import java…

图像处理的灰度化和二值化

from&#xff1a;http://blog.sina.com.cn/s/blog_13c6397540102wqtt.html 在图像处理中&#xff0c;用RGB三个分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即红、绿、蓝三原色来表示真彩色&#x…

结合 category 工作原理分析 OC2.0 中的 runtime

绝大多数 iOS 开发者在学习 runtime 时都阅读过 runtime.h 文件中的这段代码: struct objc_class {Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__Class super_class OBJC2_UNAVAILABLE;const char *name …

获取子元素

1、纯css 获取子元素 #test1>div {background-color:red;}#test1 div {font-size:14px;}#test1>div:first-child {color:#ccc;} <div id"test1"><div>性别</div><div>男</div></div> 因1示例中为#test1下的子元素 #test1…

JPG PNG GIF BMP图片格式的区别

类型优点缺点应用场景相同图片大小比较BMP无损压缩&#xff0c;图质最好文件太大&#xff0c;不利于网络传输 152KGIF动画存储格式最多256色&#xff0c;画质差 53KPNG可保存透明背景的图片画质中等 202KJPG文件小&#xff0c;利于网络传输画质损失车牌识别84K BMP BMP&…

EasyUI左右布居

<!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"><head runat"server"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>首页</title> <li…

44.Android之Shape设置虚线、圆角和渐变学习

Shape在Android中设定各种形状&#xff0c;今天记录下&#xff0c;由于比较简单直接贴代码。 Shape子属性简单说明一下:   gradient -- 对应颜色渐变。 startcolor、endcolor就不多说了。 android:angle是指从哪个角度开始变.solid -- 填充。stroke -- 描边。corners -- 圆角…

几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny

from&#xff1a;https://blog.csdn.net/gdut2015go/article/details/46779251 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括&#xff1a;深度上的…

django 初试

/*************************************************************************************** django 初试* 说明&#xff1a;* 昨天打搭了dgango的服务器&#xff0c;今天学一下怎么来输出一个hello world出来。* * …

浅析“高斯白噪声”,“泊松噪声”,“椒盐噪声”的区别

from&#xff1a;https://www.jianshu.com/p/67f909f3d0ce 在图像处理的过程中&#xff0c;一般情况下都进行图像增强&#xff0c;图像增强主要包括“空域增强”和“频域增强”&#xff0c; 空域增强包括平滑滤波和锐化滤波。 平滑滤波&#xff0c;就是将图像模糊处理&#x…

HttpClient通过Post上传文件(转)

在之前一段的项目中&#xff0c;使用Java模仿Http Post方式发送参数以及文件&#xff0c;单纯的传递参数或者文件可以使用URLConnection进行相应的处理。 但是项目中涉及到既要传递普通参数&#xff0c;也要传递多个文件&#xff08;不是单纯的传递XML文件&#xff09;。在网上…

数字图像处理:各种变换滤波和噪声的类型和用途总结

摘自http://imgtec.eetrend.com/blog/4564 一、基本的灰度变换函数 1.1图像反转 适用场景&#xff1a;增强嵌入在一幅图像的暗区域中的白色或灰色细节&#xff0c;特别是当黑色的面积在尺寸上占主导地位的时候。 1.2对数变换&#xff08;反对数变换与其相反&#xff09; …

Java 开发环境部署

1.下载Java开发环境工具包JDK&#xff0c;下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载后&#xff0c;双击jdk应用程序&#xff0c;根据提示完成安装&#xff0c;安装过程中可以自定义安装目录等信息&#xff0c;这里我选择…

枚举enum、NS_ENUM 、NS_OPTIONS

2019独角兽企业重金招聘Python工程师标准>>> enum 了解位移枚举之前&#xff0c;我们先回顾一下C语言位运算符。 1 << : 左移,比如1<<n,表示1往左移n位&#xff0c;即数值大小2的n次方; 例如 : 0b0001 << 1 变为了 0b0010 2 >> : 右…