行远-自迩

导航

边缘提取四-总结

1. 创建轮廓

    一般获取轮廓的步骤是提取边缘,边缘是一张图片中亮暗区域的过渡位置,它可以由图片梯度计算得出。图片梯度也可以表示为边缘幅度和边缘方向。通过选择那些有高的边缘幅值的像素点或者有特定边缘方向的像素点,区域内的轮廓可以提取出来。可以通过多种的方式以多种精度提取轮廓。

  • 像素精度提取边缘的方法 :使用 边缘滤波器                                                                                               

        使用边缘滤波器后,将产生一个或两个边缘图像。通过使用阈值算子从得到的边缘图像中选择具有给定的最小边缘幅度的像素来提取边缘区域。为了获得具有一个像素厚度的边缘,必须通过使用算子(例如:skeleton)来减薄所获得的区域。

        常见的像素精确边缘滤波器是运算速度较快的Sobel_amp和速度较慢但已经包括滞后阈值和细化的edges_image,其结果比Sobel_amp更精确。edges_image及其对应的彩色图像(edges_color)也可以在参数Filter设置为“Sobel_fast”的情况下应用。这样,算子的速度也很快,但仅推荐用于噪声或纹理小且边缘锐利的图像。

       除了边缘之外,还可以提取由薄结构构建的线。这些线有着不均匀的一定的宽度,一般采用滤波算子bandpass_image,结合了阈值和细化。

       经过滤波、阈值和细化后得到的结果一般都会转换为轮廓。将薄边缘区域转换为轮廓的算子有gen_contours_skeleton_xld。

  • 亚像素精度提取边缘的方法

       采用亚像素边缘提取算子可以立刻得到轮廓。例如edges_sub_pix、edges_color_sub_pix、zero_crossing_sub_pix。

检测图中的线以及其宽度lines_gauss, lines_facet , lines_color, edges_sub_pix.

       亚像素精度方法通常比像素精度方法慢。为了加快亚像素精度的边缘提取,建议仅将其应用于ROI 。为了获得合适的ROI,可以使用阈值算子(例如,使用fast _ threshold )来确定轮廓所包围的区域。然后,返回的区域通过算子boundary缩小到其边界,并且可以用算子clip _ region _ rel进行裁剪。利用形态学算子,例如expansion _ circle,对返回区域进行少量扩展,通过reduce _ domain将图像缩小到返回区域,并将缩小后的图像用作ROI。ROI作为亚像素精确边缘提取的搜索空间。

       另一种快速提取轮廓的方法是使用算子threshold_sub_pix来进行亚像素精度阈值化,可实时应用于整个图像。它与用于区域处理的那些阈值算子类似,但它不产生闭合区域,而是产生区域的边界或部分边界的亚像素精度轮廓。因此,与为区域处理引入的阈值算子相反,threshold_sub_pix返回的轮廓不需要闭合,可以获得相同区域的多个轮廓,并且等高线之间是可以连接的。和用于区域处理的阈值处理算子一样,您可以使用灰度直方图来选择合适的阈值,也可以通过使用算子gray_histo, histo_to_thresh和intensity的到的灰度值来选择合适的阈值。

2. 选择轮廓

       创建轮廓的过程产生了一系列的轮廓,我们需要从这些轮廓中选择需要的轮廓用于下一步的测量。

       根据特征选择轮廓: 算子select_shape_xld可以用于选择具有特定凸性、圆性或面积等30多种形状特征的闭合轮廓,算子select _ contures _ xld可以根据轮廓的长度、曲率或方向选择闭合或非闭合的轮廓。select _ xld _ point可以与鼠标功能结合使用,以交互方式选择轮廓。

       通过轮廓合并可以将接近的轮廓合并成一个选择轮廓:算子union_collinear_contours_xld可以用于合并大致位于同一直线上的轮廓;算子union_cocircular_contours_xld在同一个圆上;相邻union_adjacent_contours_xld;相切union_cotangential_contours_xld;

       集合论算子选择轮廓:算子intersection_closed_contours_xld 和 intersection_closed_polygons_xld用于计算闭合轮廓或多边形相交部分;算子 difference_closed_contours_xld 和difference_closed_polygons_xld 用于计算闭合轮廓或多边形不相交的部分;算子symm_difference_closed_contours_xld 和 symm_difference_closed_polygons_xld;算子union2_closed_contours_xld 和union2_closed_polygons_xld。

       简化轮廓:可以通过直接将轮廓转换为类似的形状基元来简化轮廓,使用算子shape _ trans _ xld可以将轮廓转换为最小的封闭圆,具有相同力矩的椭圆,凸包,最小的封闭矩形(平行于坐标轴或具有任意方向)

 

