模板匹配是数字图像处理的重要组成部分之一。把不同传感器或同一传感器在不同时间、
不同成像条件下对同一景物获取的两幅或多幅图像在空间上对准,或根据已知模式到另一幅
图中寻找相应模式的处理方法就叫做模板匹配。
    简单而言,模板就是一幅已知的小图像。模板匹配就是在一幅大图像中搜寻目标,已知
该图中有要找的目标,且该目标同模板有相同的尺寸、方向和图像,通过一定的算法可以
在图中找到目标,确定其坐标位置。
以8 位图像(其1 个像素由1 个字节描述)为例,模板T( m × n 个像素)叠放在被搜
索图S( W × H 个像素)上平移,模板覆盖被搜索图的那块区域叫子图Sij。i,j为子图
左上角在被搜索图S 上的坐标。搜索范围是:
1 ≤ i ≤ W – M
1 ≤ j ≤ H – N
通过比较T 和Sij 的相似性,完成模板匹配过程。
衡量模板T和子图Si,j的匹配程度,可用下列两种测度:

或者

展开前一个式子,有:

(3)式右边的第三项表示模板的总能量,是一个常数,与(i,j)无关。第一项是模板覆盖下那块子图像的能量,它随(i,j)位置而缓慢改变。第二项是子图像和模板的互相关函数,随(i,j)变化而迅速改变。模板T和子图Si,j匹配时这一项的值最大,因此可以用下列相关函数来反应匹配程度:

2 建立数学模型

2.1 计算公式

  模板匹配算法计算模板和匹配区域的相似程度,以最相似位置为匹配点。由于模板需要在匹配区域上逐次匹配,运算量很大。所以选择匹配公式对整个匹配的效率有极大的影响。

  工控机的数据处理能力有限,需要针对红外热成像跟踪技术的特点来简化数学模型,选定计算量最小的计算公式。目标跟踪算法用来确定目标位置,可以用匹配误差的相对大小作为目标判别的依据,误差最小的位置就是目标位置,不需要考虑绝对相似程度。

  公式(1)~(5)都能够真实反应模板的相对匹配程度,选择计算量最小、效率最高的公式(1)作为原始数学模型。匹配点位置算法完成整个匹配区域内的最小匹配误差点检索,表示为公式(6):

   

  变量K、L为匹配区域尺寸;M、N为模板尺寸。

2.2 模板尺寸

  模板尺寸对系统性能和计算量的影响不容小觑。模板过大导致动态特性变差;过小又会减少目标的特征数据量,降低匹配的敏感程度,增大目标检测难度。实际操作中,模板尺寸设置为32×16时效果非常理想。

2.3 匹配区域

  不同的应用环境下,对匹配区域和实时性要求也不尽相同。光电探测设备需要在视频图像采集周期内(20ms)完成数据实时处理。由于目标在两场视频图像之间的移动量较小、特征变化不大,匹配区域可以大大缩小。

  匹配区域太小会导致目标动态特性变差,过大又会导致计算量大幅度增加,具体选择需要权衡设备参数来决定。由于CCIR制式视频信号是隔行扫描,系统出于实时性考虑,数据以场为单位处理,导致图像比例为2:1状态。为了保持水平、垂直方向的动态特性一致,图像匹配区域也按2:1比例选择。

  在满足实时性要求的情况下,选择相对较大的匹配范围,可提高设备的动态特性。从表1实测数据可以看出,选择匹配区域100×50点、模板32×16点时,动态范围为69×35,时间消耗为13ms。光电探测设备系统目标动态特性要求处理区域不小于40×20点。可见以上选择可以很好地满足动态特性和实时性要求。

 

3 数学模型优化方法

  数学模型结合选择的模板和搜索区域大小,可以知道模板最佳匹配点计算公式如下:

  

  由公式(7)可以看出,程序需要进行大量的循环计算,整体运算量仍然不小,需要进一步优化,减少处理时间。运用如下优化算法进一步减少实际运算量。

