目录
2、通过阈值分割,然后获取图像的边界,使用clip_region_rel算子对其进行裁剪,再以圆形膨胀分割出圆弧边界
1、fast_threshold(Image : Region : MinGray, MaxGray, MinSize : )
2、clip_region_rel(Region : RegionClipped : Top, Bottom, Left, Right : )
3、edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
4、segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )
5、get_contour_global_attrib_xld(Contour : : Name : Attrib)
一、程序源码分析
图像中的边缘被分割成线和圆。对于圆的边, 估算圆的参数并显示结果圆
1、图像初始化
read_image (Image, 'double_circle')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
2、通过阈值分割,然后获取图像的边界,使用clip_region_rel算子对其进行裁剪,再以圆形膨胀分割出圆弧边界
fast_threshold (Image, Region, 0, 120, 7)
boundary (Region, RegionBorder, 'inner')
clip_region_rel (RegionBorder, RegionClipped, 5, 5, 5, 5)
dilation_circle (RegionClipped, RegionDilation, 2.5)
reduce_domain (Image, RegionDilation, ImageReduced)
3、在包含边缘的图像子域中,提取亚像素精确边缘
edges_sub_pix (ImageReduced, Edges, 'canny', 2, 20, 60)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 3)
count_obj (ContoursSplit, Number)
-
ContoursSplit是个元组,其中存放了分割出来的圆弧与线段
4、根据每一段线条,对于圆的边, 估算圆的参数并显示结果圆
dev_display (Image)
dev_set_draw ('margin')
dev_set_color ('white')
dev_update_window ('off')for I := 1 to Number by 1
- 从ContoursSplit中循环读取轮廓,通过query_contour_global_attribs_xld算子得到该轮廓设置的全局参数为'cont_approx'
- 然后通过get_contour_global_attrib_xld算子取参数的值,如果'cont_approx' = 1,可以用圆弧来近似等高线;如果'cont_approx'=-1,可以用线段来近似等高线
select_obj (ContoursSplit, ObjectSelected, I)
*先找到为该段轮廓设置了哪些全局属性,再对其取值观察
query_contour_global_attribs_xld(ObjectSelected, Attribs)
get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
-
检测到该线段为弧线段,用圆近似XLD轮廓并生成圆