图像分割是图像处理的重要内容,是位于底层的图像处理、特征提取与上一层次的图像分析之间的关键步骤。图像分割的相关技术较多,分为三篇介绍。本节是中篇,介绍基于区域的技术,包括区域生长和分水岭算法等。
1. 引言
基于区域的图像分割方法是一类通过识别图像中具有相似特征的区域来实现分割的技术。其核心思想是将图像划分为若干区域,每个区域内的像素在颜色、纹理、强度等方面具有一致性,而不同区域之间则存在明显差异。
1.1 工作原理
基于区域的图像分割方法通常从图像的初始区域(如单个像素或小的像素块)开始,通过一定的准则(如灰度值、纹理、颜色等)逐步合并或分裂区域,直到满足预定的停止条件。常见的准则包括区域内的相似性和区域间的差异性。最终,图像被划分为若干个具有一致特征的区域。
这类方法通常依赖于像素的局部信息,通过区域生长、合并或分裂等操作来实现分割。
1.2 主要方法分类及特性
(1)区域生长法
- 工作原理:从种子点开始,逐步将邻近的像素或区域合并到当前区域中,直到满足停止条件。
- 特性:简单直观,但对种子点的选择敏感,且容易受到噪声影响。
(2)分裂合并法
- 工作原理:先将图像划分为若干初始区域,然后根据相似性准则对区域进行分裂或合并,直到满足分割要求。
- 特性:能够处理复杂的图像结构,但计算复杂度较高。
(3)基于图论的方法
- 工作原理:将图像表示为图结构,节点代表像素或区域,边代表像素或区域之间的关系,通过图割(Graph Cut)等方法实现分割。
- 特性:能够全局优化分割结果,但对图的构建和优化算法的选择较为敏感。
(4)均值漂移分割
- 工作原理:通过均值漂移算法寻找图像中密度最大的区域,将像素分配到相应的密度中心。
- 特性:对噪声鲁棒,能够处理复杂的纹理和颜色分布,但计算量较大。
(5)超像素分割
- 工作原理:将图像划分为若干个超像素块,每个超像素块内的像素具有相似的特征。
- 特性:能够显著减少后续处理的复杂度,常用于预处理步骤。
2. 区域生长方法
2.1 区域生长算法的原理
区域生长算法的核心思想是从一个或多个种子点开始,逐步将与其相邻且满足相似性条件的像素合并到同一区域中。其基本步骤如下:
- 选择种子点:在图像中选择一个或多个像素作为种子点。
- 定义生长准则:通常基于像素的灰度值、颜色或纹理等特征,设定相似性判据(如灰度差值不超过某个阈值)。
- 区域生长:从种子点出发,检查其邻域像素(如八邻域),将符合生长准则的像素加入当前区域,并作为新的种子点继续生长。
- 停止条件:当没有新的像素满足生长条件时,算法停止。
区域生长算法的优点在于能够精确分割出具有相似特征的区域,但对种子点的选择和噪声较为敏感
2.2 Halcol中区域生长算法的实现
(1) regiongrowing
Halcon使用regiongrowing算子实现区域生长分割。
算子声明:
regiongrowing(Image : Regions : RasterHeight, RasterWidth, Tolerance, MinSize : )
参数说明:
- Image:输入的单通道图像。
- Regions:输出的分割区域。
- RasterHeight和RasterWidth:定义用于平滑处理的高斯低通滤波器的模板大小,默认值都是3。
- Tolerance:灰度值差异的容忍度,用于判断相邻两子区域是否属于同一区域,默认值是6。
- MinSize:输出区域的最小像素数,小于此值的区域将被忽略,默认值是100。
实例代码:
python
* 读取图像
read_image(Image, 'example_image.tiff')
* 中值滤波去噪
median_image(Image, ImageMedian, 'circle', 2, 'mirrored')
* 区域生长分割
regiongrowing(ImageMedian, Regions, 1, 1, 5, 100)
* 填充区域空洞
fill_up_shape(Regions, RegionFillUp, 'area', 1, 100)
* 显示结果
dev_display(RegionFillUp)
性能分析:
- 通常在调用区域生长算法之前,使用尺寸至少为RasterHeight×RasterWidth的低通滤波器对图像进行平滑处理(以便矩形中心的灰度值能够"代表"整个矩形)。如果图像噪声较少且矩形区域较小,在许多情况下可以省略平滑处理。
- 优点:能够精确分割出具有相似特征的区域。适用于复杂图像的分割,尤其是目标区域与背景差异明显的场景。
- 缺点:对种子点的选择敏感,种子点选择不当可能导致分割失败。对噪声和灰度不均匀的图像效果较差。计算复杂度较高,处理大图像时可能耗时较长。
(2) regiongrowing_mean
Halcon使用regiongrowing_mean算子实现区域生长分割。该算子通过像素灰度值的均值进行区域生长。
算子声明:
regiongrowing_mean ( Image : Regions : StartRows, StartColumns, Tolerance, MinSize : )
参数说明:
- Image(输入):输入图像,通常为单通道灰度图像。
- Regions(输出):分割后的区域集合。
- StartRow, StartColumn(输入):种子点的行和列坐标,作为区域生长的起点。
- Tolerance(输入):灰度值容忍度,决定像素是否属于同一区域,默认值是5.0。
- MinSize(输入):区域的最小像素数,小于此值的区域将被忽略,默认值是100.0。
实例代码:
python
* 读取图像
read_image(Image, 'example_image.png')
* 选择种子点
StartRow := 100
StartColumn := 150
* 设置参数
Tolerance := 5
MinSize := 50
* 区域生长
regiongrowing_mean(Image, Regions, StartRow, StartColumn, Tolerance, MinSize)
* 显示结果
dev_display(Regions)
(3) regiongrowing_n
Halcon使用regiongrowing_n算子实现多通道图像区域生长分割。
算子声明:
regiongrowing_n ( MultiChannelImage : Regions : Metric, MinTolerance, MaxTolerance, MinSize : )
参数说明:
- MultiChannelImage:输入的多通道图像。
- Regions:输出的分割区域。
- Metric:在特征空间中计算两个特征点间的距离,可以使用的距离定义为: {'1-norm', '2-norm', '3-norm', '4-norm', 'n-norm', 'max-diff', 'min-diff', 'variance', 'dot-product', 'correlation', 'mean-diff', 'mean-ratio', 'length-diff', 'length-ratio', 'n-norm-ratio', 'gray-max-diff', 'gray-max-ratio', 'gray-min-diff', 'gray-min-ratio', 'variance-diff', 'variance-ratio', 'mean-abs-diff', 'mean-abs-ratio', 'max-abs-diff', 'max-abs-ratio', 'min-abs-diff', 'min-abs-ratio', 'plane'}。默认值是'2-norm'。
- MinTolerance:特征距离的阈值最小值,默认值是0.0。
- MaxTolerance:特征距离的阈值最大值,默认值是20.0。
- MinSize:输出区域的最小像素数,小于此值的区域将被忽略,默认值是30。
功能介绍:
- regiongrowing_n 执行多通道区域生长。n 个通道生成一个 n 维特征向量。如果相邻点的特征向量在给定度量下的差异位于区间 [MinTolerance, MaxTolerance] 内,则将这些相邻点聚合到同一区域中。仅检查 4-邻域(上下左右)的相邻点。
(4) expand_gray
Halcon使用expand_gray 算子用于区域扩展,基于灰度值相似性对区域进行扩展。它通过检查区域边界像素的邻域,将灰度值相似的像素合并到区域中。
算子声明:
expand_gray ( Regions, Image, ForbiddenArea : RegionExpand : Iterations, Mode, Threshold : )
参数说明:
- Regions(输入):输入区域,表示需要扩展的初始区域。
- Image(输入):输入图像,通常为单通道灰度图像。
- ForbiddenArea(输入):禁止扩展的区域(可选参数,默认值为空)。
- ExpandedRegions(输出):扩展后的区域。
- Iterations(输入):扩展的迭代次数,默认值是'maximal'。
- Mode(输入):扩展模式,决定扩展的规则:(默认值是'image')
'image':基于图像的灰度值进行扩展。
'region':基于区域的灰度值进行扩展。 - Threshold(输入):灰度值差异的阈值,决定像素是否被合并到区域中,默认值32。
实例代码:
python
* 读取图像
read_image(Image, 'example_image.png')
* 获取初始区域(例如通过阈值分割)
threshold(Image, Regions, 100, 200)
* 设置参数
ForbiddenArea := [] // 无禁止区域
Iterations := 10 // 扩展迭代次数
Mode := 'image' // 基于图像的灰度值进行扩展
Threshold := 5 // 灰度值差异阈值
* 区域扩展
expand_gray(Regions, Image, ForbiddenArea, ExpandedRegions, Iterations, Mode, Threshold)
* 显示结果
dev_display(ExpandedRegions)
功能介绍:
- ForbiddenArea:禁止扩展的区域,可以是任意形状的区域。如果不需要禁止区域,可以设置为空([])。
- Iterations:扩展的迭代次数,次数越多,扩展的范围越大。
- Mode:'image':基于图像的灰度值进行扩展,适用于需要根据图像灰度值扩展的场景。'region':基于区域的灰度值进行扩展,适用于需要根据区域灰度值扩展的场景。
- Threshold:灰度值差异的阈值,决定像素是否被合并到区域中。较小的阈值会限制扩展范围,较大的阈值会允许更多像素被合并。
(5) expand_gray_ref
Halcon使用expand_gray_ref算子用于区域扩展,基于参考图像的灰度值相似性对区域进行扩展。与 expand_gray 类似,但它允许使用一个参考图像来指导扩展过程。
算子声明:
expand_gray_ref ( Regions, Image, ForbiddenArea : RegionExpand : Iterations, Mode, RefGray, Threshold : )
参数说明:
- Regions(输入):输入区域,表示需要扩展的初始区域。
- Image(输入):输入图像,可以是单通道灰度图像,也可以是彩色图像。
- ForbiddenArea(输入):禁止扩展的区域(可选参数,默认值为空)。
- ExpandedRegions(输出):扩展后的区域。
- Iterations(输入):扩展的迭代次数。
- Mode(输入):扩展模式,决定扩展的规则:'image':基于输入图像的灰度值进行扩展。'region':基于输入区域的灰度值进行扩展。
- RefGray(输入):用于比较的彩色或者灰度值,默认值128。
- Threshold(输入):灰度值差异的阈值,决定像素是否被合并到区域中,默认值32。
3. 分水岭方法
分水岭算法(Watershed Algorithm)是一种基于形态学的图像分割方法,其灵感来源于地理学中的分水岭概念。它将图像看作地形表面,灰度值代表海拔高度,通过模拟水流从高到低的流动过程,将图像分割成多个独立的区域。分水岭算法在图像分割中具有广泛的应用,尤其适用于目标与背景对比明显的场景。
工作原理 :
- 分水岭算法的核心思想是将图像视为地形表面:
- 高灰度值区域:代表山峰或高地。
- 低灰度值区域:代表山谷或低地。
- 水流模拟:从高灰度值区域向低灰度值区域流动,最终汇聚到局部最小值点(山谷)。
- 分水岭线:水流汇聚的边界线即为分水岭线,用于分割不同的区域。
- 通过这种方式,分水岭算法可以将图像分割成多个独立的区域,每个区域对应一个局部最小值点。
步骤:
- 图像预处理:对输入图像进行平滑处理(如高斯滤波),以减少噪声对分割结果的影响。
- 如果图像是彩色图像,需先转换为灰度图像。
- 计算梯度图像:使用梯度算子(如 Sobel 或 Canny)计算图像的梯度幅值。梯度图像用于表示图像的边缘信息,梯度值越大,代表边缘越明显。
- 标记局部最小值点:在梯度图像中,找到局部最小值点(山谷),这些点将作为区域生长的种子点。可以通过距离变换或手动标记的方式确定种子点。
- 模拟水流过程:从局部最小值点开始,模拟水流从低到高的流动过程。使用形态学操作(如膨胀)逐步扩展区域,直到水流汇聚到分水岭线。
- 生成分水岭线:水流汇聚的边界线即为分水岭线,用于分割不同的区域。分水岭线将图像分割成多个独立的区域。
- 后处理:对分割结果进行后处理,如去除过小的区域或合并相似区域。
优点:
- 无需预设区域数量:分水岭算法能够自动根据图像的局部最小值点生成区域,无需预先指定区域数量。
- 适用于复杂边界:对于具有复杂边界的图像,分水岭算法能够较好地捕捉边缘信息。
- 基于形态学:分水岭算法基于形态学操作,计算过程直观且易于理解。
缺点:
- 过分割问题:分水岭算法容易受到噪声和局部灰度变化的影响,导致过分割(即将一个目标分割成多个小区域)。
- 计算复杂度高:对于大尺寸图像,分水岭算法的计算复杂度较高,耗时较长。
- 依赖预处理:分水岭算法对图像预处理(如平滑和梯度计算)的要求较高,预处理效果直接影响分割结果。
(有关分水岭算法的各个算子的介绍,放在修订版完成)
(初稿完成,最新更新2025-03-05)
本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材基本保持一致。作为学习和实践DIP技术的入门教程。
感谢大家的支持和浏览,本专栏将持续更新(每周至少更新1篇),每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。
在专栏全部完成之前,所有内容将一直免费。