union_straight_contours_xld(Contours : UnionContours : MaxDist, MaxDiff, Percent, Mode, Iterations : )
如果满足某些条件,union_straight_contours_xld合并相邻的XLD轮廓Contours 。
在每次迭代中,最多合并两个满足给定条件的轮廓线。
参数Iterations 控制执行此步骤的频率。
如果两个轮廓的端点之间的最短距离(端点是轮廓的第一个点和最后一个点在其回归线上的投影)
小于MaxDist,并且方向不同(即,回归线方向)小于MaxDiff(弧度),则两轮廓合并。
如果只满足其中一个标准,则合并的决策可能受到权重因子Percent的影响,
权重因子百分比允许超过一个限制的值与低于该限制的另一个值保持相同数量的平衡。
终点距离按Percent加权,方向差按100-Percent加权。
这意味着如果两个轮廓满足以下条件,则合并它们:
例如,如果两个轮廓的端点距离为5.0,
方向差为0.5(所选的极限为MaxDist = 4.0, MaxDiff = 0.625),
那么这两个值都与极限相差25%。
通过选择Percent= 60%,较大的端点距离加权大于较小的方向差,从而不合并轮廓。
相反,如果选择Percent = 40%,则合并轮廓线。
对于Percent = 100%,只考虑端点距离,
而对于Percent = 0%,只使用方向差。
如果Percent = 50%,两个条件都同样有效
如果存在平行轮廓线,则存在合并相邻轮廓线的危险。
如果要避免这种情况,必须选择Mode = 'noparallel',
否则Mode = 'paralleltoo'就足够了。
对于Mode = 'every',轮廓被无条件地合并。
在这种情况下,所有其他参数都没有影响。
对合并后的等值线重新计算回归线的参数。
例程
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_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
|