一、基于灰度值的模板匹配
1. 基本原理
基于灰度值的匹配通过衡量模板图像(T)与待匹配图像(S)子区域的灰度相似性实现定位,核心是计算归一化积相关系数(NCC),公式如下:
(R(i,j) = \frac{\sum{m=1}^{M}\sum{n=1}^{N} T(m,n) \cdot S{i,j}(m,n)}{\sqrt{\sum{m=1}^{M}\sum{n=1}^{N} T(m,n)^2 \cdot \sum{m=1}^{M}\sum{n=1}^{N} S{i,j}(m,n)^2}})
(R(i,j) \in [-1,1]),值越接近 1,匹配度越高。
原理:模板在待匹配图像上滑动,计算每个位置的 NCC 值,最大值对应最佳匹配位置。
2. 序贯相似性检测算法(SSDA)
为提高效率,SSDA 通过累加误差阈值判断提前终止非匹配区域的计算:
定义绝对误差:(|S_{i,j}(m,n) - T(m,n)|);
设定阈值(T_k),随机选取像素点累加误差,若超过(T_k)则标记为非匹配区域,记录累加次数r;
r越大,匹配度越高(匹配区域需更多计算才可能超过阈值)。
3. Halcon 灰度匹配算子及实例
核心算子
create_ncc_model(Template, NumLevels, AngleStart, AngleExtent, AngleStep, Metric, ModelID):创建 NCC 模板find_ncc_model(Image, ModelID, AngleStart, AngleExtent, MinScore, NumMatches, ..., Row, Column, Angle, Score):搜索最佳匹配
实例:SMD 芯片匹配
dev_update_off () read_image (Image, 'smd/smd_on_chip_05') // 读取图像 get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) dev_set_color ('green') dev_set_draw ('margin') // 定义模板区域(ROI) gen_rectangle1 (Rectangle, 175, 156, 440, 460) reduce_domain (Image, Rectangle, ImageReduced) // 裁剪模板区域 // 创建NCC模板(支持旋转角度0~0,自动金字塔层级) create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID) dev_display (Image) dev_display (Rectangle) stop () // 批量匹配多幅图像 for J := 1 to 11 by 1 read_image (Image, 'smd/smd_on_chip_' + J$'02') // 搜索匹配(最小得分0.5,最多1个匹配) find_ncc_model (Image, ModelID, 0, 0, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score) dev_display (Image) // 显示匹配结果 dev_display_ncc_matching_results (ModelID, 'green', Row, Column, Angle, 0) stop () endfor clear_ncc_model (ModelID) // 释放模板二、基于特征的模板匹配
1. 基本原理
通过提取图像的特征点 / 轮廓 / 矩等信息进行匹配,解决灰度匹配对光照、旋转敏感的问题,常见方法包括:
不变矩匹配:利用图像矩的旋转 / 缩放不变性匹配;
距离变换匹配:计算边缘点到模板边缘的最小欧式距离,距离越小匹配度越高;
最小均方误差匹配:通过仿射变换模型最小化对应点对的误差。
2. Halcon 特征匹配算子及实例
核心算子
create_shape_model(Template, NumLevels, AngleStart, AngleExtent, AngleStep, ..., ModelID):创建形状模板find_shape_model(Image, ModelID, AngleStart, AngleExtent, MinScore, ..., Row, Column, Angle, Score):搜索形状匹配
实例:形状模板匹配
dev_update_off () read_image (Image, 'part.png') // 读取包含目标的图像 dev_close_window () get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) // 提取模板区域(假设目标为矩形) threshold (Image, Region, 100, 255) connection (Region, ConnectedRegions) select_shape (ConnectedRegions, TemplateRegion, 'area', 'and', 500, 10000) // 检查模板可行性(生成金字塔层级) inspect_shape_model (TemplateRegion, ModelImages, ModelRegions, 4, 30) // 创建形状模板(支持旋转-30°~30°,步长1°) create_shape_model (TemplateRegion, 4, -0.52, 1.05, 'auto', 'none', 'use_polarity', 30, 10, ModelID) // 获取模板轮廓用于显示 get_shape_contours (ModelContours, ModelID, 1) // 读取待匹配图像并搜索 read_image (TestImage, 'part_test.png') find_shape_model (TestImage, ModelID, -0.52, 1.05, 0.6, 1, 0.5, 'least_squares', 0, 0.9, Row, Col, Angle, Score) // 显示结果 dev_display (TestImage) dev_display_shape_matching_results (ModelID, 'green', Row, Col, Angle, 1, 1, 0) stop () clear_shape_model (ModelID) // 释放模板
三、图像金字塔
1. 定义与作用
图像金字塔是多分辨率图像集合,自下而上分辨率逐步降低,用于:
加速匹配(先在低分辨率层粗匹配,再在高分辨率层精匹配);
提高抗干扰能力(低分辨率层过滤细节噪声)。
2. 常见类型
高斯金字塔:通过高斯模糊 + 下采样(去除偶数行 / 列)生成,用于向下采样;
拉普拉斯金字塔:记录高斯金字塔层间差异,用于图像重建(向上采样)。
3. Halcon 金字塔相关算子
inspect_shape_model(Image, ModelImages, ModelRegions, NumLevels, Contrast):检查模板并生成金字塔;create_shape_model中NumLevels参数指定金字塔层级(通常 3~5 层)。
四、Halcon Matching 助手
1. 功能
可视化创建模板、设置参数(如旋转范围、最小得分)、测试匹配结果,并自动生成代码,支持 4 种匹配方式:
基于形状的匹配;
基于相关性的匹配(NCC);
基于描述符的匹配;
基于形变的匹配。
2. 使用步骤
打开助手:
助手 → 打开新的Matching;创建模板:从图像中框选 ROI 或加载已有模板;
配置参数:设置角度范围、金字塔层级、最小得分等;
测试匹配:在 “检测” 选项卡执行匹配,查看结果;
生成代码:在 “代码生成” 选项卡导出可执行的 Halcon 程序。
五、本章小结
灰度匹配:基于像素灰度相关性(NCC),适用于光照稳定、无大幅形变场景;
特征匹配:基于形状 / 轮廓特征,抗光照、旋转能力强,适用于复杂场景;
图像金字塔:通过多分辨率加速匹配,平衡效率与精度;
Matching 助手:简化模板创建与参数调试,快速生成匹配代码。
习题参考思路
8.1:图像匹配目的是定位目标在图像中的位置 / 姿态,常用方法包括灰度匹配(NCC、SSDA)、特征匹配(形状、不变矩)、基于描述符的匹配(SIFT、SURF)等。
8.2 字母识别:
步骤:创建每个字母的形状模板 → 对测试图像预处理(二值化、去噪) → 用
find_shape_model批量匹配并输出结果。
8.3 数字 3 和 5 识别:
步骤:分别创建 “3” 和 “5” 的模板 → 遍历图像用
find_shape_model搜索,设置NumMatches为 “所有”,筛选得分高于阈值的结果。