本节摘要:图像分割把一幅图切成互不重叠、合起来又刚好铺满整图的区域,并让每个像素拿到一个类别或实例标签。它不是美化图像,也不是只描边缘,而是给后续测量、识别、控制提供像素级工牌。
阅读完本节,你应当能够:
检测给框,分类给整图标签。框里往往掺着背景,整图标签说不清肿瘤长在哪。分割要的是:这个像素是肝脏还是血管,这条车道线宽几个像素,这颗螺丝的缺口从哪一列开始。裁缝画样就是这件事——先在布上画出衣片,剪错一厘米,后面再精致的缝法也补不回料。
医学里,医生要的是病灶体积随疗程怎么变,不是「这张片子里好像有个肿块」。自动驾驶里,可行驶区域差两个像素,轮子可能压到路沿。工业质检里,划痕面积决定报废还是返工。这些数字只能从像素级区域来。
所以动手的第一天不要打开网络。先问:我要把哪些像素从其余像素里分出来?分出来之后谁用?用它算面积、当控制输入,还是只为了好看的叠加层?三个问题答不清,标注员会按自己的审美画,模型会按标注的偏见学。
原图 ──► 每个像素一张工牌 ──► 区域列表或轮廓 │ ├─ 工牌可以是类别名(语义) └─ 工牌可以是「第几号物体」(实例)
原文把分割写成:把图像 I 分成 n 个区域 R1 到 Rn,满足四条。动手时把它们当成验收清单,而不是考试默写。
| 条件 | 人话 | 掩码上怎么检查 |
|---|---|---|
| 所有区域的并集等于整图 | 没有像素没工牌 | 标签图里不允许出现未定义的空值,背景也要有 id |
| 任意两块互不重叠 | 一个像素不能同时是肝又是肾 | 单通道整数掩码天然互斥;多通道独热必须每像素只亮一维 |
| 同一块内部满足相似性 | 这块里的像素「像一类」 | 颜色、纹理、语义标签在业务上可解释 |
| 相邻两块合并不再相似 | 边界两边确实不该是一类 | 若两块只因标注员手抖断开,应合并规则 |
第四条最容易被忽略。标注员沿纹理多画了一条缝,模型会认真学习那条假边界。抽检时不要只看「有没有漏标」,还要看「有没有切得过碎」。
相似性谓词 P 在传统方法里是灰度差、颜色距离;在深度学习里是「网络认为属于同一类」。谓词换了,四条结构没换。这也是为什么第 3 章的阈值和第 5 章的 U-Net 能接到同一套管线:输出都是一张合法掩码。
分割吃前面步骤的结果,但前面步骤替代不了分割。滤波不会给像素发工牌,边缘只告诉你「这里可能是边界」,不保证围成封闭区域。
增强改变观感:拉对比、伽马校正,内容类别不变。滤波抑制噪声或平滑,像素值变了,语义标签仍未诞生。边缘检测找梯度大的位置,得到的是细线,常常断、常常有毛刺。分割要的是区域。你可以先增强再滤波再找边缘,最后用边缘当区域生长的停止条件,但最后那一步必须发生。
⚠️ 常见坑:把 Canny 的线当成分割交卷。线不是区域。下游若要面积,必须先把线连成闭合轮廓再填充,或改用区域类方法。
💡 关键直觉:边缘是「墙在哪」,分割是「房间归谁」。有墙仍可能没把房契办好。
工业现场常见一种偷懒:阈值得到二值图,直接当分割。若背景均匀、目标对比强,这确实合法——二值图满足覆盖与互斥。一旦光照渐变,同一类灰度漂到阈值两侧,四条里的「区内相似」在业务上仍成立,在灰度谓词上却失败。这时不是「分割定义错了」,是你选的谓词太弱,该换自适应阈值或学习特征。
不要等数据集。用数组造一张 64 边长的图:左边一块亮、右边一块暗,中间一条斜边界。你的「分割」就是按列号或按灰度切开。检查:每个位置都有 0 或 1;没有像素同时为 0 和 1;左块内部灰度接近;边界两侧差得足够大。
import numpy as np h, w = 64, 64 img = np.zeros((h, w), dtype=np.uint8) img[:, :32] = 40 img[:, 32:] = 200 # 斜边界:让右半略侵入左半,模拟真实物体 for y in range(h): cut = 28 + y // 8 img[y, cut:] = 200 mask = (img > 120).astype(np.int64) print("覆盖检查", mask.size == h * w) print("标签集合", np.unique(mask)) print("前景占比", mask.mean())
这段不读任何外部文件,却已经在练习第 2 章加载器要保证的事:掩码与图同高同宽,标签是整数,前景占比可打印。若你连这种玩具都对不齐,后面读真实标注时更会对不齐。

