<Halcon> 浅学形状模板匹配

形状模板匹配算子

1、形状模板匹配

  • create_shape_model
    准备一个形状模型进行匹配。
  • create_shape_model_xld
    准备从XLD轮廓进行匹配的形状模型。
  • find_shape_model
    在图像中找到形状模型的最佳匹配。
  • find_shape_models
    找到多个形状模型的最佳匹配。

2、缩放形状模板匹配

  • create_scaled_shape_model
    准备一个各向同性缩放形状模型进行匹配。
  • create_scaled_shape_model_xld
    准备各向同性缩放形状模型,用于从XLD轮廓进行匹配。
  • create_aniso_shape_model
    准备一个各向异性缩放形状模型进行匹配。
  • create_aniso_shape_model_xld
    准备一个各向异性缩放形状模型,用于从XLD轮廓进行匹配。
  • find_scaled_shape_model
    在图像中寻找各向同性缩放形状模型的最佳匹配。
  • find_scaled_shape_models
    寻找多个各向同性比例形状模型的最佳匹配。
  • find_aniso_shape_model
    寻找图像中各向异性缩放形状模型的最佳匹配。
  • find_aniso_shape_models
    寻找多个各向异性比例形状模型的最佳匹配。

3、通用形状模板匹配

  • create_generic_shape_model
    创建一个形状模型。
  • set_generic_shape_model_object
    设置形状模型的对象参数。
  • set_generic_shape_model_param
    设置形状模型的选定参数。
  • train_generic_shape_model
    训练形状模型进行匹配。
  • find_generic_shape_model
    在图像中找到一个或多个形状模型的最佳匹配。
  • get_generic_shape_model_param
    返回形状模型的参数。
  • get_generic_shape_model_result
    从形状匹配结果中获取数值。
  • get_generic_shape_model_result_object
    从形状匹配结果中获取对象。

关键算子参数

