基础篇11-图像分割(上)--阈值的方法

图像分割是图像处理的重要内容,是位于底层的图像处理、特征提取与上一层次的图像分析之间的关键步骤。图像分割的相关技术较多,分为三篇介绍。本节是上篇,介绍基于阈值的技术。

目录

1 引言

2 基于阈值的分割方法

2.1 全局阈值

(1) threshold

(2) fast_threshold

(3) binary_threshold

(4) histo_to_thresh

(5) threshold_sub_pix

2.2 局部阈值

(1) local_threshold

(2) var_threshold

 (3) dyn_threshold

3 小结


1 引言

图像分割是计算机视觉和图像处理中的核心任务之一,旨在将图像划分为多个具有特定意义的区域或对象。它是许多高级视觉任务(如目标检测、识别、跟踪等)的基础,直接影响后续处理的精度和效果。

图像分割的主要任务是将图像中的像素划分为不同的区域或对象,使得:同一区域内的像素具有相似的特征(如颜色、纹理、强度等);不同区域之间的像素特征差异明显;分割结果与人类视觉感知一致,即分割边界符合实际对象的边界。

图像分割是计算机视觉中的基础任务,传统方法主要基于图像的底层特征,包括阈值法、边缘检测、区域生长、聚类、图论、形态学能量泛函等。这些方法在特定场景下表现良好,但在复杂场景中可能受限于特征表达能力。随着深度学习的发展,基于神经网络的分割方法(如 FCN、U-Net 等)逐渐成为主流,但传统方法仍具有重要的理论和应用价值。

(1) 基于阈值的分割

  • 原理:根据像素的灰度值或颜色值设置一个或多个阈值,将图像分为不同的区域。
  • 方法:全局阈值法(如 Otsu 算法)、局部阈值法(自适应阈值)
    特点:简单高效,适用于背景和前景对比明显的图像。

(2)基于边缘的分割

  • 原理:通过检测图像中的边缘(即像素值剧烈变化的位置)来划分区域。
  • 方法:Canny 边缘检测、Sobel 算子、Prewitt 算子
  • 特点:适合边缘清晰的图像,但对噪声敏感。

(3) 基于区域的分割

  • 原理:根据像素的相似性将图像划分为多个区域。
  • 方法:区域生长法(从种子点开始,逐步合并相似像素)、分裂合并法(将图像不断分裂为子区域,再合并相似区域)
  • 特点:适合纹理复杂的图像,但计算复杂度较高。

(4) 基于聚类的分割

  • 原理:将像素视为数据点,通过聚类算法(如 K-means)将像素分组。
  • 方法:K-means 聚类、Mean Shift 聚类、
  • 特点:适合颜色或纹理分布明显的图像,但对初始参数敏感。

(5)基于图论的分割

  • 原理:将图像表示为图结构,利用图割算法(如 GraphCut)划分区域。
  • 方法:GraphCut、GrabCut
  • 特点:适合交互式分割,计算复杂度较高。

(6)基于形态学的分割

  • 原理:利用形态学操作(如膨胀、腐蚀、开运算、闭运算)提取目标区域。
  • 方法:形态学梯度、分水岭算法
  • 特点:适合目标形状规则的图像,但对噪声敏感。

(7) 基于能量泛函的分割

  • 原理:通过最小化能量函数(如活动轮廓模型)来优化分割边界。
  • 方法:主动轮廓模型(Snake 模型)、水平集方法(Level Set)
  • 特点:适合目标边界复杂的情况,但计算复杂度高。

基础篇将重点介绍前三类方法。其他部分分割方法,将在应用篇介绍。

2 基于阈值的分割方法

基于阈值的图像分割是一种简单而高效的图像分割技术,广泛应用于图像处理领域。其核心思想是通过设置一个或多个阈值,将图像的像素根据灰度值或颜色值划分为不同的区域,从而实现目标与背景的分离。

基于阈值的分割方法可以根据阈值的选择方式分为:全局阈值法、局部阈值法(自适应阈值法)和多阈值法。

功能特性:

  • 优点:简单高效:计算复杂度低,适合实时处理。易于实现:算法直观,参数少,易于理解和实现。适用性广:在背景和前景对比明显的场景中效果良好。
  • 缺点:对噪声敏感:图像中的噪声可能导致分割结果不准确。依赖灰度分布:对于灰度分布重叠或光照不均匀的图像,分割效果较差。阈值选择困难:在某些复杂场景中,自动选择最佳阈值具有挑战性。

2.1 全局阈值

(1) threshold

Halcon中的threshold算子用于图像二值化处理,根据灰度值将图像分割为前景和背景。

