HALCON Local Deformable Matching 实现(二)

经过一段时间的编码与调试,我终于完成了find_local_deformable_model(局部可变形模板匹配)的第一个可用版本。开发过程中遇到了不少问题,好在有AI的帮助,大部分问题都顺利解决了。下面主要总结一下开发过程中遇到的几个核心问题,以及目前采用的解决方案。

关于“形变场”的选择

在生成稠密形变场时,我先后尝试了多种经典方法,包括B样条自由变形(FFD)薄板样条插值(TPS),以及通过求解拉普拉斯方程实现的调和插值(Harmonic Interpolation)

经过对比,调和插值的整体效果最好。不过,目前的生成结果与Halcon官方例程中展示的形变场相比,在形态上仍有明显差异。

这部分我会继续探索,尝试缩小与 Halcon 官方实现之间的差异。

局部可变形匹配中最棘手的问题:歧义性

局部可变形匹配的基本思路是:先把模板上的特征点划分成多个小块(patch),每个patch相当于稀疏形变场中的一个控制点。然后对每个patch单独做匹配,算出它在目标图像中的位移(u,v)。

但问题在于,当图像中存在重复纹理或严重扭曲时,匹配得分图中常常会出现多个局部极值点,导致匹配结果不确定——这就是我所说的“歧义性”。我认为这是局部可变形匹配中最难处理的问题。

为了抑制歧义性,我采用了以下策略:

1. 位移逐层传递

从金字塔的高层(低分辨率)开始匹配,将得到的位移结果逐层传递给下一层,作为初始估计,从而减少低层匹配时的搜索范围。

2. 次优峰值抑制

该方法源于 David Lowe 的 SIFT 算法,通过比较匹配得分最高与次高两个峰值。若差距过小,表明匹配存在歧义,该结果将被舍弃。

3. 周围控制点约束

检查每个控制点的位移是否和它周围控制点的位移明显不同。差异过大的点会被剔除,以保证整体形变的平滑性。

4. 雅可比行列式滤波

计算形变的雅可比行列式,如果出现负值(表示局部翻转)或接近零(表示过度压缩),则判断该区域形变不合理,予以剔除。

5. 局部梯度/应变能滤波

计算位移场的局部梯度幅值(可以理解为应变能),找出那些形变程度和整体统计规律差异很大的“刺头”区域,并将其移除。

效果展示与使用说明

新的测试程序已发布(版本日期:2026.09.02),在程序的缩放方式下拉框中选择局部可变形,即可调用find_local_deformable_model。该模式支持设置缩放比例,推荐范围是(1.0,1.0)或(0.9,1.1)。

目前仅在Halcon官方例程中的cocoa和gasket图片集上进行了测试,匹配效果仍有不尽人意之处。由于本次代码大部分由AI辅助完成,不仅耗时较长,还可能存在一些bug,我会持续进行打磨和优化。欢迎感兴趣的朋友下载测试,并提出宝贵意见!

下载地址:mwwztech.com

cocoa_packages_08.png cocoa_packages_12.png gasket_05.png gasket_04.png