基于金字塔的模板匹配算法

  在目标检测过程中,常用的方法就是设置一个模板,以滑动窗口的形式遍历整幅源图像(待检测的图像);每次滑动都会产生一个和模板等大小的ROI图像,基于某种度量方式,计算模板与当前ROI图像的相似性度量值。这样遍历完整幅图像后就会形成一个图像,找出最大值对应的位置(x,y),它就是我们要寻找的目标的位置。

  上面是模板匹配大致的步骤,当源图像很大,遍历完整幅图像很耗时,故提出了基于金字塔的模板匹配方法,下面是该方法涉及到几点:

  (1) 设置金字塔层数nLevels,创建源图像和模板图像对应的nLevels层金字塔图像;

  (2) 创建每层金字塔图像时,涉及到降采样(除以2),降采样后会出现锯齿,需要采用平滑滤波器进行处理;高斯平滑滤波器效果好但耗时,可以直接采用小模板的均值滤波器;

  (3) 计算模板与ROI图像的相似性值时,需要选择相似性度量准则;相似性度量准则有SAD(绝对值总和),SSD(平方差总和)和NCC(归一化相关系数),NCC的计算最耗时但效果最好,能很好的适应光照变化。

  理解了大致的流程和涉及到的操作后,可以直接写代码,金字塔匹配算法如下:

  1 function [r,c,nccImg] = pyramidMatch(img, template, nLevels)
  2 % -------------------------------------------------------------------------
  3 % 采用金字塔匹配算法进行模板匹配
  4 %
  5 % 过程:(1)为待匹配的图像和模板图像创建nLevels层金字塔图像
  6 %       (2)从金字塔最高层开始进行匹配,最高层的要完全扫描匹配,得到的最佳匹配位置
  7 % 后向下层传递(乘以2);根据传递的位置,在5*5的窗口范围内进行扫描匹配,如此这样
  8 % 直到最低层。
  9 %       (3)匹配时采用的相似性度量为归一化相关系数
 10 %       (4)创建金字塔时进行了降采样(除2),然后用2*2的平滑滤波器进行了处理
 11 %
 12 % img-- 源图像(这里假设为灰度图)
 13 % template-- 模板图像(假设为灰度图)
 14 % nLevels-- 金字塔层数
 15 % @r,c-- 源图像中最匹配的位置
 16 % @nccImg-- 进行金字塔匹配时每层对应的归一化相关系数图像
 17 %
 18 % Author: L.L.He
 19 % Time: 26/7/2014
 20 %%-------------------------------------------------------------------------
 21 imshow(img);
 22 hold on;
 23 [t_r,t_c] = size(template);
 24 nccImg = cell(nLevels, 1);
 25 % 这里计算待匹配图像和模板的图像金字塔
 26 nStep = 2; %5*5
 27 srcPrad = pyramid(img, nLevels);
 28 temPrad = pyramid(template, nLevels);
 29 [r,c,nccImg{nLevels}] = matchTemplate(srcPrad{nLevels}, temPrad{nLevels});
 30 for i=nLevels-1:-1:1
 31     r_start = 2*r - floor((size(temPrad{i},1)-1)/2) - nStep;
 32     r_end = r_start+2*nStep+1;
 33     c_start = 2*c - floor((size(temPrad{i},2)-1)/2) - nStep;
 34     c_end = c_start++2*nStep+1;
 35     [r,c,nccImg{i}] = matchTemplate(srcPrad{i}, temPrad{i},...
 36                       r_start, r_end, c_start, c_end);
 37 end
 38 c_r = round(t_r/2);
 39 c_c = round(t_c/2);
 40 rectangle(‘Position‘,[c-c_c+1,r-c_r+1,t_c,t_r], ‘edgecolor‘, ‘r‘);
 41 end
 42 % -------------------------------------------------------------------------
 43
 44 % =========================================================================
 45 % 模板匹配算法
 46 function [objr, objc, ncc_Img] = matchTemplate(img, template, r_start, ...
 47                                 r_end, c_start, c_end)
 48 [src_r,src_c] = size(img);
 49 [t_r,t_c] = size(template);
 50 if nargin == 2
 51     r_start = 1;
 52     r_end = src_r-t_r+1;
 53     c_start = 1;
 54     c_end = src_c-t_c+1;
 55 end
 56 % 这里先计算模板图像的归一化图像
 57 norm_Img = normalize(template);
 58 ncc_Img = zeros(r_end-r_start+1, c_end-c_start+1);
 59 c_r = round(t_r/2);
 60 c_c = round(t_c/2);
 61 for r = r_start:r_end
 62     for c = c_start:c_end
 63         currPatch = img(r:r+t_r-1,c:c+t_c-1);
 64         currPatch = normalize(currPatch);
 65         ncc_Img(r+c_r-1,c+c_c-1) = NCC(norm_Img, currPatch);
 66     end
 67 end
 68 [val_1,pos] = max(ncc_Img);
 69 [val_2,objc] = max(val_1);
 70 objr= pos(find(val_1==val_2));
 71 end
 72 % =========================================================================
 73
 74 % =========================================================================
 75 % 计算两幅图像的归一化相关系数(一种相似性度量),其绝对值越大表示越相似
 76 function ncc = NCC(img_1, img_2, isNorm)
 77 if ~exist(‘isNorm‘,‘var‘)
 78     isNorm = 1;
 79 end
 80 % 判断参数是否是归一化后的图像
 81 if ~isNorm
 82     img_1 = normalize(img_1);
 83     img_2 = normalize(img_2);
 84 end
 85 ncc = sum(sum(img_1.*img_2)) ./ size(img_1(:),1);
 86 end
 87 % =========================================================================
 88
 89 % =========================================================================
 90 % 图像归一化
 91 function norm_Img = normalize(img)
 92 if size(img, 3) ~= 1
 93     img = rgb2gray(img);
 94 end
 95 norm_Img = zeros(size(img));
 96 mu = mean(img(:));
 97 st = max(std(double(img(:))), eps);
 98 norm_Img = bsxfun(@minus, img, mu);
 99 norm_Img = bsxfun(@rdivide, norm_Img, st);
