一、halcon中XLD的概念
在 HALCON 中,XLD(Extended Line Description)是用于描述图像中几何形状和轮廓的高级数据结构。XLD 提供了比传统边缘检测结果更丰富的信息,并支持亚像素精度。这使得 XLD 在许多图像处理和计算机视觉应用中非常有用,如形状匹配、物体检测、图像分割等。它可以表示许多形状
XLD 的特性:
- 亚像素精度:XLD 支持亚像素精度,这意味着轮廓的坐标可以在像素之间,从而提供更高的精度。
- 丰富的几何信息:XLD 包含了关于轮廓的详细信息,如每个点的坐标、曲率、法线方向等。
- 多样的形状描述:XLD 可以表示多种几何形状,包括直线段、圆弧、椭圆等。
- 可视化和操作:HALCON 提供了多种函数,用于创建、操作、变换和可视化 XLD 轮廓。
XLD 的数据结构:
XLD 轮廓主要由一系列点(亚像素坐标)和连接这些点的线段组成。常用的 XLD 对象包括:
- Contours (轮廓):表示连续的边界线。
- Polylines (折线):由多个线段组成。
- Polygon (多边形):由闭合的线段组成。
- Ellipse (椭圆):表示椭圆形状。
- Circle (圆):表示圆形。
亚像素的轮廓可以分为两种: 1.闭轮廓:首尾相交; 2.开轮廓:首尾不相交
1. 闭轮廓(Closed Contours)
闭轮廓是指轮廓的起点和终点相交,即形成一个封闭的形状。闭轮廓通常用于表示完整的对象边界,例如圆形、矩形或其他多边形形状。闭轮廓的首尾相连,使其能够准确描述对象的外形和面积。
示例:
* 生成一个矩形的闭轮廓
gen_rectangle2_contour_xld(Rectangle, 200, 200, 0, 100, 50)
* 显示闭轮廓
dev_display (Rectangle)
2. 开轮廓(Open Contours)
开轮廓是指轮廓的起点和终点不相交,即形成一个未闭合的形状。开轮廓通常用于表示边缘或轮廓片段,例如对象的一部分边缘或线段。开轮廓在测量和匹配任务中非常有用,尤其是当只需要部分轮廓信息时。
示例:
* 生成一个开轮廓
gen_polygons_xld(Polygon, [200, 300, 400], [200, 250, 200])
* 显示开轮廓
dev_display (Polygon)
二、halcon中XLD相关算子
2.1、轮廓提取和检测
edges_sub_pix
: 提取亚像素边缘轮廓。lines_gauss
: 从图像中提取亚像素精度的直线轮廓。find_edges_sub_pix
: 提取亚像素精度的边缘。gen_contours_xld
: 生成轮廓线的 XLD 描述。
2.2、 轮廓处理
clip_contours_xld
: 剪裁 XLD 轮廓到指定的矩形区域内。reduce_domain
: 减小图像域,并对 XLD 轮廓进行裁剪(间接影响)。segment_contours_xld
: 将 XLD 轮廓分割为多个部分。
2.3、 轮廓特征提取
area_center_xld
: 计算 XLD 轮廓的面积和中心。select_shape_xld
: 从给定的 XLD 轮廓中选择满足特定形状特征的轮廓。- select_contours_xld:从给定的 XLD 轮廓中选择满足多个特征要求的轮廓,更适合用于筛选基于轮廓长度、方向等特征的轮廓。
measure_pairs
: 在 XLD 轮廓上进行测量。
2.4、 轮廓拟合
fit_line_contour_xld
: 拟合直线到 XLD 轮廓。fit_circle_contour_xld
: 拟合圆形到 XLD 轮廓。fit_ellipse_contour_xld
: 拟合椭圆到 XLD 轮廓。fit_rectangle2_contour_xld
: 拟合矩形到 XLD 轮廓。
2.5、 轮廓变换
affine_trans_contour_xld
: 对 XLD 轮廓应用仿射变换。shape_trans_xld
: 将 XLD 轮廓转换为其他形状,如凸包、外接圆、矩形等。scale_contours_xld
: 对 XLD 轮廓进行缩放。
2.6、 轮廓合并
union_collinear_contours_xld
: 合并在同一直线上的 XLD 轮廓。union_cocircular_contours_xld
: 合并在同圆上的 XLD 轮廓。union_adjacent_contours_xld
: 合并相邻的 XLD 轮廓。
2.7、 轮廓显示
dev_display
: 在窗口中显示 XLD 轮廓。disp_arrow
: 显示箭头,用于标记 XLD 轮廓的重要部分。
2.8、 轮廓分析
contour_xld_to_polygon_xld
: 将 XLD 轮廓转换为多边形 XLD。polygon_to_xld
: 将多边形数据转换为 XLD 轮廓。
三.XLD的应用
3.1 生成XLD的操作
threshold_sub_pix (Image, Border, Threshold, Features)
作用:提取图像中的亚像素级别轮廓,利用亚像素精度提高边缘的准确性。
- Image: 输入图像,通常是灰度图像或者经过预处理的图像。
- Border: 设置边缘检测的边界类型(例如,'light'、'dark'),决定了是检测明亮边缘还是暗边缘。
- Threshold: 用于轮廓提取的阈值,图像的灰度值与此阈值比较,确定是否属于轮廓。
- XLD: 输出的 XLD 轮廓。
xld的特征部分和region有很多相同的部分:
1.基础特征:xld面积,中心,宽高,左上角及右下角坐标。
2.形状特征:圆度,紧密度,长度,矩形度,凸性,偏心率,蓬松度(bulkiness),外接圆半径,外接矩形的方向及两边长度等。
3.云点特征:云点面积,中心,等效椭圆半轴及角度,云点方向等。
4.几何特征:二阶矩等。
3.2 选取特定XLD
1. select_shape_xld (XLDs, SelectedXLD,Feature, Operation, Min, Max)
功能:选择特定形状特征要求的xld轮廓或多边形
算子参数:
XLDs:要提取的XLD
SelectedXLDs:提取到的XLD
Feature:提取XLD的特征依据
Operation:特征之间的逻辑关系(and or)
Min,Max:特征值的要求范围
在下面示例中,select_shape_xld
算子根据宽度在 50 到 100 之间筛选 XLD 对象。
* 读取包含XLD的图像
read_image (Image, 'some_image_with_xlds.jpg')
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
* 根据宽度筛选XLD
select_shape_xld (Edges, SelectedXLD, 'width', 'and', 50, 100)
* 显示结果
dev_display (SelectedXLD)
2. select_contours_xld (Contours, SelectedContours, Features, Min, Max, Min2, Max2)
功能:选择多种特征要求的XLD轮廓 (如长度 开闭 方向 等特征,不支持多边形)
算子参数:
Contours:要提取的XLD轮廓
SelectedContours:提取到的XLD轮廓
Features:提取XLD轮廓的依据(筛选)
Min,Max,Min2,Max2:特征值的范围
在下面示例中,select_contours_xld
算子根据轮廓长度在 50 到 100 之间,宽度在 20 到 50 之间筛选轮廓对象。
* 读取图像并提取轮廓
read_image (Image, 'some_image_with_contours.jpg')
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
gen_contours_skeleton_xld (Edges, Contours, 'filter', 1, 'true')
* 根据轮廓长度和宽度筛选轮廓
select_contours_xld (Contours, SelectedContours, 'contour_length width', 50, 100, 20, 50)
* 显示结果
dev_display (SelectedContours)
3. area_center_xld (XLD, Area, Row, Column, PointOrder)
作用:计算每个输入轮廓的区域面积以及质心的位置。PointOrder
参数用于指定计算质心时轮廓点的顺序,这对于正确计算质心位置非常重要。
算子参数:
XLD:要提取的XLD轮廓
Area:轮廓的面积
Row:轮廓的质心行坐标
Column:轮廓的质心列坐标
PointOrder:用于计算质心时的轮廓点顺序,'positive'(正向顺序,通常顺时针),'negative'(负向顺序,通常逆时针)
3.3 XLD的合并操作
合并是指XLD的元组中,将相邻部分合并成一个,算子如下:
union_collinear_contours_xld:合并在同一直线的XLD
union_cocircular_contours_xld:合并在同圆的XLD
union_adjacent_contours_xld:合并邻近的XLD
XLD的转换操作:
shape_trans_xld (XLD, XLDTrans, Type)
作用:转换XLD的形状,其中Type为转换的类型如上面的四种类型
-
XLD: 输入的 XLD 轮廓
-
XLDTrans: 输出的 XLD 轮廓
-
Type: 转换类型。指定要进行的转换类型。常用的转换类型有:
convex
(凸包)、outer_circle
(外接圆)、rectangle1
(最小外接矩形)、rectangle2
(最小外接斜矩形)。
XLD的分割操作:
算子:
segment_contours_xld
(Contours:ContoursSplit:Mode,SmoothCont,Max,LineDist1,MaxLineDist2:)