当前帖子实现图片上直线,圆弧的提取。
对于圆弧,其参数会被计算出,并通参数显示整个圆。
思路是先将图像进行二值分割,随后提取图像中的边界区域图像。
对得到的图像再进行edges_sub_pix,提取亚像素精度轮廓。
此得到的轮廓为组合轮廓,即由多轮廓线段组成,可用segment_contours_xld进行分割。
分割后的每个轮廓线段可用算子get_contour_global_attrib_xld进行判断是合拟合成哪种类型几何图形。
不同几种图形的拟合是对应不同的算子。
下面是实现代码及注释:
5.2 halcon实现图像圆的拟合与提取
- read_image (Image, 'double_circle')
- dev_close_window ()
- get_image_size (Image, Width, Height)
- dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
- * 对包含轮廓的区域进行分割
- *根据灰度值最小和最大及面积 进行快速二值化,
- *Image, Region分别为输入图,输出区域, 0为最小灰度值,
- *120为最大灰度值, 7表示被提取区域的最小面积。
- fast_threshold (Image, Region, 0, 120, 7)
- *通过形状学算法得到上面二值化区域 的边界。
- *Region, RegionBorder分别人输入输出区域, 'inner'表示得到内边界
- boundary (Region, RegionBorder, 'inner')
- *根据大小修改一个区域,RegionBorder为要被裁剪的区域,
- *RegionClipped为裁剪得到的区域,5, 5, 5, 5表示上下左右被剪的大小。
- clip_region_rel (RegionBorder, RegionClipped, 5, 5, 5, 5)
- *采用半径2.5圆元素进行膨胀处理区域RegionClipped
- dilation_circle (RegionClipped, RegionDilation, 2.5)
- *获取感兴趣图像
- reduce_domain (Image, RegionDilation, ImageReduced)
- * 在包含轮廓的图像区域里提取亚像素精度的轮廓。
- *ImageReduced, Edges分别为输入的图像和输出的亚像素轮廓边缘。
- * 'canny'为提取边缘用于的算法名称,
- *2为高斯平滑系数,值 越小越减少边缘细节,
- *20, 60为'canny'算法的低高阈值。
- edges_sub_pix (ImageReduced, Edges, 'canny', 2, 20, 60)
- *在图像处理过程中经常要对提取的轮廓 进行分割,将轮廓 分割为直线,圆弧
- *椭圆弧等,这个函数就是分割函数。Edges为要分割的输入轮廓。
- *ContoursSplit国输出结果, 'lines_circles'表示使用直线与圆分割,
- *5为轮廓平滑系数,可以抑制在拆线逼近过程中过短的线段,
- *4表示第一次用Ramer算法(直线段递进逼近轮廓)时的最大直线距离 ,
- *在逼近完成后,再用圆弧或椭圆弧对相邻分割线段进行拟合,
- *如果拟合圆弧到轮廓的距离小于逼近线段到轮廓的距离,就用圆弧替代逼近线段。
- *这过程一直迭代到所有线段拟合完毕。
- *3表示第二次逼近轮廓时的最大距离,因为第一次逼近过程中,递进逼近的直线段较少
- *主为是为加拿大 直径的圆弧能够高效的分割出来。在第二次逼近过程中,能够 被小
- *直径圆弧 逼近的轮廓 被找到,同时大直径圆弧 被重新定义
- segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 3)
- count_obj (ContoursSplit, Number)
- dev_display (Image)
- dev_set_draw ('margin')
- dev_set_color ('white')
- dev_update_window ('off')
- for I := 1 to Number by 1
- select_obj (ContoursSplit, ObjectSelected, I)
- *获得一段XLD全局特征,'cont_approx'为特征名称 , Attrib为特征名称对应值。
- *等于-1表示此XLD适合拟合 成直线,0:表示适合拟合成椭圆,1:适合拟合成圆。
- *通过这个变量可以判断后面适合用哪个算子拟合
- get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
- * Fit a circle to the line segment that are arcs of a circle
- *根据圆弧线段,拟合一个圆。
- if (Attrib > 0)
- *拟合加圆,在halcon中fit打头为拟合算子,XLD打头为亚像素 类型。
- *ObjectSelected为输入XLD轮廓, 'ahuber'为拟合用算法名称。
- *-1表示采用最多 的轮廓 点数,必须大于3,-1表示全部点都参数拟合。
- *2被认为是封闭轮廓 的首尾点中大距离 ,当前设置为2.
- *0表示 轮廓开始 和结束点参与 拟合 的点个数,
- *3表示 迭代次数,2表示离群值的剪切 因子,越小忽略的离群值越多。
- * Row, Column, Radius, StartPhi, EndPhi, PointOrder为输出值,分别为圆心行列坐标,
- *半径,圆弧开始结束角度及边界方向,是正向还是逆向
- fit_circle_contour_xld (ObjectSelected, 'ahuber', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
- *用上面拟合得到的圆弧参数生成圆。ContCircle为输出的亚像素圆。
- *Row, Column, Radius, 0, rad(360), 'positive', 1.0分别为圆心行列坐标,半径 ,圆弧起始,结束 角度
- *点顺序,这里是正向顺序 排列 ,最后一个参数 表示 轮廓 上相邻点的距离,这里距离是1像素。
- gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1.0)
- dev_display (ContCircle)
- endif
- endfor
- dev_display(Image)
- dev_set_colored (12)
- dev_set_line_width (3)
- dev_display (ContoursSplit)
复制代码
|