一、基于形状模板匹配的原理
1.形状模板匹配的原理及实现过程
原理:是基于边缘方向梯度的匹配。该方法是以物体边缘的梯度相关性为 匹配标准,提取兴趣区区域内的边缘特征,根据模板的大小和清晰度要求生成多层级的图像金字塔模型,接着再图像金字塔层自上而下逐层搜索模板图像,直至搜索到底层或者确定的匹配结果为止。
优点:形状模板是最常用,最有效,最快速的匹配方法,对很多干扰因素不敏感,如光照和图像灰度发生变化,甚至支持局部边缘缺失杂乱场景,噪声,失焦,轻微变形。
缺点:不适用于旋转和缩放比较大的情况。
实现过程:
1.创建ROI区域,准备模板图像用来创建模板
2.图像预处理,改善图像质量,以便图像效果更好
3.创建模板用于模板匹配
4.获得图像模板的轮廓,用于之后的匹配
5.进行模板匹配,得到图像对应匹配区域的行纵坐标以及角度和匹配分值等信息。
2.形状模板匹配的应用场景
- 适用于目标轮廓比较清晰的场景。
- 适用于杂乱场景、遮挡、非线性光照变化、尺寸缩放、失焦和轻微形变的图像,以及多通道图像和多个模板的同步匹配。
- 适用于纹理简单的图像。
3.形状模板匹配算子及参数介绍
1.确定模板匹配的相关参数 determine_shape_model_params(可以自动获取类似对比度等参数)
determine_shape_model_params(Template, // 模板 ‘auto’, // 金字塔层数 0, // 起始角度 rad(360), // 角度范围 0.9, // 缩小范围 1.1, // 放大范围 ‘auto’, // 减少像素的方法 ‘use_polarity’, // 极性 ‘auto’, // 对比度 ‘auto’, // 最小对比度 'all', // 需要自动确定的参数 ParameterName, // Name of values
2.创建模板 create_shape_model
create_shape_model(Template , // 模板图像 NumLevels, // 金字塔层数 AngleStart, // 起始角度 AngleExtent, // 角度范围 AngleStep, // 角度步长 Optimization, // 设置模板优化和模板创建方法 Metric, // 匹配方法设置 Contrast, // 模板中前景与背景的对比度 MinContrast, // 被查找图片的最小对比度 ModelID) // 模板ID
3.检测模板的金字塔层是否合理 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
4.在图像中搜索模板 find_shape_model
find_shape_model(Image, // 搜索图像 ModelID, // 模板句柄 AngleStart, // 搜索时的起始角度 AngleExtent, // 搜索时的角度范围,必须与创建模板时的有交集 MinScore, // 最小匹配值,输出的匹配的得分Score大于该值 NumMatches, // 定义要输出的匹配的最大个数 MaxOverlap, // 当找到的目标存在重叠时,且重叠大于该值时选择一个好的输出 SubPixel, // 计算精度的设置,五种模式,多选2,3 NumLevels, // 搜索时金字塔的层数 Greediness, // 贪婪度,搜索启发式,一般都设为0.9,越高速度快,容易出现找不到的情况 Row, Column, Angle, Score) // 输出匹配位置的行和列坐标、角度、得分(模板在搜索图像中可见比例的近似测量,如果模板的一半被遮挡,该值就不能超过0.5)
二、形状模板匹配的类型
- 一般形状匹配模板shape_model、
- 线性变形匹配模板planar_deformable_model、
- 局部可变形模板local_deformable_model、
- 和比例缩放模板Scale_model
三、形状模板匹配的案列及代码
*传入第一张图片做模板 read_image (Image, 'C:/Users/Maxwell/Desktop/模板匹配testimage/1.jpg') rgb1_to_gray (Image, GrayImage) dev_open_window (0, 0, 512, 512, 'black', WindowHandle) dev_display (GrayImage) dev_set_draw ('margin') *draw_rectangle2 (WindowHandle, Row1, Column1, Phi, Length1, Length2) gen_rectangle2 (Rectangle, 2258.64, 893.313, -0.0, 228.375, 179.435) reduce_domain (GrayImage, Rectangle, ImageReduced) create_shape_model (ImageReduced, 'auto', rad(0),rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) * Image Acquisition 01: Code generated by Image Acquisition 01 list_files ('C:/Users/Maxwell/Desktop/模板匹配testimage', ['files','follow_links'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) for Index := 0 to |ImageFiles| - 1 by 1 read_image (Image_t, ImageFiles[Index]) rgb1_to_gray (Image_t, GrayImage_t) find_shape_model (GrayImage_t, ModelID, rad(0), rad(360), 0.1, 1, 0.5, 'least_squares', 0, 0.5, Row, Column, Angle, Score) vector_angle_to_rigid (2258.64, 893.313, 0, Row, Column, Angle, HomMat2D) dev_set_color ('green') dev_set_line_width (3) affine_trans_region (Rectangle, RegionAffineTrans, HomMat2D, 'nearest_neighbor') dev_display (GrayImage_t) dev_display (RegionAffineTrans) * Image Acquisition 01: Do something endfor
创建的模板:
模板匹配的结果:
参考文章:(26条消息) halcon知识:常见三种模板匹配方法总结_halcon 模板匹配_无水先生的博客-CSDN博客
基于形状的模板匹配(Shape-Based)_shape匹配_盾山狂热粉的博客-CSDN博客