目标提取:把感兴趣对象从背景拿出来。脑部磁共振里的肿瘤、卫星图里的道路,都是这一行。简化表示:几百兆原图变成几万个区域编号,后面的分类器或规则引擎才跑得动。语义理解:每个像素带类别名,场景才能被语言描述。测量分析:面积、周长、圆度、质心,质检和疗效评估靠它们。
同一项目往往占多行。自动驾驶同时要可行驶区域(提取)和「那是行人」(语义)。不要只写「做分割」,写你要哪几行。后两行决定指标:只要叠加好看,像素准确率就够骗人;要体积,必须上 Dice 或交并比。
应用面很宽:器官与细胞、道路车辆行人、土地利用、表面缺陷、监控里的运动目标。饼图比例没有普适真理,别背「医学占四分之一」这种展示数字。你的项目只需要写清自己的那一块。
形式定义要求并集等于整图,工程上常用「背景也是一类」来满足。若产品只关心裂纹,仍建议把其余像素标成背景,而不是留空值。空值会在损失里变成未定义行为。忽略 id 是第三种合法状态:算损失时跳过,不参加梯度,也不冒充背景。
超像素是把图预先切成几百块均匀小片,降低后续算法的节点数,本身通常没有业务类别名。抠图要半透明和发丝,输出往往是连续 alpha,不是互斥整数标签。分割教程里的掩码默认互斥离散。需要发丝时,任务书要另写,不要用 mIoU 假装已经覆盖。
细到业务伤害所要求的那一层。放疗勾画可能要到毫米级结构;仓储只要托盘外接形状。规范里写「最小标注面积」和「边界内收还是外扩」。两人抽检差在这一圈时,不是模型的事,是法律没写清。
把第 1.1 节的四条打印贴在标注工位旁:铺满、不重叠、区内像一类、邻块不该合并。新来的标注员第一天用这四条检查自己的第一张图,比听一小时概念课有效。下一节会把「像一类」进一步分成要不要数个数。
把四条合法性抄进检查表,用第 2 章那 30 对试标逐张过:有没有未定义像素、有没有一像素两标签、区内是否真的像一类、该不该合并的缝有没有被手抖切开。过不了的图进隔离,不进训练。隔离原因写成枚举:漏标、过碎、错类、错位。枚举会在第 6 章变成清洗规则。形式定义因此不再是考试默写,而是工位墙上的四句话。
和增强、滤波、边缘的串联也写成检查表的附注:增强之后类别不得变;滤波之后细目标宽度仍大于形态学核;边缘若当输入,最终仍须封闭成区域才能算面积。下游要体积时,交卷物必须是区域。有人用边缘图交卷再在汇报里除以「线宽」冒充面积,口径一经追问就垮。把「交卷是区域」写进第 1.3 节验收卡的同一页,避免两章各说各话。
动手作业:用本节玩具数组改斜边界斜率,观察掩码是否仍满足互斥与铺满。这是后面仿射变换后断言的预习。做完再进 1.2,否则三种任务的接口差异会建立在模糊的掩码概念上。
检查表过完,选一张「过碎」的图开会:那条缝是业务要的还是手抖。结论写回规范「何种纹理允许合并」。这比再讲一遍定义有用。玩具斜边界实验做完,把代码留在加载器测试里,仿射之后还跑同一断言。定义、检查表、单元测试三条线拧在一起,1.1 才算从概念变成纪律。
把检查表做成加载器测试的注释原文,防止文档与代码各改各的。过碎图的会议结论必须回写成「允许合并的纹理类型」 enumeration,否则下次抽检仍会吵。玩具斜边界与真实多边形栅格化共用断言函数,一份实现两处调用。谁改断言,两处一起变。这就是把形式定义变成纪律的最后一钉。
工位墙上的四句话要能口头复述,不能只贴海报。抽检时随机指一张图,标注员须指出哪一像素违反了铺满、互斥、区内相似或邻块可分。答不上来,当天停标,开规范会而不是加训练轮数。玩具斜边界实验的断言函数名写进加载器测试清单,仿射变换后必须再跑同一条,防止「定义只在第 1.1 节有效」。
下一节把工牌系统分成三种:只认类别、要认个体、以及两者同时要。选错一种,标注成本和模型家族会整条路走偏。