算子声明:

threshold(Image : Region : MinGray, MaxGray : )

参数说明

  • Image(输入):输入图像,通常为灰度图像。
  • Region(输出):输出区域,包含满足灰度值条件的像素。
  • MinGray(输入):灰度值下限,大于或等于该值的像素被选中,默认值128。
  • MaxGray(输入):灰度值上限,小于或等于该值的像素被选中,默认值255。

注意事项

  • 灰度范围:MinGray 和 MaxGray 的选择影响分割效果,需根据图像特性调整。
  • 图像类型:threshold 适用于灰度图像,彩色图像需先转换为灰度图像。

(2) fast_threshold

Halcon使用fast_threshold算子用于快速阈值分割。它通过指定一个灰度值范围和最小区域大小来快速提取图像中满足条件的区域。

与 threshold 算子相比,fast_threshold 的计算效率更高,适合处理大图像或实时应用。

算子声明

fast_threshold ( Image : Region : MinGray, MaxGray, MinSize : )

参数说明

  • Image(输入):输入图像,通常为灰度图像。
  • Region(输出):输出区域,包含满足灰度值条件的像素。
  • MinGray(输入):灰度值下限,大于或等于该值的像素被选中,默认值128。
  • MaxGray(输入):灰度值上限,小于或等于该值的像素被选中,默认值255。
  • MinSize(输入):区域的最小像素大小,小于此值的区域会被过滤掉,默认值是20。

注意事项

  • 最小区域大小:MinSize 的设置可以避免提取到过小的噪声区域。
  • 效率:fast_threshold 适合处理大图像或实时应用,但精度可能不如 threshold 算子高。

 实例

* 读取图像
read_image(Image, 'example_image.png')

* 应用threshold算子
threshold(Image, Region1, 128, 200)
* 使用 fast_threshold 提取区域
fast_threshold(GrayImage, Region2, 100, 200, 50)

* 显示原图和分割结果
dev_display(Image)
dev_display(Region1)
dev_display(Region2)

(3) binary_threshold

Halcon使用binary_threshold算子用于二值化处理的算子,能够根据灰度值将图像分割为前景和背景

算子声明:

binary_threshold(Image : Region : Method, LightDark : UsedThreshold)

