阈值分割引言
阈值分割有非常多的算法,大体上分为全局和局部算法。 全局算法包括全局固定阈值和基于图像直方图的阈值,局部算法包括局部动态阈值分割。 基于图像直方图阈值分割的方法也有很多,比如常规的高斯滤波双峰法,OTSU大津法。 但是这类所有的法都基于一个假设:图像是有前景和背景的,待分割目标处于背景中,即图像直方图是双峰的。 如果因为非均匀光照导致待分割目标不处于背景或前景中,即图像直方图无双峰, 那么基于图像直方图的所有法都是不甚理想的 只能在此基础上进行一定的变换,例如nbl算法等,这些都属于局部算法。 任何算法,都会基于假设空间的。没有假设空间,所有算法性能一致。包括经典算法和深度学习算法。 本系列的贴子勇哥通过实验来细品它们之间的差别,以求以后可以精准应用。
这一节谈谈拓扑分割算子。
比如:Watersheds系列算子,分水岭系列。
watersheds(Image : Basins, Watersheds : : )
watersheds_threshold(Image : Basins : Threshold : )
功能:通过阈值实现图像的分水岭算法分割
watersheds_marker(Image, Markers : Basins : : )(halcon12不支持)
分水岭的原理
分水岭算法基本思想:
一个灰度影像可以看做一个高程影像,灰度的变化就是地形的起伏。假设向该区域不断注水,则地势较低的位置会首先被淹没,随着水位的升高淹没的区域也会不断提高,而初始位置称为集水盆。而分水岭算法就是基于此基本思想,首先假设图像灰度值为高度值,通过集水盆区域不断注水使得每个淹没区域不断扩大,而当水淹没到一定高度时两个集水盆会相连合并为同一个区域,此时就应该在这两个集水盆之间建立拦水坝以阻止区域的合并,持续次过程直到注水高度满足要求得到所有集水盆的淹没区域。
分水岭算法主要用于图像的分割,如果目标物体是连接在一起的,则分割起来会很困难。此时经常采用分水岭分割算法,会得到比较好的效果。分水岭分割算法把图像看成一幅地形图,亮度比较强的区域像素值较大,亮度暗的区域像素值比较小,通过寻找汇水盆地和分水岭界线对图像进行分割。分水岭的计算过程是一个迭代标注过程。分水岭比较经典的计算方法是L. Vincent提出的。在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。
第1步:
通过分水岭算法watersheds()获取图像的盆地。
第2步:
根据第一步分水岭算法分离结果,若盆地部分的灰度**< threshold**,则被合并到一起。设B1和B2分别为相邻盆地的最小灰度值,W为将盆地分割为两个盆地的最小灰度值。则分割结果为:
案例一
watersheds_threshold的基本用法
dev_set_draw ('margin') dev_set_line_width (2) dev_set_colored (12) read_image (Meningg6, 'meningg6.png') dev_close_window () get_image_size (Meningg6, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) gauss_filter (Meningg6, ImageGauss, 3) dev_display (ImageGauss) *这里只是看下watersheds算子的效果,在本例中没发挥作用 watersheds (ImageGauss, Basins1, Watersheds) dev_display (ImageGauss) dev_display (Basins1) disp_continue_message (WindowHandle, 'black', 'true') stop () watersheds_threshold (ImageGauss, Basins2, 10) intensity(Basins2, ImageGauss, Mean, Deviation) Mask := Mean [<=] 140 *这个算子是按Mask来批量选择对象,省略循环的利器 select_mask_obj(Basins2, SelectedObjects, Mask) dev_display (ImageGauss) dev_display (SelectedObjects)
代码中,我们修改140更大一些,可以选择到灰度更浅一些region
但是背景也就是在147左右,所以其实做灰度平均值intensity也不是完美的解决办法。
究其原因还是因为分水岭生成的region并不是紧紧包住缺陷的原因。
Mask := Mean [<=] 140
案例二
边缘振幅+分水岭阈值实现图像分割(也可以称为梯度的分水岭分割)
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') stop () gauss_filter (ImageLogo, ImageGauss, 9) sobel_amp (ImageGauss, EdgeAmplitude, 'sum_abs', 3) disp_continue_message (WindowHandle, 'black', 'true') stop () watersheds_threshold (EdgeAmplitude, Basins, 14) dev_display (Basins) disp_continue_message (WindowHandle, 'black', 'true') stop () return ()
案
例三
距离变换+watersheds_threshold等实现分割
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 () * 距离变换 distance_transform (SelectedRegions, DistanceImage, 'octagonal', 'true', 380, 350) convert_image_type (DistanceImage, DistanceImageByte, 'byte') invert_image (DistanceImageByte, DistanceImageInv) * 扩大图像灰度范围[0,255] 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') stop () return ()
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

