这是网上写得比较好的一篇贴子,勇哥转载一下以方便大家。
讲的都是基础的region操作。
1、区域的运算
*生成两个矩形区域 gen_rectangle1 (Rectangle1, 123, 196, 186, 356) gen_rectangle1 (Rectangle2, 123+20, 196+20, 186-20, 356-20)
*两个矩形区域做差 difference (Rectangle1, Rectangle2, RegionDifference)
*区域的合并,union1是对集合的合并,union2是对区域的加 union2 (RegionDifference, Rectangle2, RegionUnion)
*两个区域放到一个集合concat_obj (Rectangle1, Rectangle2, ObjectsConcat)
*区域的选择:参数3表示要选择的第几个区域 select_obj (ObjectsConcat, ObjectSelected, 2)
*区域的填充 fill_up (RegionDifference, RegionFillUp)
*区域骨架的求取 skeleton (RegionFillUp1, Skeleton) *指定面积范围的区域的填充:参数4和参数5表示区域面积范围。不在面积范围的不填充fill_up_shape (RegionDifference, RegionFillUp1, 'area', 1, 10000)
2、区域的特征分析
area_center (Region, Area, Row4, Column4)
*凸集转换,'convex'生成凸集,也可以选择生成外接圆 shape_trans (Region, RegionTrans, 'convex') *获取区域的凸性值,值保存在Convexity中。表示的是该区域面积和凸集的比值,范围0-1
*获取区域的圆度circularity (Region, Circularity)
*获取区域外接圆 smallest_circle (Region, Row3, Column3, Radius) gen_circle (Circle, Row3, Column3, Radius) *获取区域的特征,比如面积:'area'region_features (Circle, 'area', Value)
3、案例:遥控器上的字符特征提取
read_image (Image, '素材.jpg')*灰度转换rgb1_to_gray (Image, GrayImage)
*静态阈值分割threshold (GrayImage, Region, 150, 255)
*开操作-腐蚀操作opening_circle (Region, RegionOpening, 3.5)
*连通域标记,将几个区域分隔开connection (RegionOpening, ConnectedRegions)
*方法1:遥控器区域面积大,可以用选择面积大的方法。将遥控的区域单独选择出来。 *参数3:最大面积,参数4:百分比。 select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70) *方法2:根据凸性、或者遥控的外接矩形凸性来选择,
*填充:将字符串的填充起来fill_up (SelectedRegions, RegionFillUp)
*裁剪,将遥控器的图片区域从原图中裁剪下来reduce_domain (GrayImage, RegionFillUp, ImageReduced)
*全局阈值:前两个数值:选择分割的图像灰度范围,最后一个是要选择的分割的面积(可以将一些点去掉)fast_threshold (ImageReduced, Region1, 0, 100, 20)
*求取区域的方向 orientation_region (Region1, Phi) *求取区域的中心 area_center (Region1, Area, Row, Column) *求取区域的角度,参数6:新的旋转之后的角度 vector_angle_to_rigid (Row, Column, Phi, Row, Column, -3.1415*0.5, HomMat2D) *对区域旋转操作:转到水平 affine_trans_region (Region1, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*膨胀操作-闭运算: *同一个字符相邻的区域先浓缩成一团:将左右连接在一起 closing_circle (RegionAffineTrans, RegionClosing, 3.5) *然后再竖直方向膨胀,将竖直方向的都连接起来。参数3是宽度表示水平方向的,则值要设置的小dilation_rectangle1 (RegionClosing, RegionDilation, 1, 11)
*连通域操作:connection (RegionDilation, ConnectedRegions1)
*选择指定的区域:去除逗号,,逗号面积小,大概80.参数5和参数6表示的是筛选的区域面积范围select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 150, 99999)
*旋转至水平 affine_trans_region (Region1, RegionAffineTrans1, HomMat2D, 'nearest_neighbor') *两个区域求交集,得出遥控器上的字符串 intersection (SelectedRegions1, RegionAffineTrans1, RegionIntersection)
*区域的排序,参数5:选择排序方式以行排序 sort_region (RegionIntersection, SortedRegions, 'first_point', 'true', 'row')
select_shape (SortedRegions, SelectedRegions2, 'rect2_len1', 'and', 30, 99999)
*提取出来后再闭运算-膨胀 closing_circle (SelectedRegions2, RegionClosing1, 1.5) *再竖直方向膨胀(使每个字符笔画都是连接的) dilation_rectangle1 (RegionClosing1, RegionDilation1, 1, 11) *连通域connection (RegionDilation1, ConnectedRegions2) *再求交集,获得字符 intersection ( ConnectedRegions2,SelectedRegions2, RegionIntersection1)
*生成空区域 gen_empty_obj (EmptyObject) *RegionIntersection1求交集EmptyObject,放到生成的空区域中 concat_obj (EmptyObject, RegionIntersection1, EmptyObject)
***“约3秒”、“按键”连起来的字符区域去掉,再加上“约3秒”、“按键”重新分割开的。 *区域做差。 difference (RegionIntersection, RegionIntersection1, RegionDifference) concat_obj (EmptyObject, RegionDifference, EmptyObject)
*统计总共有多少个字符区域 count_obj (EmptyObject, Number) *按行排序 sort_region (EmptyObject, SortedRegions1, 'first_point', 'true', 'row') *创建一个数组,用来保存区域面积 a:=[] *创建一个数组,用来保存外接矩形1边长L1 L1:=[] *创建一个数组,用来保存外接矩形1边长L2 L2:=[] *遍历 for i:=1 to Number-2 by 1 * select_obj (SortedRegions1, ObjectSelected, i) *区域面积 area_center (ObjectSelected, Area1, Row1, Column1) *遍历的结果添加到数组中,并且添加tab符 a:=[a,Area1,'\t'] *外接矩形1的两个边长 smallest_rectangle2 (ObjectSelected, Row2, Column2, Phi1, Length1, Length2) *遍历的结果添加到数组中,并且添加tab符 L1:=[L1,Length1,'\t'] *遍历的结果添加到数组中,并且添加tab符 L2:=[L2,Length2,'\t'] endfor *添加换行符 a:=[a,'\r\n'] *添加换行符 L1:=[L1,'\r\n'] *添加换行符 L2:=[L2,'\r\n'] ****将37个字符区域的面积和外接矩形1的两个边长参数写到txt文本中 *新建txt。文件保存在程序根目录下 open_file ('1.txt', 'output', FileHandle) fnew_line (FileHandle) *写到文本中.面积a fwrite_string (FileHandle, a) *另起一行再写。L1 fnew_line (FileHandle) fwrite_string (FileHandle, L1) *另起一行再写。L2 fnew_line (FileHandle) fwrite_string (FileHandle, L2) *关闭文件 close_file (FileHandle)
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


