一、介绍
基于灰度值的模板匹配是最经典的模板匹配算法,也是最早提出来的模板匹配算法。这种算法的根本思想是,计算模板图像与检测图像之间的像素灰度差值的绝对值总和(SAD方法)或者平方差总和(SSD方法)。
其原理是:首先选择一块ROI(感兴趣区域)作为模板图像,生成基于灰度值的模板;然后将检测图像与模板图像进行粗略匹配,在检测图像与模板图像中任选一点,采取隔点搜索的方式计算二者灰度的相似性,这样粗匹配一遍得到的粗相关点;接下来进行精匹配,将得到的粗相关点作为中心点,用最小二乘法寻找二者之间的最优匹配点。
由于这种方法是利用模板图像的所有灰度值进行匹配,但是光照发生变化的情况下灰度值会产生强烈的变化,因此该方法不能使用于光照发生变化的情况,也不能用于多通道图像的匹配,一般只用于简单图像的匹配。
此方法仅针对极少数的简单图像,才会考虑基于灰度值的匹配。
二、基于灰度值的模板匹配的步骤
基于灰度值的模板匹配适用于图像内灰度变化比较稳定,噪声比较少,且灰度差异比较明显的检测目标。但是该方法复杂度高,一次只能检测一个目标,耗时长,且对光照和尺寸变化十分敏感,所以不太推荐此方法。
Legacy / Matching 创建模版,模板匹配的准备模式。 create_template(Template : : FirstError, NumLevel, Optimize, GrayValues : TemplateID) Template:输入参数,输入准备好的模板图像。 FirstError:输入参数,无用参数,默认255。 NumLevel:输入参数,匹配金字塔的层级数。默认4。 Optimize:输入参数,优化的方法类型。默认'sort'进行优化(结果稳定,但时间会稍长),范围'none'不优化, 'sort'。 GrayValues:输入参数,使用原始图像的灰度还是使用边缘梯度进行匹配。 默认'original' 【 'gradient'光照情况比较稳定,图像灰度变化不大,可以选用(即使用原始灰度差值作为匹配的判断条件)。 'normalized',标准的。 'original' 'sobel' 】 TemplateID:输出参数,创建模板后,返回的模板句柄。 |
Legacy / Matching 创建旋转模版,一种与旋转匹配的模板匹配的模式。 create_template_rot(Template : : NumLevel, AngleStart, AngleExtend, AngleStep, Optimize, GrayValues : TemplateID) Template:输入参数,输入准备好的模板图像。 NumLevel:输入参数,金字塔层次的最大数。默认4。 AngleStart:输入参数,最小旋转模式。默认-0.39,建议值 -3.14, -1.57, -0.79, -0.39, -0.20, 0.0。 AngleExtend:输入参数,角度展开的最大正扩展。默认0.79,范围:AngleExtend > 0 AngleStep:输入参数,步进率(角精度)的匹配。默认 0.0982,范围AngleStep > 0 Optimize:输入参数,优化的方法类型。默认'sort'进行优化(结果稳定,但时间会稍长),范围'none'不优化, 'sort'。 GrayValues:输入参数,使用原始图像的灰度还是使用边缘梯度进行匹配。 默认'original' 【 'gradient'光照情况比较稳定,图像灰度变化不大,可以选用(即使用原始灰度差值作为匹配的判断条件)。 'normalized'标准的。 'original' 'sobel' 】 TemplateID:输出参数,创建模板后,返回的模板句柄。 |
三、创建好模板后,接着可以使用各种匹配算子进行灰度的匹配
adapt_template算子的作用:使由create_template算子所创建的模板适应镜像的大小。
Legacy / Matching 把一个模板用于一个图像的大小 adapt_template(Image : : TemplateID : ) Image:输入参数,决定后期匹配大小的图像。 TemplateID:输入参数,模板ID。 |
①进行匹配
mg:表示的是在图像金字塔上进行匹配的。
pre_mg:表示使用了预训练的金字塔,在算子的参数列表中可以设置金字塔的层级等参数。
rot:表示检测图像可以选择一定的角度。
Legacy / Matching 寻找一个模版和一个图像的最佳匹配。(返回的是匹配结果最好的目标的坐标位置) best_match(Image : : TemplateID, MaxError, SubPixel : Row, Column, Error) |
在金字塔中搜索最佳灰度值匹配。 best_match_mg(Image : : TemplateID, MaxError, SubPixel, NumLevels, WhichLevels : Row, Column, Error) |
在预生成的金字塔中寻找最佳灰度值匹配。 best_match_pre_mg(ImagePyramid : : TemplateID, MaxError, SubPixel, NumLevels, WhichLevels : Row, Column, Error) |
寻找一个模板和一个旋转图像的最佳匹配。 best_match_rot(Image : : TemplateID, AngleStart, AngleExtend, MaxError, SubPixel : Row, Column, Angle, Error) |
寻找一个模板和一个旋转金字塔的最佳匹配。 best_match_rot_mg(Image : : TemplateID, AngleStart, AngleExtend, MaxError, SubPixel, NumLevels : Row, Column, Angle, Error) |
快速匹配,寻找一个模板和一个图像的最佳匹配。(返回的是包含所有点的一个区域) fast_match(Image : Matches : TemplateID, MaxError : ) |
快速匹配,在金字塔中搜索最佳灰度值匹配。 fast_match_mg(Image : Matches : TemplateID, MaxError, NumLevel : ) |
②释放模板内存资源
Legacy / Matching 释放模板的内存。 clear_template( : : TemplateID : ) |
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)

