QQ登录

只需一步,快速开始

5.2 halcon实现图像圆的拟合与提取

[ 复制链接 ]
当前帖子实现图片上直线,圆弧的提取。
对于圆弧,其参数会被计算出,并通参数显示整个圆。
思路是先将图像进行二值分割,随后提取图像中的边界区域图像。
对得到的图像再进行edges_sub_pix,提取亚像素精度轮廓。
此得到的轮廓为组合轮廓,即由多轮廓线段组成,可用segment_contours_xld进行分割。
分割后的每个轮廓线段可用算子get_contour_global_attrib_xld进行判断是合拟合成哪种类型几何图形。
不同几种图形的拟合是对应不同的算子。
下面是实现代码及注释:

5.2 halcon实现图像圆的拟合与提取

5.2 halcon实现图像圆的拟合与提取

  1. read_image (Image, 'double_circle')
  2. dev_close_window ()
  3. get_image_size (Image, Width, Height)
  4. dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
  5. * 对包含轮廓的区域进行分割
  6. *根据灰度值最小和最大及面积 进行快速二值化,
  7. *Image, Region分别为输入图,输出区域, 0为最小灰度值,
  8. *120为最大灰度值, 7表示被提取区域的最小面积。
  9. fast_threshold (Image, Region, 0, 120, 7)
  10. *通过形状学算法得到上面二值化区域 的边界。
  11. *Region, RegionBorder分别人输入输出区域, 'inner'表示得到内边界
  12. boundary (Region, RegionBorder, 'inner')
  13. *根据大小修改一个区域,RegionBorder为要被裁剪的区域,
  14. *RegionClipped为裁剪得到的区域,5, 5, 5, 5表示上下左右被剪的大小。
  15. clip_region_rel (RegionBorder, RegionClipped, 5, 5, 5, 5)
  16. *采用半径2.5圆元素进行膨胀处理区域RegionClipped
  17. dilation_circle (RegionClipped, RegionDilation, 2.5)
  18. *获取感兴趣图像
  19. reduce_domain (Image, RegionDilation, ImageReduced)
  20. * 在包含轮廓的图像区域里提取亚像素精度的轮廓。
  21. *ImageReduced, Edges分别为输入的图像和输出的亚像素轮廓边缘。
  22. * 'canny'为提取边缘用于的算法名称,
  23. *2为高斯平滑系数,值 越小越减少边缘细节,
  24. *20, 60为'canny'算法的低高阈值。
  25. edges_sub_pix (ImageReduced, Edges, 'canny', 2, 20, 60)
  26. *在图像处理过程中经常要对提取的轮廓 进行分割,将轮廓 分割为直线,圆弧
  27. *椭圆弧等,这个函数就是分割函数。Edges为要分割的输入轮廓。
  28. *ContoursSplit国输出结果, 'lines_circles'表示使用直线与圆分割,
  29. *5为轮廓平滑系数,可以抑制在拆线逼近过程中过短的线段,
  30. *4表示第一次用Ramer算法(直线段递进逼近轮廓)时的最大直线距离 ,
  31. *在逼近完成后,再用圆弧或椭圆弧对相邻分割线段进行拟合,
  32. *如果拟合圆弧到轮廓的距离小于逼近线段到轮廓的距离,就用圆弧替代逼近线段。
  33. *这过程一直迭代到所有线段拟合完毕。
  34. *3表示第二次逼近轮廓时的最大距离,因为第一次逼近过程中,递进逼近的直线段较少
  35. *主为是为加拿大 直径的圆弧能够高效的分割出来。在第二次逼近过程中,能够 被小
  36. *直径圆弧 逼近的轮廓 被找到,同时大直径圆弧 被重新定义
  37. segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 3)
  38. count_obj (ContoursSplit, Number)
  39. dev_display (Image)
  40. dev_set_draw ('margin')
  41. dev_set_color ('white')
  42. dev_update_window ('off')
  43. for I := 1 to Number by 1
  44.     select_obj (ContoursSplit, ObjectSelected, I)
  45.     *获得一段XLD全局特征,'cont_approx'为特征名称 , Attrib为特征名称对应值。
  46.     *等于-1表示此XLD适合拟合 成直线,0:表示适合拟合成椭圆,1:适合拟合成圆。
  47.     *通过这个变量可以判断后面适合用哪个算子拟合
  48.     get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
  49.     * Fit a circle to the line segment that are arcs of a circle
  50.     *根据圆弧线段,拟合一个圆。
  51.     if (Attrib > 0)
  52.         *拟合加圆,在halcon中fit打头为拟合算子,XLD打头为亚像素 类型。
  53.         *ObjectSelected为输入XLD轮廓, 'ahuber'为拟合用算法名称。
  54.         *-1表示采用最多 的轮廓 点数,必须大于3,-1表示全部点都参数拟合。
  55.         *2被认为是封闭轮廓 的首尾点中大距离 ,当前设置为2.
  56.         *0表示 轮廓开始 和结束点参与 拟合 的点个数,
  57.         *3表示 迭代次数,2表示离群值的剪切 因子,越小忽略的离群值越多。
  58.         * Row, Column, Radius, StartPhi, EndPhi, PointOrder为输出值,分别为圆心行列坐标,
  59.         *半径,圆弧开始结束角度及边界方向,是正向还是逆向
  60.         fit_circle_contour_xld (ObjectSelected, 'ahuber', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
  61.         *用上面拟合得到的圆弧参数生成圆。ContCircle为输出的亚像素圆。
  62.         *Row, Column, Radius, 0, rad(360), 'positive', 1.0分别为圆心行列坐标,半径 ,圆弧起始,结束 角度
  63.         *点顺序,这里是正向顺序 排列 ,最后一个参数 表示 轮廓 上相邻点的距离,这里距离是1像素。
  64.         gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1.0)
  65.         dev_display (ContCircle)
  66.     endif
  67. endfor
  68. dev_display(Image)
  69. dev_set_colored (12)
  70. dev_set_line_width (3)
  71. dev_display (ContoursSplit)
复制代码


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索