regress_contours_xld(Contours : RegressContours : Mode, Iterations : )
函数主要用于计算到XLD轮廓的回归线。
regression s_contours_xld为输入的XLD轮廓Contours计算以下参数,
并将它们与生成的轮廓作为全局属性存储:
回归线法向量的坐标,
即,所有等高线点的最小二乘逼近线;法向量总是从原点指向直线(属性:'regr_norm_row', 'regr_norm_col'),
轮廓线点与回归线的欧式距离均值(属性:'regr_mean_dist'),
这些距离到回归线的标准偏差(属性:'regr_dev_dist')。
Mode = 'no'时,计算所有轮廓线点的回归曲线的参数。
此外,可以采用三种不同的离群值处理方法。
离群点是指轮廓点不以“明显”的方式位于一般轮廓方向上,从而“扭曲”得到的回归线。
Mode =drop时,在计算不失真的回归直线时,忽略所有距回归直线比平均距回归直线远的轮廓点。
Mode =gauss时,轮廓点的距离是根据其在正态回归线附近的高斯分布出现的概率加权的。
Mode =median时,这里也假定到正态回归线的距离为正态分布,
但是与异常值无关的标准差{中值(all dist.)}除以(0.6745)。
同样,对距离进行加权,对于不失真的回归直线,忽略比一定距离更远的点。
无失真回归曲线的计算可重复多次(通过参数Iterations)
例程
*读取一张图片
read_image (Image, 'ed_g')
get_image_size (Image, Width, Height)
pi := 3.1415926535897
Eps := pi / 4
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowID)
*用常量在指定区域生成一平行矩形
gen_rectangle1 (Rectangle, 150, 170, 210, 200)
*剪切图像得到小区域图像
reduce_domain (Image, Rectangle, ImageReduced)
*获取小区域内图像边缘,生成多边形轮廓
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)
*选择方向在pi / 2 - Eps, pi / 2 + Eps范围内的回归线轮廓
select_contours_xld (RegressContours, SelectedContours, 'direction', pi / 2 - Eps, pi / 2 + Eps, -0.5, 0.5)
*选择长度在2, 200000,范围内的回归线轮廓
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)
*生成两线段
gen_contour_polygon_xld (Line1, [RowBegin[0],RowEnd[0]],[ ColBegin[0],ColEnd[0]])
gen_contour_polygon_xld (Line2, [RowBegin[1],RowEnd[1]],[ ColBegin[1],ColEnd[1]])
*结果显示
dev_set_color ('red')
dev_display (Image)
dev_set_draw ('margin')
dev_display (Rectangle)
dev_set_color ('yellow')
if (|RowBegin| == 0)
disp_message (WindowID, 'No edges found', 'window', 12, 12, 'black', 'true')
else
dev_display (Line1)
dev_display (Line2)
endif
例程事先读取一张图片,用常量生成一个平行矩形,
对在此区域内的图像进行边缘提取与处理,
调用 regress_contours_xld 计算边缘的回归线轮廓,
筛选角度在一定范围内的回归线拟合成直线显示。
|