前言:
今天我们对“sort_region算子”大概比较珍视,兄弟们都需要了解一些“sort_region算子”的相关内容。那么小编同时在网摘上汇集了一些有关“sort_region算子””的相关资讯,希望同学们能喜欢,兄弟们快快来了解一下吧!图像预处理
动态阈值 mean_image 局部动态阈值 处理 普通二值化难以区分的场景
但是这种 水表盘却不能,使用 均值滤波和动态阈值
取不到图像
使用 VAR阈值
*与动态阈值类型,通过掩网
**参数 8, 8 掩膜宽度和高度, 0.2 标准差表, 4 绝对阈值, 'dark'亮暗
var_threshold (Image1, Region, 10, 10, 0.2, 6, 'dark')
接下来取轮廓
如果使用 edges_sub_pix 算子,由于上面的图像非常的细碎
所以用这种
*将刻度区域的region变成contour
** 转换区域到XLD轮廓
gen_contour_region_xld (SelectedRegions, Contours, 'border')
这个极坐标变换的 起始和终点角度
这个极坐标变换的 起始和终点角度
红色是水平线,红色的点是极坐标变换的圆心坐标
这个绿色的夹角,就是极坐标变换的起始和终点角度。
如果这两个角度不到位,是不能将仪表盘变换完整的
count_seconds (S1) *读取图像转换颜色通道,然后阈值化选取最大联通区域 read_image (Image1, '15.bmp') get_image_size(Image1, Width, Height) rgb3_to_gray (Image1, Image1, Image1, Image1) * mean_image (Image1, ImageMean, 10, 10) * dyn_threshold (ImageMean, ImageMean, RegionDynThresh, 100, 'light') *与动态阈值类型,通过掩网 **参数 8, 8 掩膜宽度和高度, 0.2 标准差表, 4 绝对阈值, 'dark'亮暗 var_threshold (Image1, Region4, 10, 10, 0.2, 6, 'dark') *var_threshold (Image1, Region4, 8, 8, 0.2, 4, 'dark') connection (Region4, ConnectedRegions) select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70) reduce_domain (Image1, SelectedRegions, ImageReduced) *edges_sub_pix (ImageReduced, Edges, 'canny', 0.5, 20, 40) *将刻度区域的region变成contour ** 转换区域到XLD轮廓 gen_contour_region_xld (SelectedRegions, Contours, 'border') *采用这个方式进行分割 'lines_ellipses' segment_contours_xld (Contours, ContoursSplit, 'lines_ellipses', 3, 3.5, 2) *选取contour中的面积大部分,即上面的圆弧 select_shape_xld (ContoursSplit, SelectedCircleXLD, 'area', 'and', 60000, 9999999) ** 通过拟合的方式找到 圆心 半径,内外圆, 方便后面的极坐标变换 *圆弧拟合出一个圆 fit_circle_contour_xld (SelectedCircleXLD, 'algebraic', \ -1, 0, 0, 3, 2, Row, Column, Radius, \ StartPhi, EndPhi, PointOrder) Row:= mean(Row) Column:=mean(Column) Radius:=mean(Radius) *各种取平均值后,画出圆心点便于观察 gen_circle (Circle, Row, Column, 10) **创建圆弧XLD轮廓 gen_circle_contour_xld(ContCircle,Row, Column, Radius,\ 0, 6.28318, 'positive', 1) dev_set_draw ('fill') aa:=rad(360) bb:=rad(-120) *极坐标变化后继续阈值与选取最大区域,即刻度* polar_trans_image_ext (Image1,ImageTest, Row, Column,rad(240) ,rad(-120) , Radius+300, Radius-90, Radius*3.14, 500, 'bilinear') polar_trans_image_ext (Image1,ImageTest, Row, \ Column,rad(240) ,rad(-60) , \ Radius+300, Radius-90, Radius*3.14,\ 500, 'bilinear') var_threshold (ImageTest, Region5, 10, 10, 0.2, 2, 'dark') connection (Region5, ConnectedRegions4) select_shape_std (ConnectedRegions4, SelectedRegions1, 'max_area', 70) *转换区域到XLD轮廓 gen_contour_region_xld (SelectedRegions1, ContoursPolarAfter, 'center') *@继续分割contour然后选取刻度中上面的直线 segment_contours_xld (ContoursPolarAfter, ContoursSplitPolarAfter,\ 'lines_circles', 5, 5, 4) ** 将刻度盘的基准线提取出来 select_contours_xld (ContoursSplitPolarAfter, ContoursSplitPolarAfter1,\ 'contour_length', 400, 9999, -0.5, 0.5) *将上面的直线膨胀,用difference将刻度中的小直线保留 **转换XLD轮廓到区域 gen_region_contour_xld (ContoursSplitPolarAfter1, RegionScalePolarAfter, 'margin') dilation_circle (RegionScalePolarAfter, RegionDilationScalePolar,5) difference (SelectedRegions1, RegionDilationScalePolar, RegionDifferencePolar) connection (RegionDifferencePolar, ConnectedScalePolar4) *排序全部刻度 sort_region (ConnectedScalePolar4, SortedRegionsScalePolar,\ 'character', 'true', 'row') *最小外接矩形 smallest_rectangle1 (RegionDilationScalePolar, Row12, Column12, Row21, Column21) dev_set_draw('margin') dev_set_color('green') gen_rectangle1(rectang1,Row12, Column12, Row21, Column21) get_image_size (ImageTest, Width1, Height1) *** 往刻度盘下放一点点,画矩形,这个仪表盘的指针就在这个位置 *得到极坐标变换后的图片的长宽 *继续生成图像下部的小矩形(此处矩形的宽度是上面选的,需注意),然后可以 dev_set_line_width(3) gen_rectangle1 (Rectangle3, Height1-10, min(Column12), Height1, max(Column21)) gen_cross_contour_xld(Cross1, Height1-10, min(Column12), 6, 0.785398) gen_cross_contour_xld(Cross1,Height1, max(Column21), 6, 0.785398) *感兴趣区域提取 roi reduce_domain (ImageTest, Rectangle3, ImageReduced_rec1) *均值滤波 mean_image (ImageReduced_rec1, ImageMean1, 5, 1) *动态二值化 dyn_threshold (ImageReduced_rec1, ImageMean1, RegionDynThresh1, 5, 'dark') connection (RegionDynThresh1, ConnectedRegions7) *上面选择出来指针位置,下面用ra特征提取指针,需要保证图像大小,以及指针在里面所占像素大小 **参数 ra 等效椭圆长轴半径长度 select_shape (ConnectedRegions7, Region2_rec1, 'ra', 'and', 4 , 8) smallest_rectangle2 (Region2_rec1, Row1_rec1, Column1_rec1, Phi1_rec1, Length11_rec1, Length21_rec1) *显示坐标的位置 dev_set_color('blue') gen_cross_contour_xld(Cross, Row1_rec1, Column1_rec1, 16, Phi1_rec1) dev_set_color('yellow') *与上面矩形 角度 位置都相同,仅仅长度放大40倍 gen_rectangle2 (Rectangle_line_rec1, Row1_rec1, \ Column1_rec1, Phi1_rec1, Length11_rec1*40, Length21_rec1) count_obj (SortedRegionsScalePolar, ScaleNumbersPolar) * * re-transform defect regions for visualization* polar_trans_image_ext (Image1,ImageTest, Row, Column,rad(240) ,rad(-120) , Radius+300, Radius-90, Radius*3.14, 500, 'bilinear') *仿射回去进行显示 polar_trans_region_inv (Region2_rec1, XYTransRegion, \ Row, Column,rad(240) ,rad(-120) ,\ Radius+300, Radius-90, Radius*3.14,\ 500, Width, Height, 'nearest_neighbor') polar_trans_region_inv (Rectangle_line_rec1, XYTrans_line_Region, \ Row, Column,rad(240) ,rad(-120) , \ Radius+300, Radius-90, Radius*3.14,\ 500, Width, Height, 'nearest_neighbor') *显示指针的位置 dev_clear_window() dev_set_color('red') dev_display(Image1) dev_display(XYTransRegion) dev_display(XYTrans_line_Region) stop() dev_clear_window() dev_set_color('red') dev_display(ImageTest) dev_display(ImageReduced_rec1) dev_display(Region2_rec1) dev_clear_window() dev_set_color('red') dev_display(ImageTest) dev_set_color('green') dev_display(SortedRegionsScalePolar) count_obj(SortedRegionsScalePolar,NumberScalePolar) *计数可知道 总数为201 201/2 为101 *这个是刻度的位置信息 area_center (SortedRegionsScalePolar, SortedRegionsScalePolarArea, \ SortedRegionsScalePolarRow, SortedRegionsScalePolarColumn) count_seconds (S2) *计算一下时间 tt := S2-S1 *开始计算指针所在位置。 判断指针在左半边还是右半边。Column1_rec1为1742 所以在右半边 *中间值 1448.81 middle:=SortedRegionsScalePolarColumn[101] if (max(Column1_rec1) < SortedRegionsScalePolarColumn[101]) for i := 0 to (ScaleNumbersPolar+1)/2 by 1 if(max(Column1_rec1) < SortedRegionsScalePolarColumn[i]) sigma:=(SortedRegionsScalePolarColumn[i]-max(Column1_rec1))/(SortedRegionsScalePolarColumn[i]-SortedRegionsScalePolarColumn[i-1]) t:= 100-i+sigma break endif endfor stop() * 找指针的位置 。 elseif(max(Column1_rec1) > SortedRegionsScalePolarColumn[101]) *开始计算 从100开始计算到201 for i := 99 to ScaleNumbersPolar by 1 *当这个数据小于SortedRegionsScalePolarColumn[i],停止,计算结果并跳出循环 if(max(Column1_rec1) < SortedRegionsScalePolarColumn[i]) stop() *再计算下 指针与(向上一级刻度)的距离 占整个小刻度的 比值。 sigma:=(SortedRegionsScalePolarColumn[i]-max(Column1_rec1))/(SortedRegionsScalePolarColumn[i]-SortedRegionsScalePolarColumn[i-1]) *这个t值就是指针的读数 t:= i-100-sigma break endif endfor endif stop() dev_clear_window() dev_set_color('red') dev_display(Image1) dev_display(XYTransRegion) dev_display(XYTrans_line_Region) write_string (3600, '指针在 '+i+ ' 与'+i+1+'之间,读数为'+t+'运行时间' +tt+ ' V2') stop() dev_clear_window ()
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #sort_region算子