分水岭,顾名思义由地貌中的视觉形态演变而来。我们用一种场景来说明,想象一个干涩得裂开的农田赶上下雨,最终淹没到只看得见稻苗。它的整个过程先是灌满地势低的土地裂缝然后慢慢淹没整块土地只剩看得到稻苗。
将上面的思想引入到图像区域的分割上,我们就很容易实现一种以“侵泡”式的图像分割,其基本思想是把图像看作测地学上的拓扑地貌,图像中的每一点像素的灰度值表示该点的海拔高度,高灰度值代表山脉,低灰度值代表盆地,每一个局部极小值及其影响区域称为积水盆地,而积水盆地的边界则形成分水岭。
首先看一个场景的例子:

倘若我想一次干脆的拿到绿色圈圈以及它内部的所有细节,使用平常的阈值分割的方式分割起来会比较复杂。
其实从灰度值的大小来区分,图中绿色的灰度值是大于其它颜色的灰度值,因此采用分水岭的思想很容易解决:
代码:
read_image (Image, 'C:/Users/斌/Desktop/分水岭算法的研究/无标题4.png')
watersheds_threshold (Image, Basins, 150)
reduce_domain (Image, Basins, ImageReduced)
dev_clear_window ()
dev_display (ImageReduced)
效果:

然后再用一个动图来说明分水岭的过程细节:

halcon中采用"分水岭算法解决粘合度高的物体切割"的示例:
代码及注释讲解:
*这个示例演示的是如何将粘合度高的物体通过分水岭算法的思想进行图像分割。
dev_set_draw ('margin')
dev_set_colored (12)
read_image (Image, 'pellets')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
threshold (Image, Region, 105, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 99999)
dev_display (Image)
dev_display (SelectedRegions)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 计算输入区域的距离变换(它的作用是输出一副图像,这幅图像是每个点到这个region的距离分布图,并不是一个真正的图像。只是一个距离值的分布图而已)
distance_transform (SelectedRegions, DistanceImage, 'octagonal', 'true', 380, 350)
*转换图像的类型(将图像的数据类型转换成适合处理的图像类型)
convert_image_type (DistanceImage, DistanceImageByte, 'byte')
*反转图像(亮的变暗,暗的变亮)
invert_image (DistanceImageByte, DistanceImageInv)
*扩展灰度值(以改变灰度值的形式进行图像增强)
scale_image_max (DistanceImageInv, DistanceImageInvScaled)
*阈值分水岭
watersheds_threshold (DistanceImageInv, Basins, 5)
dev_display (DistanceImageInvScaled)
dev_display (Basins)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
dev_display (Image)
dev_display (SelectedRegions)
dev_set_color ('blue')
dev_display (Basins)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 计算两个区域的交集
intersection (Basins, SelectedRegions, SegmentedPellets)
dev_display (Image)
dev_set_colored (12)
dev_display (SegmentedPellets)
disp_continue_message (WindowHandle, 'black', 'true')
1087

被折叠的 条评论
为什么被折叠?