3.分割轮廓

        所获得的轮廓通常由或多或少的复杂的形状组成。如果轮廓由已知的线段组成,例如直线或圆弧等线段。将轮廓分割成这些较不复杂的线段有助于更容易地分析,因为这些线段组成的形状基元更便于测量,例如圆的直径或线的长度。形状基元包括线、圆、椭圆和矩形。

        算子segment_contours_xld可以用于轮廓分割。根据选择的参数,可将轮廓分割成直线段,直线和圆形段或直线和椭圆形段。分割得到的轮廓是直线段、圆(圆弧)或者椭圆弧可以通过分割后轮廓的全局属性'cont_approx’参数的值来确定(参考get_contour_global_attrib_xld)。如果'cont_approx'=-1,这一部分轮廓最适合被拟合为直线段。如果'cont_approx'=0,这一部分轮廓最适合被拟合为椭圆弧。如果'cont_approx'=1,这一部分轮廓最适合被拟合为圆弧。 

        如果只需要直线段,则也可以改为使用算子gen _ polygens _ xld。使用算子split_contours_xld可以获取多边形的每一个边。

  • 通过近似轮廓到已知形状提取特征

       在选择和分割轮廓之后的共同步骤是将形状基元拟合到轮廓或轮廓段以获得它们特定的形状参数。可以选择的形状基元有线段,圆形,椭圆形和矩形。特定的形状参数有线段的端点、圆的半径和中心。

       对于直线段( ' cont _ joup ' = - 1 ),fit _ line _ contour _ xld获取每个直线段的参数,例如两个端点的坐标。

       对于圆弧( ' cont _ joup ' = 1 ),fit_circle_contour_xld和

       对于椭圆弧( ' cont _ joup ' = 0 ),fit_ellipse_contour_xld用于计算中心点位置、半径以及由轮廓覆盖的圆或椭圆部分段(由起点和终点的角度确定)。

      用算子union_adjacent_contours_xld可以合并纯(未分段)轮廓和线性轮廓来组成矩形。fit_rectangle2_contour_xld用于获取矩形的参数。

  • 提取未知轮廓的特征

area _ center _ xld :由轮廓或多边形包围的区域的面积和重心,以及沿边界的点的顺序。

diameter _ xld :轮廓上距离最远的两个极值点的坐标,还有他们之间的距离。

elliptic_axis_xld::与轮廓具有相同方向和纵横比的椭圆的两个半径和方向。

length _ xld :轮廓或多边形的长度。

orientation_xld :轮廓的方向。

smallest_circle_xld :最小封闭圆的中心位置和半径。

smallest_rectangle1_xld:平行于坐标轴的最小封闭矩形的中心点坐标 

smallest_rectangle2_xld: 任意方向的最小封闭矩形的中心位置、方向和两个半径

       某些算子仅在没有自相交的轮廓上工作。自相交并不总是显而易见的,因为它们可能由于算子的内部计算而发生。可以算子test _ self_intersection_xld检查轮廓是否与自身相交。如果自相交造成了问题,还可以使用相应的基于点的算子。可用的算子有area_center_points_xld, moments_points_xld, orientation_points_xld,    elliptic_axis_points_xld,   eccentricity_points_xld,   和 moments_any_points_xld.

posted on 2022-04-11 17:07  行远-自迩  阅读(633)  评论(0编辑  收藏  举报