基于灰度值的模板匹配适用于图像内灰度变化比较稳定,噪声比较少,且灰度差异比较明显的检测目标。这是一种不太推的匹配方法,因为该方法复杂度高,一次只能检测一个目标,耗时,且对光照和尺寸变化十分敏感。如果要使用该方法进行匹配,一般有如下步骤。
(1)使用create_temple算子或create_temple_rot算子创建一个模板。相比前者,后者多了一个允许的旋转角度,可使目标图像在旋转后也能被拽索到。在创建模板时,可以设置GrayValue参数为original。create_temple算子原型如下:
create _template(Template : : FirstError, NumLevel, Optimize, GrayValues : TemplateID)
Template 是输入参数,表示准备好的模板图像。FirstError 是一个无用的参数,默认为255。NumLevel 表示匹配金字塔的层级数,默认为4。Optimize 表示优化的方法类型,可以选择sort,表示进行优化,这样匹配时间会稍微长一点,结果也会更稳定一些;也可以选择none,表示不进行任何优化。参数GrayValues 决定了使用原始图像的灰度还是使用边缘梯度进行匹配。可选的有gradient、 normalized、original、sobel,其含义可以从字面上理解。如果光照情况比较稳定,图像灰度变化不大,就可以选择original,即使用原始灰度差值作为匹配的判断条件;如果光照变化比较大,建议放弃使用基于灰度值的匹配,可以考虑使用基于相关性的匹配。
(2)创建模板之后,将返回一个模板的句柄TemplateID。接着可以使用各种匹配算子进行灰度的匹配,如best_match算子和fast_match算子,以及它们的多种衍生版本,即带变量的算子,如best_match_mg 算子、best_match_pre_mg算子、best_match_rot 算子、fast_match_mg 算子等。best_match算子返回的是匹配结果最好的目标的坐标位置,而fast_match算子返回的是包含所有点的一个区域。
后级为mg变量的算子,如best_match_mg 算子和fast_match_mg算子,表示其是在图像金字塔上进行匹配的;best_matchpre_mg算子则表示使用了预训练的金字塔,在算子的参数列表中可以设置金字塔的层级等参数。带rot的算子,如best_match_rot算子,表示检测图像可以旋转一定的角度,该角度的起始范围可以在best_match_rot算子的参数中设置。
(3)使用clear_template 算子释放模板资源。例如,图11.1中的例子使用了基于灰度值的模板匹配,其代码如下:
dev_close_window ()
dev_open_window (0, 0, 599, 464, 'black', WindowID)
*读取了一幅彩色图像
read_image (Imagecolor, 'data/holesBoard')
*将其转化为灰度图像
rgb1_to_gray (Imagecolor, Image)
dev_set_draw ('margin')
dev_set_line_width(3)
Row1 :=700
Column1 := 950
Row2 := 906
Column2 := 1155
*选择了一块矩形的ROI区域
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
dev_display (Rectangle)
*将ROI区域进行裁剪,变成模板图像
reduce_domain (Image, Rectangle, ImageReduced)
*创建模板,因为光照比较稳定,GrayValues选择‘original’
create_template (ImageReduced, 5, 4, 'sort', 'original', TemplateID)
*读取测试图像
read_image (ImageNoise, 'data/holesBoardNoise')
*应用灰度模板并进行匹配
adapt_template (ImageNoise, TemplateID)
best_match_mg (ImageNoise, TemplateID, 35, 'false', 4, 'all', Row_, Column_, Error_)
dev_clear_window ()
dev_display (ImageNoise)
*根据匹配返回的坐标中心,绘制矩形标识框,将匹配到的目标框选出来
disp_rectangle2 (WindowID, Row_, Column_, 0, 95, 95)
*匹配结束,释放模板资源
clear_template (TemplateID)