模板匹配算法

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,一经查实,立即删除!

相关文章

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

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…

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

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…

获取子元素

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…

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…

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 >> : 右…

数字图像处理-频率域滤波原理

from&#xff1a;https://blog.csdn.net/forrest02/article/details/55510711?locationNum15&fps1 写在前面的话 作者是一名在读的硕士研究僧&#xff0c;方向是图像处理。由于图像处理是一门相对复杂的学科&#xff0c;作者在课堂上学到的东西只是非常浅显的内容&#…

深入浅出的讲解傅里叶变换(真正的通俗易懂)

原文出处&#xff1a; 韩昊 1 2 3 4 5 6 7 8 9 10 作 者&#xff1a;韩 昊 知 乎&#xff1a;Heinrich 微 博&#xff1a;花生油工人 知乎专栏&#xff1a;与时间无关的故事 谨以此文献给大连海事大学的吴楠老师&#xff0c;柳晓鸣老师&#xff0c;王新年老师以及张晶泊老…

IIS(1)

转载&#xff1a;http://blog.csdn.net/ce123 IIS音频总线学习&#xff08;一&#xff09;数字音频技术 一、声音的基本概念 声音是通过一定介质传播的连续的波。 图1 声波重要指标&#xff1a; 振幅&#xff1a;音量的大小周期&#xff1a;重复出现的时间间隔频率&#xff1a;…

手机屏幕适配原理及实现

为什么80%的码农都做不了架构师&#xff1f;>>> 手机屏幕是用户与 App 最直接的交互点 不同的分辨率下用户对我们的 App 具有明显的感观差异&#xff0c;主流分辨率的更新迭代却又完全独立于 App 进行。这让我们想要使 App 在绝大多数主流手机上都保持感观、体验的…

【数字图像处理】傅里叶变换在图像处理中的应用

from&#xff1a;https://www.cnblogs.com/tenderwx/p/5245859.html 1.理解二维傅里叶变换的定义 1.1二维傅里叶变换 二维Fourier变换: 逆变换&#xff1a; 1.2二维离散傅里叶变换 一个图像尺寸为MN的 函数的离散傅里叶变换由以下等式给出&#xff1a; 其中 和。其中变量u和…

求二叉树中两个节点的最远距离

问题定义如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节…

Source Insight 4.0 最简单的破解安装

from&#xff1a;https://blog.csdn.net/biubiuibiu/article/details/78044232 三步完成Source Insight 4.0 破解安装 下载地址有更新&#xff0c;之前有朋友因潜在的版权问题封禁没下到&#xff0c;现在更新后可正常使用了。 文末有完全清除上次安装残留的方法&#xff0c;…

XML——XML介绍和基本语法

from&#xff1a;https://blog.csdn.net/gavin_john/article/details/51511180 1.XML历史 gml(1969)->sgml(1985)->html(1993)->xml(1998) 1969 gml(通用标记语言)&#xff0c;主要目的是要在不同的机器之间进行通信的数据规范1985 sgml(标准通用标记语言)1993 htm…

Tomcat7.0安装配置

很久没有通过博客对学习所得进行记录了。 现在将使用Tomcat的一些经验和心得写到这里&#xff0c;作为记录和备忘。如果有朋友看到&#xff0c;也请不吝赐教。 首先&#xff0c;我个人使用的是apache-tomcat-7.0.27你可以下载使用&#xff0c;前提条件你需要安装JDK1.6或者1.7都…