2D测量之一
通过2D测量可以获取一些特征,如
• 物体的范围,也就是说组成物体的像素数组
• 物体的方向
• 物体间或者物体组成部分间的角度
• 物体的位置
• 物体的尺寸 ,也就是说他的宽度高度或者物体间的距离,物体组成部分间的距离
• 物体的个数
分析measure_metal_part_first_example.hdev例程
第一步:创建区域并提取基础信息
• 通过threshold算子提取感兴趣的区域
• 通过area_center 和 orientation_region算子得到区域的位置和方向
第二步:提取轮廓
• 通过edges_sub_pix算子提取轮廓
第三步:分割轮廓
•通过segment_contours_xld算子分割轮廓,’lines_circles’将轮廓分割为直线和圆弧,’lines’只分割为直线,’lines_ellipses’分割为直线和椭圆。
第四步:将轮廓划分为直线段和圆形段
•通过get_contour_global_attrib_xld算子把分割出来的轮廓分类,算子可以获取分割出来的轮廓的cont_approx系数的值,直线段的’cont_approx’ 值为-1, 椭圆形段 ’cont_approx’值为0, 圆形段 ’cont_approx’ 值为1。
第五步:提取圆形段轮廓的半径
•算子fit_circle_contour_xld算子拟合圆
第六步:计算圆心间的距离
•算子distance_pp计算出两点间的距离
提取物体特征的工具:
• 区域处理, 主要指的是 blob 分析
• 轮廓处理,包含边缘滤波、边缘提取,边缘处理
• 几何运算
blob 分析包含以下步骤:
• 预处理
• 图像分割得到感兴趣的区域
• 区域处理
• 提取特征
预处理可以用以下算子:
去噪:mean_image
抑制细线: median_image.
gray_opening_shape ,gray_closing_shape.
平滑图片:smooth_image
强化边缘:anisotropic_diffusion
填充区域:fill_up或者形态学的算子
形态学算子opening_circle和opening_rectangle1可以抑制噪声,closing_circle 和 closing_rectangle1填充区域
sub_image
2D测量之二
图像分割得到感兴趣的区域可以用以下算子:
各种各样的阈值算子可以通过灰度值将灰度值图像或者多通道图像的其中一个通道图片分割出感兴趣的区域,如
auto_threshold, bin_threshold, dyn_threshold, fast_threshold,threshold.
获取图片的灰度值的可以用gray_histo, histo_to_thresh, and intensity.
阈值算子得到的多个区域可以通过算子connection合并成一个区域。
如果物体包含蜂窝结构,算子watershed比阈值算子更合适。因为它是根据拓扑结构来分割图片的。
如果想按照强度分割图片,可以使用区域生长算子regiongrowing.进行图片分割。
对上面提到的算子,都可以使用低通滤波算子binomial_filter先进行去噪。
区域处理可以用以下算子:
分割图片后可以选择算子select_shape 或select_gray来选择有特定特征的区域。一般的特征有:特定区域范围,特定的形状,指定的灰度值。
可以通过形态学算子opening_circle 或者 dilation_rectangle来抑制一些小缝隙或者小黏连。
可以通过集合算子将不同区域连接起来。union1 , union2,intersection,difference,complement。
可以拟合区域,shape_trans
skeleton计算区域的框架
sort_region根据相邻位置归类区域, partition_dynamic将一个区域分割为等大的矩形, rank_region给对区域的操作归类.
提取特征可以用以下算子:
area_center、smallest_rectangle1 、 smallest_rectangle2、inner_rectangle1、inner_circle、diameter_region 、
orientation_region
可以先进行区域处理再进行轮廓处理,使用算子gen_contour_region_xld.把提取的区域转换为轮廓。
高精度下会使用轮廓处理而不单单使用区域处理。
轮廓处理的步骤:
创建轮廓
选择轮廓
评估轮廓:如果知道想要测量物体的形状,评估步骤为1、将复杂轮廓分割成预定义的轮廓 2、提取近似轮廓或者轮廓单元的基础形状的参数。如果不知道可以提取未知形状的基本轮廓特征。
2D测量之三
创建轮廓
一般获取轮廓的步骤是提取边缘,边缘是一张图片中亮暗区域的过渡位置,它可以由图片梯度计算得出。图片梯度也可以表示为边缘幅度和边缘方向。通过选择那些有高的边缘幅值的像素点或者有特定边缘方向的像素点,区域内的轮廓可以提取出来。可以通过多种的方式以多种精度提取轮廓。
像素精度提取边缘的方法 :使用 边缘滤波器
使用边缘滤波器后,将产生一个或两个边缘图像。通过使用阈值算子从得到的边缘图像中选择具有给定的最小边缘幅度的像素来提取边缘区域。为了获得具有一个像素厚度的边缘,必须通过使用算子(例如:skeleton)来减薄所获得的区域。
常见的像素精确边缘滤波器是运算速度较快的Sobel_amp和速度较慢但已经包括滞后阈值和细化的edges_image,其结果比Sobel_amp更精确。edges_image及其对应的彩色图像(edges_color)也可以在参数Filter设置为“Sobel_fast”的情况下应用。这样,算子的速度也很快,但仅推荐用于噪声或纹理小且边缘锐利的图像。
除了边缘之外,还可以提取由薄结构构建的线。这些线有着不均匀的一定的宽度,一般采用滤波算子bandpass_image,结合了阈值和细化。
经过滤波、阈值和细化后得到的结果一般都会转换为轮廓。将薄边缘区域转换为轮廓的算子有gen_contours_skeleton_xld。
亚像素精度提取边缘的方法
采用亚像素边缘提取算子可以立刻得到轮廓。例如edges_sub_pix、edges_color_sub_pix、zero_crossing_sub_pix。
检测图中的线以及其宽度lines_gauss, lines_facet , lines_color, edges_sub_pix.
亚像素精度方法通常比像素精度方法慢。为了加快亚像素精度的边缘提取,建议仅将其应用于ROI 。为了获得合适的ROI,可以使用阈值算子(例如,使用fast _ threshold )来确定轮廓所包围的区域。然后,返回的区域通过算子boundary缩小到其边界,并且可以用算子clip _ region _ rel进行裁剪。利用形态学算子,例如expansion _ circle,对返回区域进行少量扩展,通过reduce _ domain将图像缩小到返回区域,并将缩小后的图像用作ROI。ROI作为亚像素精确边缘提取的搜索空间。
另一种快速提取轮廓的方法是使用算子threshold_sub_pix来进行亚像素精度阈值化,可实时应用于整个图像。它与用于区域处理的那些阈值算子类似,但它不产生闭合区域,而是产生区域的边界或部分边界的亚像素精度轮廓。因此,与为区域处理引入的阈值算子相反,threshold_sub_pix返回的轮廓不需要闭合,可以获得相同区域的多个轮廓,并且等高线之间是可以连接的。和用于区域处理的阈值处理算子一样,您可以使用灰度直方图来选择合适的阈值,也可以通过使用算子gray_histo, histo_to_thresh和intensity的到的灰度值来选择合适的阈值。
选择轮廓
创建轮廓的过程产生了一系列的轮廓,我们需要从这些轮廓中选择需要的轮廓用于下一步的测量。
根据特征选择轮廓: 算子select_shape_xld可以用于选择具有特定凸性、圆性或面积等30多种形状特征的闭合轮廓,算子select _ contures _ xld可以根据轮廓的长度、曲率或方向选择闭合或非闭合的轮廓。select _ xld _ point可以与鼠标功能结合使用,以交互方式选择轮廓。
通过轮廓合并可以将接近的轮廓合并成一个选择轮廓:算子union_collinear_contours_xld可以用于合并大致位于同一直线上的轮廓;算子union_cocircular_contours_xld在同一个圆上;相邻union_adjacent_contours_xld;相切union_cotangential_contours_xld;
集合论算子选择轮廓:算子intersection_closed_contours_xld 和 intersection_closed_polygons_xld用于计算闭合轮廓或多边形相交部分;算子 difference_closed_contours_xld 和difference_closed_polygons_xld 用于计算闭合轮廓或多边形不相交的部分;算子symm_difference_closed_contours_xld 和 symm_difference_closed_polygons_xld;算子union2_closed_contours_xld 和union2_closed_polygons_xld。
简化轮廓:可以通过直接将轮廓转换为类似的形状基元来简化轮廓,使用算子shape _ trans _ xld可以将轮廓转换为最小的封闭圆,具有相同力矩的椭圆,凸包,最小的封闭矩形(平行于坐标轴或具有任意方向)
分割轮廓
所获得的轮廓通常由或多或少的复杂的形状组成。如果轮廓由已知的线段组成,例如直线或圆弧等线段。将轮廓分割成这些较不复杂的线段有助于更容易地分析,因为这些线段组成的形状基元更便于测量,例如圆的直径或线的长度。形状基元包括线、圆、椭圆和矩形。
算子segment_contours_xld可以用于轮廓分割。根据选择的参数,可将轮廓分割成直线段,直线和圆形段或直线和椭圆形段。分割得到的轮廓是直线段、圆(圆弧)或者椭圆弧可以通过分割后轮廓的全局属性'cont_approx’参数的值来确定(参考get_contour_global_attrib_xld)。如果'cont_approx'=-1,这一部分轮廓最适合被拟合为直线段。如果'cont_approx'=0,这一部分轮廓最适合被拟合为椭圆弧。如果'cont_approx'=1,这一部分轮廓最适合被拟合为圆弧。
如果只需要直线段,则也可以改为使用算子gen _ polygens _ xld。使用算子split_contours_xld可以获取多边形的每一个边。
通过近似轮廓到已知形状提取特征
在选择和分割轮廓之后的共同步骤是将形状基元拟合到轮廓或轮廓段以获得它们特定的形状参数。可以选择的形状基元有线段,圆形,椭圆形和矩形。特定的形状参数有线段的端点、圆的半径和中心。
对于直线段( ' cont _ joup ' = - 1 ),fit _ line _ contour _ xld获取每个直线段的参数,例如两个端点的坐标。
对于圆弧( ' cont _ joup ' = 1 ),fit_circle_contour_xld和
对于椭圆弧( ' cont _ joup ' = 0 ),fit_ellipse_contour_xld用于计算中心点位置、半径以及由轮廓覆盖的圆或椭圆部分段(由起点和终点的角度确定)。
用算子union_adjacent_contours_xld可以合并纯(未分段)轮廓和线性轮廓来组成矩形。fit_rectangle2_contour_xld用于获取矩形的参数。
提取未知轮廓的特征
area _ center _ xld :由轮廓或多边形包围的区域的面积和重心,以及沿边界的点的顺序。
diameter _ xld :轮廓上距离最远的两个极值点的坐标,还有他们之间的距离。
elliptic_axis_xld::与轮廓具有相同方向和纵横比的椭圆的两个半径和方向。
length _ xld :轮廓或多边形的长度。
orientation_xld :轮廓的方向。
smallest_circle_xld :最小封闭圆的中心位置和半径。
smallest_rectangle1_xld:平行于坐标轴的最小封闭矩形的中心点坐标
smallest_rectangle2_xld: 任意方向的最小封闭矩形的中心位置、方向和两个半径
某些算子仅在没有自相交的轮廓上工作。自相交并不总是显而易见的,因为它们可能由于算子的内部计算而发生。可以算子test _ self_intersection_xld检查轮廓是否与自身相交。如果自相交造成了问题,还可以使用相应的基于点的算子。可用的算子有area_center_points_xld, moments_points_xld, orientation_points_xld, elliptic_axis_points_xld, eccentricity_points_xld, 和 moments_any_points_xld.
几何运算
点到点到线到线段到轮廓。。。。。的距离
2D测量之四
选择2D测量的工具
上图中显示可用于2D测量的工具大概有三种,我们需要根据需要提取的特征和对象在图像中的外观选择合适的工具。
根据特征选工具
计算面积
area_center计算区域的面积
area_center_xld 或者area_center_points_xld计算轮廓包含的面积。
area_holes计算输入区域内孔的面积
在计算区域的面积时,会考虑区域中可能存在的空穴,而在计算轮廓的面积时,得到由轮廓包围的整个面积。在后者中,还必须提取孔的轮廓,得到它们的面积,并从外轮廓包围的区域中减去它们。
计算方向和角度
orientation_region计算区域的方向
orientation_xld计算轮廓的方向
elliptic_axis 和elliptic_axis_xld计算与区域或轮廓具有相同方向和纵横比的椭圆的两个半径和方向
elliptic_axis_gray用于非常小的对称的区域
smallest_rectangle2 smallest_rectangle2_xld: 任意方向的最小封闭矩形的中心位置、方向和两个半径
orientation_region 和 smallest_rectangle2都是用于计算方向但是方法不一样,orientation_region 基于elliptic_axis计算椭圆方向。除了方向的不同值外,返回值的范围也不同。orientation_region返回范围为- 180到180的方向,而对于smallest_rectangle2方向将在- 90到90的范围内返回。orientation_region360度的范围只适用于非对称对象,对称对象将会翻转180度。
如果是拟合轮廓到基本形状,可以查看对应的算子。如2D测量之2所示
如果形状相当复杂并且是刚性的,在不同图片上计算形状的方向,可以用模板匹配的方法。
如果要计算两个物体间的角度,可以用几何计算中的angle_ll 和 angle_lx。
计算点
有很广泛的方法可以用于获取一个物体的点。
任意形状的物体都可以通过区域处理中提到的算子area_center算出中心点(5.1)。
也可以通过轮廓处理的算子area_center_xld 或者area_center_points_xld计算中心点(6.2)。
算子area_center_gray可以计算出小的对称区域的中心点。
如果物体可以分割成如直线,圆形或者矩形等的基础形状,拟合基础形状到轮廓可以计算中心点的坐标,直线拟合可以获取端点。矩形拟合可以获取矩形的点和方向。(5.10和5.11)
如果物体相当复杂并且是刚性的,可以用模板匹配的方法。
如果边缘对沿着直线或者圆弧线,可以用1D测量的方法。
如果需要计算角点,可以通过几何运算计算,也可以拟合直线,通过intersection_ll求直线的交点(5.7)。
求拟合直线的交点还可以用于求网状格的连接点。(5.6)
计算尺寸和距离
物体的尺寸可以用很多方法来计算,具体方法根据物体的形状来制定。
对于圆形或椭圆形的轮廓或者部分轮廓,一般拟合圆或者椭圆沦落来计算(5.11)。
如果是完整的圆,还可以通过inner_circle获取最大内接圆或者通过smallest_circle 或smallest_circle_xld获取最小外切圆。这种方法比拟合更容易受异常点影响。
对于矩形,可以拟合矩形来计算长宽和中心点(5.9),也可以通过smallest_rectangle2或smallest_rectangle2_xld获取最小外切矩形(5.12).同样,获取外切矩形比拟合更容易受异常点影响。
很多计算物体间或物体结构间距离的应用会通过提取合适的点来计算。比如:计算两条相交线的交点,然后使用几何算子通过他们来计算他们间的距离或者他们和其它点、线、线段、轮廓或者区域。(5.6)计算网络格交线的连接点来获取网络格的长宽。(5.7)计算金属板相交线的交点来计算角点。(5.3)计算轮廓到他的拟合线(回归线)的最大距离。
如果边缘对沿着直线或者圆弧线,可以用1D测量的方法。
物体的宽度可以用很多种方式进行计算,具体根据物体来选择。窄直线(如电缆、河流或动脉)经常使用算子lines_gauss来计算(5.5)。对于严格多边形物体,最好通过几何算子计算独立直线和点的距离(5.4)。(5.2)通过计算平行于纵轴的物体在同一纵坐标下边缘点的横坐标的差来获取平均、最小或者最大的宽度。
对于任意形状的物体,区域处理或者轮廓处理都可以得到基础的特征。(6.2)通过算子length_xld计算氧化铝表面划痕轮廓的长度。
计算个数
为了获得对象的数量,常用的方法是使用元组并对其元素进行计数。在HDevelop,如果元组包含图标数据,例如区域或轮廓,则可以查询元素的数量使用运算符count_obj。如果元组包含控制数据,例如一组点的行坐标或列坐标,可以通过相应的
运算符赋值中的HDevelop操作( | tuple | )。还要注意,数值元组的索引不对应于图标元组的索引。数值元组以0开始和图标元组
从1开始。
比较区域处理和轮廓处理
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

