第 10 章 图像分割 (Image Segmentation)
核心结论
-
基础(§10.1):分割定义 / 像素邻接 / 区域 / 边界。
-
点 / 线 / 边缘检测(§10.2):孤立点 / 线检测;边缘检测(Canny / Marr-Hildreth)。
-
阈值处理(§10.3):全局 / 局部 / 自适应阈值;Otsu。
-
基于区域的分割(§10.4):区域生长 / 区域分裂合并 / 分水岭。
-
使用运动的分水岭(§10.5):分水岭变换;过分割问题。
-
聚类与超像素(§10.6):K-means / mean-shift / SLIC 超像素。
-
图割分割(§10.7):Graph Cut / GrabCut;交互式分割。
-
深度学习分割(§10.8):FCN / U-Net / DeepLab / SAM。
|
本章主旨
本章是 DIP 核心任务——图像分割。理解后才能做目标检测 / 识别 / 跟踪的前处理;现代用深度学习(SAM / U-Net)实现 SOTA。 |
一、核心概念
本章围绕 8 个核心概念展开:基础 → 边缘 → 阈值 → 区域 → 分水岭 → 聚类 → 图割 → 深度学习。
| 概念 | 定义 + 重要性 | 实现提示 |
|---|---|---|
基础 |
分割定义 / 邻接 / 区域 / 边界。 |
§10.1;理解分割任务。 |
点 / 线 / 边缘 |
孤立点检测;Canny 边缘。 |
§10.2;传统边缘方法。 |
阈值处理 |
全局 / 局部 / Otsu 自适应。 |
§10.3;简单快速分割。 |
基于区域 |
区域生长 / 分裂合并 / 分水岭。 |
§10.4-§10.5;连通区域分割。 |
聚类与超像素 |
K-means / mean-shift / SLIC。 |
§10.6;预处理 + 后处理。 |
图割分割 |
Graph Cut / GrabCut;交互式。 |
§10.7;交互式分割。 |
深度学习分割 |
FCN / U-Net / DeepLab / SAM。 |
§10.8;当前 SOTA。 |
二、详细笔记
2.1 基础 (Fundamentals)
What:分割定义 / 邻接 / 区域 / 边界。
Why:理解分割任务的基础。
How:
-
分割:把图像分成有意义的区域。
-
像素邻接:4 / 8 / m-邻接。
-
区域:连通像素集。
-
边界:区域的"边缘"。
When:所有分割算法。
Example:医学影像分割(病灶 vs 正常组织)。
2.2 点 / 线 / 边缘检测 (Point / Line / Edge Detection)
What:孤立点 / 线检测;边缘检测。
Why:传统边缘方法;理解后续深度学习。
How:
-
孤立点:邻域差异大 → 点。
-
线:方向性差异大 → 线。
-
Canny 边缘:高斯平滑 + 梯度 + 非极大值抑制 + 双阈值。
-
Marr-Hildreth:高斯-拉普拉斯(LoG)。
When:边缘检测;预处理。
Example*:cv2.Canny(img, 50, 150);cv2.Sobel。
2.3 阈值处理 (Thresholding)
What:全局 / 局部 / 自适应阈值。
Why:简单快速;最常用分割。
How:
-
全局:
T固定。 -
局部:每个像素邻域计算阈值。
-
Otsu:自动找最优全局阈值(最大化类间方差)。
-
自适应:局部均值 / 高斯加权。
When:文档 OCR;简单目标分割。
Example*:cv2.threshold(img, 127, 255, cv2.THRESH_BINARY);cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)。
2.4 基于区域的分割 (Region-Based Segmentation)
What:区域生长 / 区域分裂合并。
Why:连通区域分割。
How:
-
区域生长:从种子像素合并相似邻域。
-
区域分裂合并:先分裂再合并。
-
分水岭:拓扑学方法;易过分割。
When:医学影像;纹理分割。
Example*:skimage.segmentation.flood;skimage.segmentation.watershed。
2.5 使用运动的分水岭 (Watershed with Motion)
What:分水岭 + 运动信息。
Why:解决过分割问题。
How:用帧间运动信息约束分水岭。
When:视频分割;运动目标分割。
Example*:cv2.createBackgroundSubtractorMOG2 + 分水岭。
2.6 聚类与超像素 (Clustering & Superpixels)
What:K-means / mean-shift / SLIC。
Why:预处理 / 后处理;减少超分割。
How:
-
K-means:最小化簇内距离。
-
mean-shift:基于密度梯度。
-
SLIC:K-means 在 CIELab 空间 + 空间约束。
When:预处理;超像素后用分类器。
Example*:skimage.segmentation.slic(img, n_segments=100);sklearn.cluster.KMeans。
2.7 图割分割 (Graph Cut Segmentation)
What:Graph Cut / GrabCut;交互式分割。
Why:交互式分割;高准确性。
How:
-
Graph Cut:图论最小割;能量是子模时全局最优。
-
GrabCut:迭代 EM + Graph Cut;少量交互。
When:交互式分割;Photoshop 抠图。
Example*:cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)。
2.8 深度学习分割 (Deep Learning Segmentation)
What:FCN / U-Net / DeepLab / SAM。
Why:当前 SOTA。
How:
-
FCN(2014):全卷积;上采样恢复分辨率。
-
U-Net(2015):encoder-decoder + 跳跃连接;医学影像标准。
-
DeepLab(2017):atrous convolution + CRF。
-
SAM(2023):基础模型 + promptable。
When:语义分割;实例分割;交互式分割。
Example*:torchvision.models.segmentation.deeplabv3_resnet50;segment-anything 仓库。