1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| threshold (Image, Dark, 0, 128) if (visualization) dev_display (Image) dev_set_color ('green') dev_set_draw ('fill') dev_display (Dark) stop () endif * * 提取连通块并通过圆度和面积进行筛选 connection (Dark, DarkRegions) select_shape (DarkRegions, Circles, ['circularity', 'area'], 'and', [0.85, 50], [1.0, 99999]) if (visualization) dev_display (Image) dev_set_colored (12) dev_display (Circles) stop () endif * dilation_circle (Circles, ROIOuter, 8.5) erosion_circle (Circles, ROIInner, 8.5) * 膨胀、腐蚀后相减,相当于从圆环中去掉中心,留下边缘区域 difference (ROIOuter, ROIInner, ROI) union1 (ROI, ROIEdges) if (visualization) dev_display (Image) dev_set_draw ('margin') dev_set_color ('green') dev_display (ROIEdges) stop () endif * * 边缘检测 reduce_domain (Image, ROIEdges, RimReduced) edges_sub_pix (RimReduced, Edges, 'canny', 2, 20, 40) * * 筛选大圆的边缘 select_contours_xld (Edges, EdgesLarge, 'contour_length', 200, 300, 0, 0) count_obj (EdgesLarge, NumberLarge) * 对轮廓进行椭圆拟合,得到椭圆的参数 fit_ellipse_contour_xld (EdgesLarge, 'ftukey', -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder) * 使用拟合参数生成椭圆轮廓 gen_ellipse_contour_xld (EllipseContoursLarge, Row, Column, gen_tuple_const(NumberLarge,0), Ra, Rb, gen_tuple_const(NumberLarge,0), gen_tuple_const(NumberLarge,rad(360)), gen_tuple_const(NumberLarge,'positive'), 1.5) * * 筛选小圆的边缘,并生成对应轮廓 select_contours_xld (Edges, EdgesSmall, 'contour_length', 100, 200, 0, 0) count_obj (EdgesSmall, NumberSmall) fit_ellipse_contour_xld (EdgesSmall, 'ftukey', -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder) gen_ellipse_contour_xld (EllipseContoursSmall, Row, Column, gen_tuple_const(NumberSmall,0), Ra, Rb, gen_tuple_const(NumberSmall,0), gen_tuple_const(NumberSmall,rad(360)), gen_tuple_const(NumberSmall,'positive'), 1.5) * if (visualization) dev_display (Image) dev_set_color ('green') dev_display (EllipseContoursLarge) dev_set_color ('blue') dev_display (EllipseContoursSmall) stop () endif return ()
|