1、create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

  • NumLevels
    金字塔级别的数量由参数NumLevels决定。它应该选择尽可能大的,这样可以减少寻找对象所需的时间。另一方面,NumLevels的选择必须使模型仍然是可识别的,并且在最高金字塔级别上包含足够数量的点(至少4个)。这可以使用inspect_shape_model的输出来检查。如果没有生成足够的模型点,则在内部减少金字塔级别的数量,直到在最高金字塔级别上找到足够的模型点。如果这个过程将导致一个没有金字塔级别的模型,也就是说,如果在最低的金字塔级别上模型点的数量已经太小,create_shape_model将返回一个错误消息。
    如果NumLevels被设置为’auto’(或者设置为0),create_shape_model会自动确定金字塔级别的数量。可以使用get_shape_model_params查询自动计算的金字塔级别数。在极少数情况下,create_shape_model为金字塔级的数量确定的值可能过大或过小。如果选择的金字塔级别数量太大,则可能无法在图像中识别模型,或者可能需要在find_shape_model中为MinScore或greedy选择非常低的参数才能找到模型。如果选择的金字塔级别数量太少,则在find_shape_model中查找模型所需的时间可能会增加。在这些情况下,应该使用inspect_shape_model的输出来选择金字塔级别的数量。
  • AngleStart, AngleExtent和AngleStep:
    参数AngleStart和AngleExtent决定了可能的旋转范围,模型可以在其中出现在图像中。注意,模型只能通过find_shape_model在这个角度范围内找到。参数AngleStep决定了在所选角度范围内的步长。因此,如果find_shape_model中没有指定亚像素精度(参数 “SubPixel”),则该参数指定find_shape_model中角度可以实现的精度。AngleStep应该根据对象的大小来选择。较小的模型在图像中不具有许多不同的离散旋转,因此对于较小的模型,应该选择较大的AngleStep。如果AngleExtent不是AngleStep的整数倍,则对AngleStep进行相应的修改。为了确保find_shape_model返回的旋转角度值不完全为0.0的模型实例,可能的旋转范围修改如下:如果没有正整数n使AngleStart加上n次AngleStep正好为0.0,则AngleStart减少最多AngleStep, AngleExtent增加最多AngleStep。
  • Optimization
    对于特别大的模型,通过将Optimization设置为不同于“none”的值来减少模型点的数量可能是有用的。如果Optimization = ‘none’,则存储所有模型点。在所有其他情况下,根据Optimization的值减少点数。如果点数减少,可能需要在find_shape_model中将参数greedy设置为较小的值,例如0.7或0.8。对于小模型,减少模型点的数量并不会导致搜索的加速,因为在这种情况下,通常必须检查更多的模型的潜在实例。
    如果optimize被设置为“auto”,create_shape_model会自动决定模型点数量的减少。
  • Metric
    如果Metric = ‘use_polarity’,则图像中的对象和模型中的对象必须具有相同的对比度。例如,如果模型是暗背景上的明亮物体,则只有当该物体也比背景亮时才会被发现。
    如果Metric = ‘ignore_global_polarity’,则如果全局对比度相反,也可以在图像中找到该对象。在上面的例子中,如果物体比背景暗,也会被发现。在这种情况下,find_shape_model的运行时间会略微增加。
    如果Metric = ‘ignore_local_polarity’,则即使对比度在局部发生变化,也可以找到模型。这个模式可以,例如,是有用的,如果对象包含一个中等灰度值的部分,其中或暗或亮的子对象。因为在这种情况下,find_shape_model的运行时间会显著增加,所以最好创建几个模型来反映对象与create_shape_model的可能对比变化,并同时将它们与find_shape_models进行匹配。
    以上三个指标只能应用于单通道图像。如果使用多通道图像作为模型图像或搜索图像,则只使用第一个通道(并且不会返回错误消息)。
    如果Metric = ‘ignore_color_polarity’,则即使局部颜色对比度发生变化,也可以找到模型。例如,如果物体的某些部分可以改变它们的颜色,例如,从红色到绿色。特别是,如果事先不知道对象在哪些通道中可见,则此模式非常有用。在这种模式下,find_shape_model的运行时间也会显著增加。度量’ignore_color_polarity’可用于具有任意数量通道的图像。如果它用于单通道图像,它具有与’ignore_local_polarity’相同的效果。应该注意的是,对于Metric = ‘ignore_color_polarity’,使用create_shape_model创建模型的通道数和使用find_shape_model搜索模型的通道数可能不同。例如,这可以用于从合成生成的单通道图像创建模型。此外,应该注意的是,通道不需要包含光的光谱细分(如在RGB图像中)。例如,通道还可以包含通过从不同方向照射该物体而获得的同一物体的图像。
  • Contrast
    参数Contrast决定了模型点必须具有的对比度。对比度是物体与背景之间以及物体不同部分之间局部灰度值差异的度量。应该选择对比,以便仅将模板的重要特征用于模型。Contrast也可以包含两个值的元组。在这种情况下,使用类似于edges_image中使用的滞后阈值方法对模型进行分割。在这里,元组的第一个元素决定了下限阈值,而第二个元素决定了上限阈值。有关迟滞阈值方法的详细信息,请参见hysteresis_threshold。另外,Contrast可以包含第三个值,作为元组的最后一个元素。该值决定了一个阈值,用于根据组件的大小选择重要的模型组件,即,具有比指定的最小尺寸更少的点的组件被抑制。由于在构件的范围上应用了最小尺寸,导出的模型轮廓仍然可以小于指定的最小尺寸。对于每一个连续的金字塔层,最小尺寸的阈值除以2。如果要抑制小模型分量,但不执行迟滞阈值,则必须在Contrast中指定三个值。在这种情况下,可以简单地将前两个值设置为相同的值。这个参数的效果可以通过inspect_shape_model提前检查。
    如果对比度设置为“auto”,create_shape_model将自动确定上述三个值。只有对比度(‘auto_contrast’)、滞后阈值(‘auto_contrast_hyst’)或最小大小(‘auto_min_size’)可以自动确定。其他未自动确定的值可以另外以元组的形式传递。还允许各种组合:例如,如果传入[‘auto_contrast’,‘auto_min_size’],则自动确定对比度和最小大小。如果传入[‘auto_min_size’,20,30],则自动确定最小大小,并设置迟滞阈值为20和30等。在某些情况下,可能会发生自动确定对比度阈值不令人满意的情况。例如,如果由于特定于应用程序的原因需要包含或抑制某些模型组件,或者如果对象包含几个不同的对比,则应该首选手动设置这些参数。因此,对比阈值应该使用determine_shape_model_params自动确定,然后在调用create_shape_model之前使用inspect_shape_model进行验证。请注意,MinContrast会影响自动对比度估计,因此也会影响最小大小的估计。
  • MinContrast
    使用MinContrast,可以确定在find_shape_model执行的识别中模型至少必须具有哪种对比度。换句话说,该参数将模型与图像中的噪声分离开来。因此,一个很好的选择是图像中噪声引起的灰度值变化范围。例如,如果灰度值在10个灰度级范围内波动,则MinContrast应设置为10。如果多通道图像用于模型和搜索图像,并且如果参数Metric设置为“ignore_color_polarity”(见上文),则必须将一个通道中的噪声乘以通道数量的平方根以确定MinContrast。例如,如果灰度值在单个通道的10个灰度级范围内波动,并且图像是三通道图像,则MinContrast应设置为17。显然,MinContrast必须小于Contrast。如果要在对比度非常低的图像中识别模型,MinContrast必须设置相应的小值。如果要在严重遮挡的情况下也能识别模型,为了保证find_shape_model鲁棒准确地提取模型的位置和旋转,MinContrast应略大于噪声产生的灰度值波动范围。
    如果MinContrast设置为“auto”,则根据模型图像中的噪声自动确定最小对比度。因此,只有当识别过程中的图像噪声与模型图像中的噪声相似时,自动确定才有意义。此外,在某些情况下,建议增加自动确定的值,以增加对遮挡的鲁棒性(见上文)。可以使用get_shape_model_params查询自动计算的最小对比度。

