第17篇图像分割——从阈值到分水岭算法系列导语本文是有趣的图像处理系列第17篇。边缘检测找到的是边界线形态学操作整理的是形状而图像分割要解决的问题更根本把图像划分为若干有意义的区域每个区域内部的像素在某种属性亮度、颜色、纹理上具有一致性。本篇从最简单的全局阈值出发逐步深入到自适应阈值和分水岭算法。[← 第16篇数学形态学——膨胀、腐蚀与开闭运算] | [第18篇Perlin 噪声——自然感的数学来源 →] | [系列目录]导语图像分割是计算机视觉中最基础也最困难的问题之一。难在哪里同一物体的不同部分亮度可能差异很大光照不均不同物体的像素值可能非常接近颜色相似边界往往模糊而不是一条清晰的线。没有万能的分割算法——每种方法都有自己的假设前提阈值方法假设目标和背景的灰度值能被一个数值分开自适应阈值假设局部区域内目标和背景可以被分开但全局阈值不适用分水岭算法把梯度图看作地形用淹水模型找到分水岭线本文将带你理解这三类方法的数学原理和设计动机。一、全局阈值——最简单的分割1.1 原理最直接的分割思路选一个灰度值T TT大于T TT的像素归为前景白色小于等于T TT的归为背景黑色I out ( x , y ) { 255 I ( x , y ) T 0 I ( x , y ) ≤ T I_{\text{out}}(x,y) \begin{cases} 255 I(x,y) T \\ 0 I(x,y) \leq T \end{cases}Iout(x,y){2550I(x,y)TI(x,y)≤T问题转化为如何选择最优的T TT1.2 手动阈值的局限固定阈值T TT在以下情况会失败光照变化同一物体在不同光照下灰度值不同不均匀背景背景亮度随位置变化直方图没有明显双峰目标与背景灰度分布重叠1.3 伪代码函数 全局阈值(图像 I, 阈值 T): 对每个像素 (x, y): 若 I[y,x] T: 输出[y,x] 255 否则: 输出[y,x] 0 返回 输出左原图 / 右固定阈值T128。亮于128的像素变为白色暗于128的变为黑色花朵高光和背景亮叶被归为前景整体是简单的二值化结果。二、Otsu 阈值——最优全局分割2.1 问题形式化Otsu1979把最优阈值定义为使前景和背景两个类的类间方差最大的那个T TT。类间方差越大说明两类的分离程度越高阈值选得越准。2.2 推导设灰度值为v vv的像素占总像素数的比例为p ( v ) p(v)p(v)即归一化直方图。对阈值T TT将所有像素分为两类类1背景灰度≤ T \leq T≤T概率ω 0 ∑ v 0 T p ( v ) \omega_0 \sum_{v0}^{T} p(v)ω0∑v0Tp(v)均值μ 0 \mu_0μ0类2前景灰度 T TT概率ω 1 1 − ω 0 \omega_1 1 - \omega_0ω11−ω0均值μ 1 \mu_1μ1类间方差σ B 2 ( T ) ω 0 ω 1 ( μ 0 − μ 1 ) 2 \sigma_B^2(T) \omega_0 \omega_1 (\mu_0 - \mu_1)^2σB2(T)ω0ω1(μ0−μ1)2Otsu 最优阈值T ∗ arg max T σ B 2 ( T ) T^* \arg\max_T \sigma_B^2(T)T∗argTmaxσB2(T)遍历所有可能的T ∈ [ 0 , 255 ] T \in [0, 255]T∈[0,255]找使σ B 2 \sigma_B^2σB2最大的那个。2.3 伪代码函数 Otsu阈值(图像 I): # 计算归一化直方图 hist 统计每个灰度值的像素数 / 总像素数 best_T, best_var 0, 0 对 T ∈ [0, 255]: ω0 sum(hist[0..T]) ω1 1 - ω0 若 ω0 0 或 ω1 0: 跳过 μ0 sum(v × hist[v] for v in [0..T]) / ω0 μ1 sum(v × hist[v] for v in [T1..255]) / ω1 σ² ω0 × ω1 × (μ0 - μ1)² 若 σ² best_var: best_var σ² best_T T 返回 全局阈值(I, best_T)计算复杂度O(256)与图像大小无关极快。左原图 / 右Otsu 自动阈值。算法自动找到类间方差最大的阈值约 T85花朵主体被较完整地提取为白色背景暗部为黑色无需手动指定阈值。三、自适应阈值——局部分割3.1 光照不均的问题全局阈值包括 Otsu假设整张图有一个统一的最优T TT。但当图像光照不均匀时左边亮区的背景可能比右边暗区的前景更亮导致一个全局T TT无法同时分割两个区域。自适应阈值的思路对每个像素用其局部邻域计算一个局部阈值而不是用全局值。3.2 局部阈值计算对每个像素( x , y ) (x,y)(x,y)在其W × W W \times WW×W邻域内计算局部统计量作为该像素的阈值T ( x , y ) μ local ( x , y ) − C T(x,y) \mu_{\text{local}}(x,y) - CT(x,y)μlocal(x,y)−C其中μ local \mu_{\text{local}}μlocal局部均值均值自适应或局部高斯加权均值高斯自适应C CC偏移常数补偿前景通常比背景更亮/更暗的先验窗口大小W WW的选择W WW太小对噪声敏感细节区域阈值不准W WW太大失去局部性退化为全局阈值3.3 伪代码函数 自适应阈值(图像 I, 窗口大小 W, 偏移 C): # 计算局部均值图高斯加权 μ_local 高斯模糊(I, σ W/6) # 局部阈值 局部均值 - 偏移 T_map μ_local - C # 逐像素二值化 对每个像素 (x, y): 若 I[y,x] T_map[y,x]: 输出[y,x] 255 否则: 输出[y,x] 0 返回 输出左原图 / 右高斯自适应阈值窗口31C5。局部明暗变化被自动补偿花朵纹理和叶片细节均被提取但背景中也出现了更多细节响应这是局部阈值过度细化的典型表现。四、分水岭算法——基于地形的分割4.1 地形模型的直觉把梯度幅值图想象成地形图梯度大的地方边缘 山脊梯度小的地方均匀区域 山谷从每个局部最低点开始向上注水水位不断上升。当来自两个不同山谷的水即将汇合时在汇合处筑一道坝——这道坝就是分割边界即分水岭Watershed。4.2 标记分水岭Marker-based Watershed原始分水岭对噪声极敏感每个局部极小值都会成为一个区域产生过分割。实用的标记分水岭引入人工标记确定前景标记已知肯定属于目标内部的点如距离变换的局部最大值确定背景标记已知肯定属于背景的点未知区域前景和背景标记的补集注水从标记点出发注水水流到未知区域以分水岭线为边界4.3 基于距离变换的标记生成函数 标记分水岭(图像 I): gray 灰度化(I) # 步骤1获取粗略二值图 T_otsu Otsu阈值(gray) binary T_otsu 0 # 步骤2形态学开运算去噪 opened 开运算(binary, 3×3核, 迭代2次) # 步骤3确定背景膨胀后的区域 sure_bg 膨胀(opened, 3×3核, 迭代3次) # 步骤4距离变换 阈值得前景标记 dist 距离变换(opened) # 每个前景像素到最近背景的距离 sure_fg dist 0.5 × max(dist) # 距离最大的点目标中心 # 步骤5未知区域 unknown sure_bg - sure_fg # 步骤6连通分量标记 markers 连通分量标记(sure_fg) # 每个前景区域一个标签 markers[unknown] 0 # 未知区域标为0 # 步骤7分水岭 结果 cv2.watershed(原图, markers) 边界 (结果 -1) # -1 表示分水岭线 返回 边界, 结果距离变换的作用距离变换给每个前景像素赋值到最近背景的距离目标中心的值最大是稳定的前景标记。左原图 / 右分水岭分割彩色分区 原图半透明叠加。不同颜色代表不同的分割区域红线是分水岭边界算法自动将图像划分为约 115 个连通区域。五、三类方法的对比方法假设优点缺点典型场景固定阈值前背景灰度值可分极简单极快对光照敏感需手动设 T快速原型受控场景Otsu直方图有双峰自动确定 T无需调参光照不均时失败文档二值化、工业检测自适应阈值局部区域可分处理光照不均对噪声敏感参数多扫描文档、自然图像分水岭梯度图类似地形能分割粘连目标过分割需标记辅助细胞计数、医学图像六、实现要点6.1 前处理的重要性分割前的高斯模糊几乎是必须的去噪 → 二值化/梯度计算 → 分割特别是分水岭算法对未去噪的梯度图会产生严重过分割。通常用 σ1–2 的高斯模糊处理。6.2 Otsu 的条件Otsu 在以下情况效果好直方图明显双峰前景和背景灰度范围不重叠前景和背景面积相当各占约 30%–70%当前景面积很小如图像中只有一个小目标时Otsu 可能失效——可以用 Triangle 法OpenCV 的THRESH_TRIANGLE替代。6.3 分水岭的过分割控制减少过分割的方法更强的前处理高斯模糊 形态学开运算更严格的前景标记只取距离变换中 top 20%–30% 的点标记合并相邻的小区域按颜色/纹理相似性合并GrabCut 等方法结语本文完成了形态学与图像分割两篇的最后一篇✅全局阈值最简分割I T I TIT为前景适合受控场景✅Otsu 算法最优化问题——最大化类间方差自动确定T TT无需调参✅自适应阈值逐像素计算局部均值作为阈值处理光照不均✅分水岭算法把梯度图视为地形注水模型找分割边界标记分水岭通过距离变换自动生成前景标记控制过分割至此边缘检测形态学分割三组共五篇14–17构成了完整的图像结构分析体系。下一章进入程序化纹理生成从分析图像转向创造图像。系列文章导航 当前位置第17篇 - 图像分割➡️ 下一篇第18篇 - Perlin 噪声自然感的数学来源 上一篇第16篇 - 数学形态学膨胀、腐蚀与开闭运算 系列首页总览篇标签图像处理图像分割阈值Otsu自适应阈值分水岭距离变换二值化PythonOpenCV本文是有趣的图像处理系列的第17篇所有算法基于 Python OpenCV NumPy 实现完整代码见python_filters/及python_ps/Image Segmentation/。