参数说明

  • Image(输入):待处理的灰度图像。
  • Region(输出):分割后的二值区域。
  • Method(输入):分割方法,常用 'max_separability' 和 'smooth_histo',默认值是前者。
  • LightDark(输入):指定提取亮或暗区域,'light' 提取亮区域,'dark' 提取暗区域,默认值是'dark'。
  • UsedThreshold(输出):实际使用的阈值。

      (4) histo_to_thresh

      Halcon使用histo_to_thresh算子用于根据图像的灰度直方图自动计算阈值的一个算子。

      它通过分析图像的灰度分布,确定一个合适的阈值,用于后续的图像分割操作。这个算子特别适用于需要自动确定阈值的场景。

      算子声明

      histo_to_thresh ( : : Histogramm, Sigma : MinThresh, MaxThresh )

      参数说明

      • Histogram(输入):输入图像的灰度直方图,通常通过 gray_histo 或 gen_histo 算子生成。
      • Sigma(输入):高斯平滑参数,用于平滑直方图,减少噪声对阈值计算的影响,默认值是2.0。
      • MinThresh(输出):最小阈值。
      • MaxThresh(输出):最大阈值。

      注意事项

      • Sigma:高斯平滑参数,用于平滑直方图。较大的 Sigma 值会使直方图更平滑,减少噪声的影响,但可能会丢失一些细节;较小的 Sigma 值会保留更多细节,但可能对噪声更敏感。通常取值范围为 1.0 到 5.0。
      • 阈值适用范围:histo_to_thresh 适用于单峰或双峰直方图,对于复杂的多峰直方图,可能需要手动调整阈值。
      • 后续处理:计算得到的阈值可以用于 threshold、binary_threshold 等算子进行图像分割。

      (5) threshold_sub_pix

      Halcon使用threshold_sub_pix算子用于执行子像素精度的阈值分割。

      使用threshold_sub_pix算子以亚像素精度提取输入图像中灰度值为 Threshold 的水平交叉点。提取的水平交叉点以 XLD 轮廓的形式返回到 Border 中。

      与 threshold 算子不同,threshold_sub_pix 并不返回区域,而是返回将灰度值小于 Threshold 的区域与灰度值大于 Threshold 的区域分隔开的线条。该算子能够更精确地确定图像中对象的边界,相比于传统的像素级阈值分割,它提供了更高的精度。

      算子声明

      threshold( Image : Border : Threshold : )

      参数说明

      • Image(输入):输入图像,通常为灰度图像。
      • Border(输出):提取出的水平交叉点。
      • Threshold(输入):阈值,默认值128

      2.2 局部阈值

      (1) local_threshold

      Halcon使用local_threshold用于局部阈值分割的算子,能够根据图像的局部特性进行自适应二值化处理。

      算子声明

      local_threshold ( Image : Region : Method, LightDark, GenParamName, GenParamValue : )

      参数说明

      • Image(输入):待处理的灰度图像。
      • Region(输出):分割后的二值区域。
      • Method(输入):局部阈值分割方法,常用方法包括:
        'adapted_std_deviation':基于局部标准差的自适应阈值。
        'mean':基于局部均值的阈值。
        'median':基于局部中值的阈值。
      • LightDark(输入):指定提取亮或暗区域:'light':提取亮区域。'dark':提取暗区域。
      • GenParamName(输入):输入参数名列表,输入的参数包括'mask_size'模板大小、'scale'尺度系数、'range'范围。
      • GenParamValue(输入):输入参数对应的数值。

      (2) var_threshold

      Halcon使用var_threshold用于基于局部方差进行阈值分割,适用于光照不均匀或背景复杂的图像。它通过计算局部区域的均值和方差来动态确定阈值,从而实现更鲁棒的图像分割。

      算子声明

      var_threshold ( Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )

      参数说明

      • Image(输入):待处理的灰度图像。
      • Region(输出):分割后的二值区域。
      • MaskWidth, MaskHeight(输入):局部区域(掩模)的宽度和高度,用于计算局部均值和方差。
      • StdDevScale(输入):标准差的缩放因子,用于调整阈值计算的灵敏度。
      • AbsThreshold(输入):绝对阈值,用于进一步限制分割结果。
      • LightDark(输入):指定提取亮或暗区域:'light':提取亮区域。'dark':提取暗区域。

      实例

      * 读取图像
      read_image(Image, 'example_image.png')
      
      * 基于局部方差的阈值分割
      var_threshold(Image, Region, 15, 15, 0.2, 5, 'light', UsedThreshold)
      
      * 显示结果
      dev_display(Region)

      参数选择

      • MaskWidth, MaskHeight:掩模大小应根据目标区域的大小选择。较大的掩模适合大目标,较小的掩模适合小目标。
      • StdDevScale:标准差缩放因子控制分割的灵敏度,值越小,分割越严格。
      • AbsThreshold:绝对阈值用于过滤噪声,值越大,分割结果越少。

      (3) dyn_threshold

      Halcon使用dyn_threshold算子用于动态阈值分割的算子,适用于处理光照不均匀或背景变化的图像。它通过将原始图像与参考图像进行比较,并根据设定的阈值范围提取目标区域。

      算子声明

      dyn_threshold(OrigImage, ThresholdImage : Region : Offset, LightDark : )

      参数说明

      • OrigImage(输入):原始灰度图像。
      • ThresholdImage(输入):参考图像(通常是通过平滑或滤波处理后的图像)。
      • Region(输出):分割后的二值区域。
      • Offset(输入):阈值偏移量,用于调整分割的灵敏度。
      • LightDark(输入):指定提取亮或暗区域:
        'light':提取比参考图像亮的目标区域。
        'dark':提取比参考图像暗的目标区域。
        'equal':提取与参考图像亮度相近的区域。
        'not_equal':提取与参考图像亮度差异较大的区域。

      实例

      * 读取图像
      read_image(OrigImage, 'example_image.png')
      
      * 生成参考图像(平滑处理)
      mean_image(OrigImage, ThresholdImage, 31, 31)
      
      * 动态阈值分割
      dyn_threshold(OrigImage, ThresholdImage, Region, 10, 'light')
      
      * 显示结果
      dev_display(Region)

      参数选择

      • 参考图像:参考图像通常是对原始图像进行平滑或滤波处理后的结果,用于模拟背景或光照变化。
      • Offset:阈值偏移量控制分割的灵敏度,值越大,分割结果越多。
      • LightDark:根据目标区域的亮度特性选择合适的模式。

      3 小结

      本节介绍了几类常用的阈值化方法,包括全局阈值、局部阈值和多阈值方法。

      (草稿完成,最新更新2025-02-27)

      本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材基本保持一致。作为学习和实践DIP技术的入门教程。

      感谢大家的支持和浏览,本专栏将持续更新(每周至少更新1篇),每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。

      在专栏全部完成之前,所有内容将一直免费。

        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值