分水岭算法能够较好的适用于复杂背景下的目标分割,特别是具有蜂窝状结构的画面的内容分割。Halcon中使用watersheds_threshold算子提取图像的分水岭
watersheds_threshold
除了watersheds算子,watersheds_threshold算子也可以进行分水岭分割。二者的区别在于后者比前者多了一步操作,即在得到初步的分水岭分割结果后,将灰度小于阈值的分水岭合并。原型如下:
watersheds_threshold(Image:Basins:Threshold:)
1
各参数的含义如下:
(1)Image:输入的图像,一般为单通道图像,这里要注意的是,因为盆地一般指的是灰度值较低的区域,所以如果前景目标比较亮而背景比较暗,可以使用convert_image算子对颜色进行翻转。
(2)Basins:输出的盆地区域
(3)Watersheds:设置的灰度阈值。
read_image(Image, 'E:/1001.jpg')
get_image_size (Image, Width, Height)
*平滑图片去噪
mean_image (Image, RegionGray, 5, 5)
dev_set_draw ('margin')
dev_set_line_width (2)
threshold (RegionGray, Region,33, 255)
* 计算连通域
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 999999)
dev_display (Image)
dev_display (SelectedRegions)
* 距离变换
distance_transform (SelectedRegions, DistanceImage, 'octagonal', 'true', Width, Height)
convert_image_type (DistanceImage, DistanceImageByte, 'byte')
invert_image (DistanceImageByte, DistanceImageInv)
* 扩大图像灰度范围【0,255】
scale_image_max (DistanceImageInv, DistanceImageInvScaled)
dev_display (DistanceImageInv)
* 分水岭算法分割
watersheds_threshold (DistanceImageInv, Basins, 20)
dev_display (DistanceImageInvScaled)
dev_display (Basins)
dev_display (Image)
dev_display (SelectedRegions)
dev_set_color ('blue')
* 图像求交
intersection (Basins, SelectedRegions, SegmentedPellets)
dev_display (Image)
dev_set_colored (12)
dev_display (SegmentedPellets)