union_adjacent_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, Mode : )
union_adjacent_contours_xld连接Contours 内的所有轮廓,这些轮廓的端点很接近。
被连接的轮廓由输入轮廓的轮廓点连接组成。
如有必要,将这些输入轮廓点的顺序翻转,
使必须连接的轮廓的端点在结果点列表中是直接相邻的。
重复此操作,直到不再有未连接的相邻轮廓。
统一后新创建的所有轮廓,以及无法与任何其他轮廓连接的输入轮廓,
都保存于UnionContours 。
参数MaxDistAbs和MaxDistRel用于定义两条轮廓线接近的条件。
原则上,这些参数的度量取决于每对等值线的计算顺序,
即,该轮廓线作为参考轮廓线,与第二轮廓线连接。
为了避免这种依赖关系,在两个方向上对各自的度量值进行评估,
并选择导致这些度量值更小的轮廓线顺序。
注意,在下面的插图中,左边的轮廓线总是用作参考轮廓线。
参数Mode 控制输入轮廓属性的处理。
MaxDistAbs
参数MaxDistAbs定义了两个轮廓之间可接受的最大绝对距离。
距离是沿着参考轮廓的回归线测量的。
因此,它是两个轮廓之间的间隙投影到参考轮廓的回归线上的长度。
MaxDistRel
参数MaxDistRel定义了两个轮廓之间可接受的最大相对距离。
相对距离的计算方法是将距离a(参见参数MaxDistAbs的描述)除以参考轮廓的长度b。
相邻等高线的连通顺序主要取决于相邻端点的距离:
距离最小的等高线先连通。
如果有两对等高线距离相同,则首先连接不包含最短等高线的等高线对。
Mode
最后,通过参数Mode可以控制如何处理输入轮廓可能带来的属性。
例如,操作符edges_sub_pix附加到每个轮廓点属性,
比如局部方向、边缘响应和边缘方向。
选择默认值'attr_keep',所有属性都将复制到输出中,
如果必须翻转轮廓线才能将其与另一个轮廓线连接起来,
那么这些属性将适应新的方向。
然而,对于大量的输入轮廓,如果不需要这些属性进行进一步的计算,
出于性能原因忽略它们可能是明智的。
为此,必须传递值'attr_forget'。
和union_straight_contours_xld类似,例程有
pi := 3.1415926535897
Eps := pi / 4
read_image (Image, 'ed_g')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowID)
dev_set_draw ('margin')
dev_set_part (153, 165, 215, 231)
dev_display (Image)
gen_rectangle1 (Rectangle, 150, 170, 210, 200)
reduce_domain (Image, Rectangle, ImageReduced)
*提取图像XLD轮廓
edges_sub_pix (ImageReduced, Edges, 'sobel', 0.5, 40, 50)
*生成多边形轮廓
gen_polygons_xld (Edges, Polygons, 'ramer', 1)
*断开轮廓连接
split_contours_xld (Polygons, SplitContours, 'polygon', 1, 5)
*计算轮廓对应回归线轮廓
regress_contours_xld (SplitContours, RegressContours, 'drop', 1)
*根据角度选择近似垂直轮廓线
select_contours_xld (RegressContours, SelectedContours, 'direction', pi / 2 - Eps, pi / 2 + Eps, -0.5, 0.5)
*选择轮廓线长度在一定范围的轮廓线
select_contours_xld (SelectedContours, SelectedContoursFinal, 'length', 2, 200000, -0.5, 0.5)
*连接轮廓线
union_adjacent_contours_xld (SelectedContoursFinal, UnionContours, 5, 1, 'attr_keep')
*union_straight_contours_xld (SelectedContoursFinal, UnionContours, 6, 0.2, 100, 'noparallel', 'maximum')
*拟合轮廓线成直线,得到直线参数
fit_line_contour_xld (UnionContours, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
dev_display (Image)
dev_set_color ('white')
if (|RowBegin| == 0)
disp_message (WindowID, 'No edges found', 'window', 12, 12, 'black', 'true')
else
disp_line (WindowID, RowBegin, ColBegin, RowEnd, ColEnd)
endif
下面是另一例程
* 例程演示如何使用union_collinear_contours_xld连接相邻的线段
*这是新的也是建议使用的算子。
*另外也演示如何使用旧的算子union_straight_contours_xld来
*连接不共线,但含相邻点的轮廓
read_image (Image, 'pads')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_colored (12)
dev_set_draw ('margin')
dev_display (Image)
Border := 35
rectangle1_domain (Image, ImageReduced, Border, Border, 576 - Border, 768 - Border)
* 提取图像线段轮廓,连接共线的轮廓线,保留长度在指定范围的线段。
* edges_sub_pix (ImageReduced, Edges, 'lanser2', 0.16, 3, 5)
edges_sub_pix (ImageReduced, Edges, 'canny', 5, 3, 5)
segment_contours_xld (Edges, ContoursSplit, 'lines', 5, 4, 2)
select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 20, Width / 2, -0.5, 0.5)
union_collinear_contours_xld (SelectedContours, UnionContours, 10, 1, 8, 0.4, 'attr_keep')
select_contours_xld (UnionContours, SelectedContours1, 'contour_length', 50, 10000, -0.5, 0.5)
* 连接相邻轮廓,拟合最小外接旋转矩形
union_adjacent_contours_xld (SelectedContours1, UnionContours1, 20, 1, 'attr_keep')
smallest_rectangle2_xld (UnionContours1, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
stop ()
*将每个轮廓段拟合成线段
dev_display (Image)
fit_line_contour_xld (SelectedContours1, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
for i := 0 to |RowBegin| - 1 by 1
gen_contour_polygon_xld (Contour, [RowBegin,RowEnd], [ColBegin,ColEnd])
dev_display (Contour)
endfor
|