100 end
101 % =========================================================================
102
103 % =========================================================================
104 % 计算图像的金字塔,层数由nLevels参数指定,返回一个结构体,其中包含nLevels张图像
105 function pyImg = pyramid(img, nLevels)
106 % 创建金字塔中的每一层图像
107 pyImg = cell(nLevels, 1);
108 pyImg{1} = img;
109 for i=2:nLevels
110     pyImg{i} = downSample(pyImg{i-1});
111 end
112 end
113 % =========================================================================
114
115 % =========================================================================
116 % 对图像进行降采样(2*2)并平滑处理
117 function d_img = downSample(img)
118 % 如果原图像的行列是基数则补齐
119 if mod(size(img,1), 2) ~= 0
120     img = [img(1,:); img];
121 end
122 if mod(size(img,2), 2) ~= 0
123     img = [img(:,1), img];
124 end
125 [r,c] = size(img);
126 d_img = zeros(r/2, c/2);
127 for i=1:2:r
128     for j=1:2:c
129         x = (i+1)/2;
130         y = (j+1)/2;
131         d_img(x,y) = sum(sum(img(i:i+1,j:j+1)))/4;
132     end
133 end
134 end

  测试代码如下:

1 src = rgb2gray(imread(‘src.jpg‘));
2 template = rgb2gray(imread(‘template.jpg‘));
3 [x,y,ncc_Img] = pyramidMatch(src, template, 4);

左图为源图像,中间图为模板图像,右边图为效果图

时间: 2024-10-02 04:42:08

基于金字塔的模板匹配算法的相关文章

基于灰度的模板匹配算法(三):划分强度一致法(PIU)

简介: 前面几篇文章介绍了一些比较基本的基于灰度的图像配准算法: 基于灰度的模板匹配算法(一):MAD.SAD.SSD.MSD.NCC.SSDA.SATD算法  基于灰度的模板匹配算法(二):局部灰度值编码  基于互信息的图像配准算法:MI.EMI.ECC算法  本文将介绍一种类似的相似度测量算法,叫做划分强度一致法(Partitioned Intensity Uniformity,PIU). PIU算法:         1992年,Woods提出了基于划分强度一致的MR-PET图像配准.在医

基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA算法

简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性算法(SSDA).下面依次对其进行讲解. MAD算法 介绍 平均绝对差算法(Mean Absolute Differences,简称MAD算法),它是Leese在1971年提出的一种匹配算法.是模式识别中常用方法,该算法的思想简单,具有较高的匹配精度和较少的计算量,广泛用于图像匹配. 设S(x,y)是大小

