前言
如何从一块区域内找到水平方向的缝隙区域(不是高斯线条,从图像中提取,而是从区域内提取,考虑到了区域所在的方向);
dev_close_window ()
dev_open_window (0, 0, 800, 800, 'black', WindowHandle)
read_image (Image, 'C:/Users/MI/Desktop/1.jpg')
rgb1_to_gray (Image, Image)
***动态阈值分割
binary_threshold (Image, Regions, 'max_separability', 'light', UsedThreshold)
fill_up (Regions, Regions)
***显示过滤后的区域
dev_display (Image)
dev_display (Regions)
****区域的开闭运算
*开运算,看起来两个细微连接的区域分开了,不会扩展区域边界外部部分,只会更改区域内部的连接处,和腐蚀不一样
*闭运算,看起来两个细微连接的区域结合了,不会扩展区域边界外部部分,只会更改区域内部的连接处,和膨胀不一样
***这个算子的思路是改变滤波核形状,水平方向上扩展了一个像素,竖直方向上扩展了十个像素
closing_rectangle1 (Regions, RegionClosing, 1, 10)
*****区域作差,这样,就找到了特定的,区域内部的连接处
difference (RegionClosing, Regions, RegionDifference)
*****分割区域
connection (RegionDifference, ConnectedRegions)
*****去噪
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 50, 99999)
*此时噪点过多,需要进一步提取主要方向上的特征
*缝隙的特点是狭长,最好实现的方法是提取区域骨骼
skeleton (SelectedRegions, Skeleton)
*****生成轮廓
gen_contours_skeleton_xld (Skeleton, Contours, 1, 'filter')
*连接轮廓,此时的轮廓线还不是一条直线
union_adjacent_contours_xld (Contours, UnionContours, 70, 1, 'attr_keep')
***显示过滤后的区域
dev_display (Image)
dev_display (UnionContours)
***对特定的直线拟合,
count_obj (UnionContours, Number)
gen_empty_obj (lines)
for Index := 1 to Number by 1
select_obj (UnionContours, ObjectSelected, Index)
*把不是直线的轮廓线拟合成直线
fit_line_contour_xld (ObjectSelected, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
concat_obj (ObjectSelected, lines, lines)
endfor
***显示拟合后的直线
dev_display (Image)
dev_display (lines)
成像效果
原图
效果图