Halcon学习笔记之基于分水岭的目标分割


分水岭算法是一种典型的基于边缘的图像分割算法,通过寻找区域之间的分界线,对图像进行分割。传统的分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是地质学上的拓扑地貌,图像中每一像素的灰度值表示该点的海拔高度,每一个局部极小值及其周边区域称为集水盆地,而集水盆地的边界则形成分水岭。

watersheds

分水岭算法能够较好的适用于复杂背景下的目标分割,特别是具有蜂窝状结构的画面的内容分割。Halcon中使用watersheds算子提取图像的分水岭。原型如下:

watersheds(Image:Basins,Watersheds::)

各参数的含义如下:
(1)Image:输入的图像,一般为单通道图像,这里要注意的是,因为盆地一般指的是灰度值较低的区域,所以如果前景目标比较亮而背景比较暗,可以使用convert_image算子对颜色进行翻转。
(2)Basins:输出的盆地区域
(3)Watersheds:为输出的分水岭区域。一般一幅输入图像对应一个分水岭区域,而输出的Basins则是多个区域的集合。

注意:如果输入图像包含过多噪点或细节,输出的区域数量将非常庞大并影响算法速度。

watersheds_threshold

除了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的分水岭区域合并,分水岭消失。

猜你喜欢

转载自blog.csdn.net/Z960515/article/details/113477132