Halcon 第五章『模板匹配Matching』◆第2节:基于灰度值的模板匹配|Gray-Value-Based

本文详细介绍了基于灰度值的模板匹配算法,这是一种经典的图像处理技术,主要用于简单图像的匹配。算法通过计算模板图像与检测图像的像素灰度差值进行匹配,包括SAD和SSD两种方法。然而,该方法对光照变化和尺寸变化敏感,且不适用于多通道图像。文章还阐述了模板匹配的步骤,包括创建模板、适应图像大小、进行匹配和释放资源,并提供了相关函数的使用示例。尽管复杂度高、耗时且对变化敏感,但在特定条件下仍有其应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         一、介绍

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

### Halcon 模板匹配的底层实现原理 Halcon模板匹配功能通过预先创建一个模型来描述目标对象,该模型包含了用于后续搜索过程中的各种特征信息。在实际应用中,当需要在一个新的场景图像里寻找已知物体的位置时,算法会尝试将存储好的模板与新输入图片的内容相比较。 #### 创建模板阶段 为了提高效率并减少误报率,在构建模板的过程中会对原始样本进行多尺度变换以及旋转操作,从而形成一个多姿态下的表示形式[^3]。这一步骤不仅能够增强系统的鲁棒性,而且有助于覆盖更广泛的变化情况。对于每一个可能的姿态角度,都会计算出一组局部不变量作为描述符,这些描述符可以是对边缘强度、纹理特性或者是颜色分布等方面的量化度量。 #### 特征提取与描述 针对每种类型的视觉属性(如灰度级梯度方向直方图 HOG 或者 SIFT 关键点),都有专门设计的方法来进行高效而精确地捕捉。例如,在 HALCON 中常用的 Edge-basedGray-value based 方法分别侧重于轮廓线结构和亮度变化趋势两个不同侧面的信息获取方式[^1]。通过对候选区域内的像素值差异做统计分析,可以获得一系列具有区分性的数值向量;随后再经过降维处理以降低数据维度的同时保持足够的表达能力。 #### 匹配策略 一旦完成了上述准备工作之后,则进入到了核心环——即如何有效地完成两者之间的相似程度评估工作。这里采用了一套基于投票机制的设计思路:每当发现一处疑似位置时便会在对应坐标处投下一票;随着遍历范围不断扩大累积下来的得分也就越高直至最终锁定最优解为止。此外还引入了一些启发式的优化措施比如限制搜索窗口大小或是设定最低合格分数线等等手段进一步提升性能表现。 ```cpp // C++ Pseudo Code for Template Matching Process void templateMatching(const Image& sceneImage, const Model& model) { // Preprocess the image and extract features according to the type of matching (Edge/Gray) // For each possible transformation (scale, rotation), apply it on the model // Calculate similarity scores between transformed models and parts of the scene image using feature descriptors // Accumulate votes at potential locations where matches occur // Select location with highest score as match result } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值