2、find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)

  • AngleStart和AngleExtent:
    参数AngleStart和AngleExtent决定了搜索模型的旋转范围。如果有必要,旋转范围将被剪切到使用create_shape_model创建模型时给定的范围。特别地,这意味着模型和搜索的角度范围必须重叠。
    请注意,在某些情况下,可以找到稍微超出指定范围的旋转实例。如果指定的范围小于模型创建期间给出的范围,则可能发生这种情况。AngleStart和AngleExtent只在最高的金字塔级别检查。在最高金字塔级别找到的匹配将细化到最低金字塔级别。但是,出于性能原因,在细化期间不再检查匹配是否仍在指定范围内。
  • MinScore:
    参数MinScore决定了一个潜在匹配至少必须被视为图像中模型的一个实例的分数。选择的MinScore越大,搜索速度越快。如果可以期望模型在图像中永远不会被遮挡,MinScore可以设置为0.8甚至0.9。如果匹配没有跟踪到最低的金字塔级别(见下文),则可能会发现得分略低于MinScore的实例。
    如果形状模型已经通过set_shape_model_clutter参数扩展,因此启用了“use_clutter”,MinScore期望第二个值,该值决定了潜在匹配的杂波值最多必须被视为图像中模型的实例。使用杂乱参数的运行时至少与没有杂乱参数且NumMatches设置为0的运行时一样高。更改第二个值不会影响运行时。
  • NumMatches:
    可以使用NumMatches来确定要查找的最大实例数。如果在图像中找到分数大于MinScore的多个NumMatches实例,则只返回最佳NumMatches实例。如果找到的个数少于NumMatches,则只返回该个数,即参数MinScore优先于NumMatches。如果应该找到图像中所有超过MinScore的模型实例,则必须将NumMatches设置为0。
    当通过图像金字塔跟踪匹配时,在每个级别上,基于NumMatches会拒绝一些不太有希望的匹配。因此,可能会拒绝一些在最低金字塔级别上得分较高的匹配。因此,例如,当NumMatches设置为1时,找到的匹配可能不同于将NumMatches设置为0或>1.
    如果期望有多个具有相似分数的对象,但只返回得分最高的对象,则最好引发NumMatches,然后选择得分最高的匹配。
    如果形状模型已经通过使用set_shape_model_clutter的杂波参数进行了扩展,那么NumMatches还会考虑MinScore中传递的第二个值。在这种情况下,匹配的实例将是得分大于MinScore的第一个条目并且杂波值小于第二个条目的实例。如果图像中匹配的实例数量大于NumMatches,则返回与杂波值相关的最佳NumMatches实例。尽管如此,MinScore优先于NumMatches,如果应该返回所有满足MinScore所施加条件的模型实例,则必须将NumMatches设置为0。请注意,使用杂波参数,当通过图像金字塔跟踪匹配时,没有匹配被拒绝。因此,使用杂乱参数的运行时至少与没有杂乱参数且NumMatches设置为0的运行时一样高。
  • MaxOverlap:
    如果模型显示对称性,则可能会在图像中发现具有相似位置但不同旋转的多个实例。参数MaxOverlap决定了两个实例最多可能重叠的分数(即0到1之间的一个数字),以便将它们视为不同的实例,从而单独返回。如果两个实例重叠的范围大于MaxOverlap,则只返回最佳实例。重叠的计算基于所找到实例的任意方向的最小封闭矩形(参见smallst_rectangle2)。如果MaxOverlap=0,则找到的实例可能根本不重叠,而对于MaxOverlap=1,则返回所有实例。
  • SubPixel:
    参数SubPixel决定是否应该以亚像素精度提取实例。如果SubPixel设置为“none”(或为向后兼容设置为“false”),则模型的姿态仅由像素精度和create_shape_model指定的角度分辨率确定。如果SubPixel设置为“interpolation”(或“true”),则位置和旋转以亚像素精度确定。在这种模式下,模型的姿态从分数函数中插值。这种模式几乎不需要花费任何计算时间,并且达到了对大多数应用程序来说足够高的精度。然而,在某些应用中,精度要求非常高。在这些情况下,可以通过最小二乘调整来确定模型的姿态,即通过最小化模型点到相应图像点的距离来确定模型的姿态。与“插值”相比,这种模式需要额外的计算时间。最小二乘调整的不同模式(‘least_squares’, ‘least_squares_high’和’least_squares_very_high’)可用于确定搜索最小距离的精度。然而,选择的精度越高,亚像素提取所需的时间就越长。通常,SubPixel应该设置为“插值”。如果需要最小二乘调整,则应该选择’least_squares’,因为这可以在运行时间和精度之间进行最佳权衡。
    相对于模型略微变形的对象,在某些情况下无法找到或被找到,但精度很低。对于这样的对象,可以在参数SubPixel中额外传递一个最大允许对象变形。变形必须以像素为单位指定。这可以通过传递可选参数值’max_deformation ‘,后跟一个介于0到32之间的整数值(在同一字符串中)来实现,该值指定了最大变形。例如,如果物体的形状相对于模型中存储的形状可能会变形最多2个像素,那么除了上面描述的亚像素提取模式之外,还必须在SubPixel中传递值’max_deformation 2’,例如[‘least_squares’, ‘max_deformation 2’]。传递值“max_deformation 0”对应于不允许变形的搜索,即,行为与没有传递“max_deformation”时相同。请注意,较大的最大变形值通常会导致运行时间增加。此外,选择的变形值越高,发现错误模型实例的风险越高。这两个问题主要出现在搜索小物体或精细结构的物体时。这是因为这类高变形的物体失去了它们的特征形状,这对鲁棒搜索很重要。还要注意的是,对于较高的变形,部分遮挡物体的精度可能会降低,如果杂波存在于物体附近。因此,最大变形应选择尽可能小,只在必要时高。如果’max_deformation’和AngleExtent都设置为大于0的值,则可能找不到近似旋转对称的对象。在这种情况下,可能会出现无法解决的歧义,匹配将被拒绝为false。如果发生这种情况,尝试将’max_deformation’或AngleExtent设置为0,或者调整模型以减少对称性。当指定大于0的变形时,分数的计算取决于为亚像素提取所选择的值。在大多数情况下,如果选择’least_squares’, ‘least_squares_high’或’least_squares_very_high’(见上文)进行亚像素提取(与’none’或’interpolation’相比),匹配的分数会发生变化。此外,如果选择其中一个最小二乘调整,则随着最大变形的增加,分数可能会增加,因为这样可以为模型点找到更多对应的图像点。为了获得有意义的分值并避免错误匹配,我们建议总是将变形的允许与最小二乘调整结合起来。
  • NumLevels:金字塔数量
    如果NumLevels设置为0,则使用create_shape_model中指定的金字塔级别数。
    在某些情况下,使用(例如create_shape_model)自动确定的金字塔级别的数量可能过高。结果可能是一些最终得分较高的匹配在最高的金字塔级别上被拒绝,因此无法找到。与其将MinScore设置为一个非常低的值来查找所有匹配,不如使用get_shape_model_params查询NumLevels的值,然后在find_shape_model中使用一个稍低的值。这种方法在匹配的速度和鲁棒性方面通常更好。
    可选地,NumLevels可以包含第二个值,该值确定跟踪找到的匹配的最低金字塔级别。因此,NumLevels的值[4,2]意味着匹配从第四个金字塔级别开始,并跟踪匹配到第二个最低的金字塔级别(最低的金字塔级别用值1表示)。这种机制可以用来减少匹配的运行时间。然而,应该注意的是,通常在这种模式下提取的姿态参数的准确性低于正常模式,在正常模式下,匹配被跟踪到最低的金字塔水平。因此,如果需要较高的精度,SubPixel应该至少设置为’least_squares’。如果选择的最低金字塔级别太大,则可能无法实现所需的准确性,或者发现错误的模型实例,因为模型在较高的金字塔级别上不够具体,无法促进可靠地选择正确的模型实例。在这种情况下,要使用的最低金字塔级别必须设置为较小的值。
    在质量较差的输入图像中,例如,在散焦、变形或有噪声的图像中,通常在最低的金字塔级别上找不到形状模型的实例。造成这种现象的原因是由于图像质量差导致边缘信息缺失或变形。然而,在较高的金字塔层次上,边缘信息可能是足够的。但请记住,如果使用在较高金字塔级别上发现的实例,则上述对准确性和鲁棒性的限制。选择合适的金字塔级别,即可以找到至少一个形状模型实例的最低金字塔级别,取决于模型和输入图像。这个金字塔级别可能因图像而异。为了便于在质量较差的图像上进行匹配,可以在匹配过程中自动确定至少可以找到一个模型实例的最低金字塔层。要激活此机制,即使用所谓的“增加容忍模式”,最低金字塔级别必须在NumLevels中指定为负值。例如,如果NumLevels设置为[4,-2],则匹配从第四个金字塔级别开始,并跟踪匹配到第二个最低的金字塔级别。这意味着在金字塔级别2上搜索形状模型的实例。如果在此金字塔级别上找不到模型的实例,则确定最低的金字塔级别,在该金字塔级别上至少可以找到一个模型实例。然后将返回这个金字塔级别的实例。
    如果ModelID使用adapt_shape_model_high_noise进行调整,则默认情况下将使用估计的最低金字塔级别。但是,用户可以通过向NumLevels提供两个值并显式设置最低金字塔级别来覆盖估计的最低金字塔级别。
  • Greediness :贪婪值
    如果Greediness =0,则总是找到模型,但搜索耗时。如果Greediness =1,这可能导致在极少数情况下无法找到模型,但搜索速度最快。经验值推荐设置Greediness = 0.9。
  • 13
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值