-
称为基于边缘方向梯度的匹配,是一种最常用也是最前沿的模板匹配算法
(一)根本思想
-
以物体边缘的梯度相关性作为匹配标准
(二)原理
提取ROI中的边缘特征,结合灰度信息创建模板,并根据模板的大小和清晰度的要求生成多层级的图像金字塔模型
接着在图像金字塔层中自上而下逐层搜索模板图像,直到搜索到最底层或得到确定的匹配结果为止
(三)使用条件
该方法使用边缘特征定位物体,对于很多干扰因素不敏感,如光照和图像的灰度变化,甚至可以支持局部边缘缺失、杂乱场景、噪声、失焦和轻微形变的模型
更进一步说,它甚至可以支持多个模板同步进行搜索
但是它不适用于旋转和缩放比较大的情况
(四)形状匹配算子
/*
1.创建形状模型:create_shape_model()
2.寻找形状模型:find_shpae_model()
3.释放形状模型:clear_shape_model()
*/
(五)实例
1、创建ROI区域,准备模板图像用来创建模板(创建模板以后可以保存下来)
标准形状:draw_rectangle1/2、draw_circle、draw_ellipse、draw_line
任意形状:draw_region、draw_polygon
生成标准ROI:gen_rectangle1/2、gen_circle、gen_ellipse、gen_region_line
通过XLD创建AOI:gen_region_contour_xld、gen_region_polygon_xld
利用area_center()找到这个ROI区域的中心
通过reduce_domain()从图像中获取这个ROI区域
2、ROI修正,通过预处理改善图像质量,以便找到更合适的模板图像
修正函数:erosion(减小ROI)、dilation(扩大ROI)、shape_trans(形状转换)、boundary(像素级边界)、move_region(移动区域到新位置)
组合:intersection(交集)、difference(差集)、union2(两个区域的并集)
3、直接创建模板
create_shape_model(Template , // 模板图像
NumLevels, // 金字塔层数
AngleStart, // 起始角度
AngleExtent, // 角度范围
AngleStep, // 角度步长
Optimization, // 设置模板优化和模板创建方法
Metric, // 匹配方法设置
Contrast, // 模板中前景与背景的对比度
MinContrast, // 被查找图片的最小对比度
ModelID) // 模板ID
// 可缩放比例
create_scaled_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 0, 0.8, 1.0, 0, ['none','no_pregeneration'], 'ignore_global_polarity', 40, 10, ModelID)
通过determine_shape_model_params算子得到金字塔层数,再通过inspect_shape_model算子测试对比度的数值是否合理
创建好模板以后,需要监视模板,用inspect_shape_model算子来完成,用来检测参数的适用性与找到合适的参数
-
该算子执行后将会把预设参数的金字塔分级图像显示出来,可以根据需要判断参数选取的是否合理
inspect_shape_model(Image : // 输入参数,输入图像
ModelImages, // 输出参数,输出图像基于金字塔的影像
ModelRegions : // 输出参数,输出模型区域
NumLevels, // 输入参数,使用的金字塔层数。默认4,范围1~10
Contrast : ) // 输入参数,设置对比度。默认30,参考10,20,30,40,60,80,100,120,140,160
(1)NumLevels
最开始是第一层,逐层+1
金字塔越小,细节信息越多,定位的更准确,但消耗的时间也更多;金字塔越大,找到匹配使用的时间就越小
另外必须保证最高层的图像具有足够的信息(至少四个点)。如果金字塔过大,模板不容易识别出来,这是需要将find_shape_model函数中MinScore和Greediness参数设置的低一些(注意这里的解决办法!!!)
如果最高层金字塔的消息太少,算法内部会自动减少金字塔层数
如果最底层金字塔的信息太少,函数就会报错
如果设为auto,算法会自动计算金字塔的层数,我们可以通过get_shape_model_params函数查看金字塔的层数
// 根据创建的模型ID来查看形状模型的参数
get_shape_model_params( : : ModelID : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)
// ScaleMin, ScaleMax, ScaleStep是模型的最小比例、最大比例、缩放步长
(2)Contrast
<