基于灰度的模板匹配算法(二):局部灰度值编码

简介 在上一篇文章: 基于灰度的模板匹配算法(一):MAD.SAD.SSD.MSD.NCC.SSDA算法中,介绍了几种典型的模板匹配算法,但此类算法都存在时间复杂度高,对图像尺寸敏感等问题,即便是SSDA这样的优化算法复杂度也是很高的. 本文将介绍一种新的算法,叫做局部灰度值编码算法,它通过对灰度值编码来进行粗匹配,再用相位相关法进行精匹配. 算法介绍 粗匹配 与上一篇文章的假设相似,这里搜索图尺寸为MxM,模板T的尺寸NxN,模板T在搜索图S上滑动,滑动的上.下步长都为N(一个模板尺寸),也就

基于边界的模板匹配的原理及算法实现

最近被Halcon中的基于边缘的模板匹配算法吸引到了,故找到了一点点学习资料,供同行参阅,水平有限,大家多包含.本文算法很初级,做入门了解用.原文是英文,所以把原文copy 过来了,另加了一些中文.算法运行效果如下: [效果还行,只是原理性示意,不要要求太高了哦] Introduction Template matching is an image processing problem to find the location of an object using a template imag

基于HALCON的模板匹配方法总结 (转)

很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多的练习和实验,并对基于HDevelop的形状匹配算法的参数优化进行了研究,写了一篇<基于HDevelop的形状匹配算法参数的优化研究>文章,总结了在形状匹配过程中哪些参数影响到模板的搜索和匹配,又如何来协调这些参数来加快匹配过程,提高匹配的精度,这篇paper放到了中国论文在线了,需要可以去下载. 德国MVTec公司开发的HALCON机器视觉开发软件,提供了许多的功能,在这里我主

出位的template.js 基于jquery的模板渲染插件,简单、好用

找了好几款基于jquery的模板渲染插件,无一感觉很难用(教程较少.绑定不统一),也可能我智商问题,比如jquery template.js .jtemplate.js. 然后在github上找到这一款,和我在公司之前用的差不多(apicloud云端开发app,致敬[百小僧]大神封装的HUI,简化了在公司很多工作), 这款模板渲染和HUI的很相似,也比较简单  基于jquery的模板渲染插件. 附上github https://github.com/yanhaijing/template.js

基于KWIC 的关键字匹配算法(管道+过滤器模式下实现)

下面是基于KWIC 的关键字匹配算法(管道+过滤器模式下实现) 关键部分的管道+过滤器 软件体系下的实现, 在很多的关键字搜索平台都使用了这一 循环移位+排序输出的 关键字匹配算法: 具体需求如下: 1.使用管道-过滤器风格: 每个过滤器处理数据,然后将结果送至下一个过滤器,.要有数据传入,过滤器即开始工作.过滤器之间的数据共享被严格限制在管道传输 四个过滤器: 输入(Input filter): 从数据源读取输入文件,解析格式,将行写入输出管道 移位(CircularShifter filte

JS组件系列——基于Bootstrap Ace模板的菜单Tab页效果优化

前言:之前发表过一篇  JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有) ,收到很多园友的反馈,当然也包括很多诟病,因为上篇只是将功能实现了,很多细节都没有处理,这篇博主将带领大家一起来优化这里的效果,使之成为一个可以在项目里面使用的成品. 说点题外话,本来,在互联网模式下,Tab页+iframe的组合是不能被大多数平台接受的,从这些年推出的一些好的产品可以看出,几乎大家都不这么玩,即使是一些后台的管理模板,比如常见的AdminLTE.Ace.INSPIN

Vue-Router路由Vue-CLI脚手架和模块化开发 之 Vue-CLI 2.x脚手架工具基于webpack simple模板与基于webpack模板构建项目

Vue-CLI 2.x脚手架工具基于webpack simple模板构建项目 vue-cli是一个基于vue.js进行快速开发的完整系统.基于webpack构建,并进行默认配置,可通过插件扩展,可升级: vue-cli帮我们创建基本项目结构,跳过繁琐的项目配置环节,将精力集中在业务上: vue-cli的版本: @vue/cli 3.x版本:点击前往官网 vue-cli 2.x版本:点击前往官网 安装vue-cli $ npm install -g vue-cli 安装成功,查看其版本: 使用we