一、介绍

        基于灰度值的模板匹配是最经典的模板匹配算法,也是最早提出来的模板匹配算法。这种算法的根本思想是,计算模板图像与检测图像之间的像素灰度差值的绝对值总和(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)

输入参数,输入准备好的模板图像。

输入参数,金字塔层次的最大数。默认4。

输入参数,最小旋转模式。默认-0.39,建议值 -3.14, -1.57, -0.79, -0.39, -0.20, 0.0。

输入参数,角度展开的最大正扩展。默认0.79,范围:AngleExtend > 0

输入参数,步进率(角精度)的匹配。默认 0.0982,范围AngleStep > 0

输入参数,优化的方法类型。默认'sort'进行优化(结果稳定,但时间会稍长),范围'none'不优化, 'sort'。

输入参数,使用原始图像的灰度还是使用边缘梯度进行匹配。 默认'original'

'gradient'光照情况比较稳定,图像灰度变化不大,可以选用(即使用原始灰度差值作为匹配的判断条件)。

'normalized'标准的。

'original'

'sobel'

输出参数,创建模板后,返回的模板句柄。

        三、创建好模板后,接着可以使用各种匹配算子进行灰度的匹配

       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)


matchTemplate 基于灰度 基于灰度值的模板匹配_灰度

holesBoard.jpg

matchTemplate 基于灰度 基于灰度值的模板匹配_视觉检测_02

holesBoardNoise.jpg