3.1 粗精匹配结合

  观察实际模板匹配运算结果可以发现,匹配点附近的匹配误差迅速下降,明显区别于其它位置。针对这一特点,采用粗精匹配结合的算法迅速锁定匹配点大致区域,可大大降低整体匹配次数。

具体实现方法:先跳动着隔几个点进行一次粗匹配,大致框定匹配区域,然后在附近区域逐一检索获得最佳匹配点。运算量可减少到三分之一以下,且目标提取效果相当好。

3.2 限制最大匹配误差

  因为只需找到最小匹配误差的位置,不必完整计算每一位置的绝对匹配误差,而以已经计算的最小匹配误差作为最大允许误差。若计算误差大于该最大允许误差,就肯定不是最佳匹配点,可以提前结束计算,进入下一匹配位置的计算;如果匹配完成后仍小于最大允许误差,就用当前误差替换最大允许误差,并把该点作为潜在的匹配位置记录下来。

  匹配点和非匹配点的误差常常相差2~3个数量级。经过这种处理后,匹配点后剩余的计算量可以大大降低。

3.3 乱序匹配

  目标出现在匹配区域中的位置不确定。不固定顺序算法可以更快地检索到匹配区域,迅速降低最大匹配误差,减少剩余非匹配点的计算量,降低整体运算量。

  针对光电探测设备的实际工作情况,在跟踪状态下,目标位移角速度和角加速度有限,导致目标常处于匹配区域中心附近。选择由中心向周围辐射匹配的方式效果最理想。

4 程序样本

  以下程序样本综合使用了上面的优化算法,成功应用于红外热成像跟踪技术的原理样机,达到了预期效果。

该函数用于图像模板匹配运算,适用于256灰度值的黑白图像数据。

  Deal_With::TemplateMatch(unsigned char* lpSource, LONG lWidth, LONG lHeight,  unsigned char*lpTemplate, LONG

  lTemplateWidth,LONG lTemplateHeight,)

  {    

         unsigned char*       Source;           //指向待处理图像的指针

         unsigned char*       Template;            //指向模板图像的指针

         int                         i,j,m,n;  //循环变量

         unsigned char        lMaxWidth, lMaxHeight,

                                lMaxWidthExact,lMaxHeightExact

                                                   //匹配位置

         unsigned long       D;              //相似误差

         unsigned long       MaxD;         //最大允许相似误差

  //粗相关

         MaxD =0x10000000;                //约定最大匹配误差

         for (j = 0;j < lHeight - lTemplateHeight +1 ;j+=2){

        for(i = 0;i < lWidth - lTemplateWidth + 1;i+=2){

                    D=0;

                       Source=(unsigned char *)lpSource+lWidth*j+i;

                       Template=(unsigned char *)lpTemplate ;

                       for (n=0;n < lTemplateHeight && D

                           for(m=0;m

                                   D+=(*Source++-*Template++)*(*Source++

                                      -*Template++);

                            Source+=lWidth-lTemplateWidth;

                       }

                       if (D

                              MaxD=D;

                              lMaxWidth=i;

                              lMaxHeight=j;

                       }

                 }

         }

         //精相关

         lMaxWidthExact = lMaxWidth;

         lMaxHeightExact = lMaxHeight;

         for (j = lMaxHeight-2;j <= lMaxHeight+2 ;j++){

           for(i = lMaxWidth-2;i <= lMaxWidth+2;i++){

                     D=0;

                     Source=(unsigned char *)lpSource+lWidth*j+i;

                     Template=(unsigned char *)lpTemplate ;

                     for(n=0;n

                       for(m = 0;m < lTemplateWidth && D

                          D+=(*Source++-*Template++)*(*Source++

                            -*Template++);

                       Source+=lWidth-lTemplateWidth;

                }

                 if (D

                       MaxD=D;

                       lMaxWidthExact=i;      //x方向最佳匹配点位置

                       lMaxHeightExact=j;    //y方向最佳匹配点位置

                   }

              }

         }

  }



posted on 2009-07-28 14:52  芊芊  阅读(14897)  评论(0编辑  收藏  举报