Halcon中有一个模糊的图像具有高模版匹配成功率的示例程序(成功率几乎达到了100%):matching defocused pcb.hdev

 

实现的关键是在创建模版、查找模版时,对NumLevels参数(金字塔层数)进行合理设置,如下所示:

 

create_shape_model (ImageReduced, 'auto', -0.39, 0.78, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
……
find_shape_model (Image, ModelID, -0.39, 0.78, 0.7, 1, 0.5, 'least_squares', [0,-1], 0.9, Row, Column, Angle, Score)
 
 
通过get_shape_model_params算子可知:创建模版中,NumLevels('auto')值为6,这是一个较高的金字塔层级。
 
由此,我们得出结论:
 

create_shape_model中,如果NumLevels参数填'auto'或者较大的值(例如6),且find_shape_model中,NumLevels参数填[0,-1]时,针对模糊图像的匹配能力极为强劲。

(当然,find_shape_model中,NumLevels参数也可以填[6,-1]、[7,-1]、[8,-1]……[0,-2]、[0,-3]、[0,-999]、[0,-10086]……

 

 

为什么会这样呢?其实帮助文档的NumLevels参数描述中,解释了这一原因。下面是DeepSeek的翻译:(嫌太长可以先跳过引用的翻译)

 

NumLevels:

搜索过程中使用的金字塔层数由NumLevels决定。如果需要,层数会被限制在通过create_shape_model创建形状模型时指定的范围内:如果NumLevels设置为0,则使用create_shape_model中指定的金字塔层数。

 

在某些情况下,例如通过create_shape_model自动确定的金字塔层数可能过高。这可能导致一些最终得分较高的匹配在最高金字塔层被拒绝,从而无法被找到。与其将MinScore设置为一个非常低的值以找到所有匹配,更好的方法是通过get_shape_model_params查询NumLevels的值,然后在find_shape_model中使用稍低的值。这种方法通常在匹配速度和鲁棒性方面表现更好。

 

 

可选地,NumLevels可以包含第二个值,用于确定要跟踪到的最低金字塔层级。因此,NumLevels的值为[4, 2]意味着匹配从第4金字塔层级开始,并将匹配项跟踪到第2层金字塔。这种机制可以用来减少匹配的运行时间。然而,需要注意的是,通常在这种模式下提取的姿态参数的准确性比正常模式下的要低,在正常模式下匹配项会被跟踪到最低金字塔层级。因此,如果需要高精度,SubPixel应至少设置为'least_squares'。如果选择的最低金字塔层级过大,可能会导致无法达到所需的精度,或者因为模型在较高的金字塔层级上不够具体而无法可靠地选择模型的正确实例,从而找到模型的错误实例。在这种情况下,必须将使用的最低金字塔层级设置为更小的值。
 

 

在质量较差的输入图像中,即那些例如失焦、变形或有噪声的图像中,通常在最低金字塔层级上找不到形状模型的任何实例。这种行为的原因是由于图像质量差导致的边缘信息缺失或变形。然而,在较高的金字塔层级上,边缘信息可能足够。但如果使用在较高金字塔层级上找到的实例,请记住上述关于精度和鲁棒性的限制。选择合适的金字塔层级,即至少可以找到一个形状模型实例的最低金字塔层级,取决于模型和输入图像。这个金字塔层级可能会因图像而异。为了便于在质量较差的图像上进行匹配,可以在匹配过程中自动确定至少可以找到一个模型实例的最低金字塔层级。为了激活这种机制,即使用所谓的“增加容差模式”,必须在NumLevels中将最低金字塔层级指定为负数。例如,如果将NumLevels设置为[4, -2],则匹配从第4金字塔层级开始,并将匹配项跟踪到第2低的金字塔层级(最低金字塔层级的值为1)。这意味着在金字塔层级2上搜索形状模型的实例。如果在此金字塔层级上找不到模型的实例,则确定至少可以找到一个模型实例的最低金字塔层级。此金字塔层级的实例将被返回。[ 作者注:第2个参数为负数时,它会玩命给你找到至少1个匹配,除非输入图像中根本没有建模对象 ]
 

 

最后是关键点总结:

  1. NumLevels控制搜索的金字塔层数,影响匹配速度、精度和鲁棒性。

  2. 自动模式(如[0,-1])适合复杂或低质量图像,动态调整层数以找到最佳匹配。

  3. 固定层数(如4)适合简单场景或对速度要求高的场景,但可能牺牲精度。

  4. 增加容忍度模式(负值)用于处理低质量图像,自动调整到能检测到目标的最低层。

  5. 高精度需求时,建议至少将SubPixel设置为'least_squares',并确保最低金字塔层足够低(例如2,一般不推荐1,速度太慢)。

 

 

拓展问题:查找模版时,NumLevels填[0,-1]或者填4,有什么区别?

find_shape_model (Image, ModelID, -0.39, 0.78, 0.7, 1, 0.5, 'least_squares',[0,-1], 0.9, Row, Column, Angle, Score)

find_shape_model (Image, ModelID, -0.39, 0.78, 0.7, 1, 0.5, 'least_squares',4,       0.9, Row, Column, Angle, Score)

 

 

 

posted on 2025-03-20 21:31  xh6300  阅读(378)  评论(0)    收藏  举报