分水岭算法是一种典型的基于边缘的图像分割算法,通过寻找区域之间的分界线,对图像进行分割。传统的分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是地质学上的拓扑地貌,图像中每一像素的灰度值表示该点的海拔高度,每一个局部极小值及其周边区域称为集水盆地,而集水盆地的边界则形成分水岭。
分水岭算法能够较好的适用于复杂背景下的目标分割,特别是具有蜂窝状结构的画面的内容分割。Halcon中使用watersheds算子提取图像的分水岭。原型如下:
watersheds(Image:Basins,Watersheds::)
各参数的含义如下:
(1)Image:输入的图像,一般为单通道图像,这里要注意的是,因为盆地一般指的是灰度值较低的区域,所以如果前景目标比较亮而背景比较暗,可以使用convert_image算子对颜色进行翻转。
(2)Basins:输出的盆地区域
(3)Watersheds:为输出的分水岭区域。一般一幅输入图像对应一个分水岭区域,而输出的Basins则是多个区域的集合。
注意:如果输入图像包含过多噪点或细节,输出的区域数量将非常庞大并影响算法速度。
除了watersheds算子,watersheds_threshold算子也可以进行分水岭分割。二者的区别在于后者比前者多了一步操作,即在得到初步的分水岭分割结果后,将灰度小于阈值的分水岭合并。原型如下:
watersheds_threshold(Image:Basins:Threshold:)
各参数的含义如下:
(1)Image:输入的图像,一般为单通道图像,这里要注意的是,因为盆地一般指的是灰度值较低的区域,所以如果前景目标比较亮而背景比较暗,可以使用convert_image算子对颜色进行翻转。
(2)Basins:输出的盆地区域
(3)Watersheds:设置的灰度阈值。
dev_set_draw ('fill') dev_set_line_width (2) dev_set_colored (12) read_image (ImageLogo, 'mvtec_logo.png') dev_close_window () get_image_size (ImageLogo, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) dev_display (ImageLogo) disp_continue_message (WindowHandle, 'black', 'true') gauss_filter (ImageLogo, ImageGauss, 9) sobel_amp (ImageGauss, EdgeAmplitude, 'sum_abs', 3) watersheds (EdgeAmplitude, Basins1, Watersheds) dev_display (Basins1) disp_continue_message (WindowHandle, 'black', 'true') watersheds_threshold (EdgeAmplitude, Basins2, 14) dev_display (Basins2)
上面这幅图使用sobel_amp提取边缘后得到边缘区域 EdgeAmplitude 如下:
watersheds 得到的盆地区域为 Basins1:
watersheds_threshold 得到的盆地区域为 Basins2:
因为边缘的灰度值大于14,所以小于14的分水岭区域合并,分水岭消失。