• Halcon边缘提取Edge Extraction (像素级)解析


    寻找边缘的传统方法,比如图像中的暗/亮过渡部分,是应用边缘滤波器。这些过滤器的作用是寻找明暗交界处的像素。用数学术语来说,这些滤波器决定了图像的梯度。这个图像梯度通常是边缘振幅与/或边缘方向,通过选择所有具有高边缘振幅的像素,可以提取出区域之间的轮廓线。HALCON提供了所有标准的边缘过滤器,如 Sobel, Roberts, Robinson, Frei filters。除此以外,还提供滞后阈值和非最大抑制等后处理操作。此外,还提供了精确确定边缘振幅和边缘方向的最先进的滤波器。请注意,除了这种经典的方法外,HALCON还提供了先进的运算器,用于亚像素精确的边缘和线条提取(下次讲解),以及连续的后处理和特征提取.

    ​ 图片为应用边缘滤波器的结果,a.边缘增幅,b.边缘方向,c.图像边缘

    基本概念

    使用边缘滤波器通常包括三个基本步骤。

    获取图像

    首先,获取一个图像。

    过滤图像

    在输入图像上,应用一个边缘滤波器。这个操作的结果是一或两个图像。其基本结果是边缘振幅,它通常被存储为一个字节图像,每个像素的灰度值代表当前的边缘振幅。也可以选择返回边缘的方向。这些值被存储在一个方向图像中,其值为0...179,代表除以2的角度。

    提取边缘

    应用边缘滤波器的结果是一个包含边缘振幅的图像。从这个图像中,通过选择具有一定幅度的像素来提取边缘。通过使用阈值运算器选择具有给定最小边缘振幅的像素来提取边缘。所得到的边缘通常比一个像素更宽,因此必须进行减薄处理。对于这个步骤,有各种方法可供选择。

    第一个例子

    下面的程序展示了一个关于边缘滤波器基本概念的例子。作为一个边缘滤波器,sobel_amp以 "thin_sum_abs "模式应用,以获得薄的边缘和一个3x3的滤波器掩码。然后,操作符threshold被用来提取所有边缘振幅大于20的像素。得到的区域包含一些边缘宽于一个像素的区域。因此,运算符skeleton被应用来完全减薄边缘。

    read_image (Image, 'fuse')
    sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3)
    threshold (EdgeAmplitude, Region, 20, 255)
    skeleton (Region, Skeleton)
    

    扩展概念

    使用感兴趣区域

    边缘提取可以通过使用感兴趣的区域来加快速度。边缘过滤的区域越多边缘过滤的区域就越受限制,提取的速度就越快、越稳健。

    滤波器图像

    HALCON提供了大量的边缘滤波器。最受欢迎的滤波器之一是Sobel滤波器。这是最好的的老式滤波器。它结合了速度和质量。相应的运算符为sobel_ampsobel_dir。相比之下,edges_image提供了最先进的边缘过滤器。这个运算符实际上不仅仅是一个过滤器。它包括使用非最大压制和滞后阈值对边缘进行减薄,以达到选择重要的边缘点。它还能非常准确地返回边缘方向和边缘振幅,这是Sobel滤波器所不具备的。如果更高的质量比更长的执行时间更重要的话,建议使用这个运算器。如果图像没有噪音或模糊,你甚至可以将准确性和速度结合起来,通过在edges_image里面使用模式'sobel_fast'来寻找多通道图像中的边缘。例如,彩色图像,相应的运算符是edges_color.

    提取边缘

    从边缘振幅图像中提取边缘的最简单方法是应用threshold来选择具有数值高的边缘振幅。这一步的结果是一个包含所有边缘点的区域。使用skeleton,这些边缘可以被减薄到一个像素的宽度。作为阈值的一个高级版本,hysteresis_threshold可以用来消除不重要的边缘。另一个高级选项是在skeleton前调用运算符nonmax_suppression_dir,这在复杂情况下可能会产生更精确的边缘。请注意,为了使用这个运算符必须先计算边缘方向图像。相比之下,高级过滤器edges_image已经包括非最大抑制和滞后的阈值。因此,在这种情况下,一个简单的threshold就足以提取一个像素宽的边缘。如果只需要一个区域的边缘点,可以使用操作符inspect_shape_model。在这里,所有的步骤包括边缘过滤、非最大抑制和滞后阈值都在一个步骤中进行,效率很高。

    处理边缘

    如果你想提取边缘段的坐标,split_skeleton_lines是正确的选择。这个运算符必须为每个连接的组件(connection的结果)调用,并返回线段的所有控制点。作为一种替代方法,可以使用Hough变换来获得线段。这里,运算符hough_lines_dirhough_lines是可用的。你也可以通过将边缘区域转换成XLD等值线使用,例如,运算符gen_contours_skeleton_xld。这种方法的优点是为XLD轮廓处理提供了一组扩展的操作符,例如,用于轮廓分割、特征提取或近似处理。

    你可以使用background_seg轻松地提取边缘所包围的区域。如果区域因为边缘的间隙而合并,可以在提取区域之前提前使用操作符close_edgesclose_edges_length来关闭间隙.在区域被提取之前,可以提前使用close_edgesclose_edges_length运算符来关闭间隙。作为一种替代方法,像Opening_circle这样的形态学运算符可以用于
    输出区域.

    显示结果

    最后,显示图像、边缘(区域)和线段。

    下节进行相关案例讲解

  • 相关阅读:
    springboot(十二)-分布式锁(redis)
    springboot(十一)-为什么要用springboot
    HashMap和HashTable区别
    ArrayList和LinkedList区别
    springcloud(三)-Eureka
    springboot(十)-监控应用
    springboot(九)-log配置
    springcloud(二)-最简单的实战
    rest版的webservice
    sqlite与android交互 (封装)
  • 原文地址:https://www.cnblogs.com/MorganMa/p/15386290.html
Copyright © 2020-2023  润新知