在目标检测过程中,常用的方法就是设置一个模板,以滑动窗口的形式遍历整幅源图像(待检测的图像);每次滑动都会产生一个和模板等大小的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: