第五章 图像分割⚓
本章概述
图像分割的目标,是将图像分为构成它的子区域或对象。将图像划分为多个图像子区域,即对每个像素加标签的过程,使得具有相同标签的像素具有某种共同的视觉特性。
特点:输入是一幅图像,输出是从该图像中提取出的区域属性,即区域边界。
图像分割的技术领域:
- 人脸识别、表情识别、指纹识别等。
- 图像搜索、图像压缩编码等。如图像编码:ROI编码,MPEG4/MPEG7。
- 立体视觉重建、三维模型重建。
- 机器视觉、物体检测等视觉问题。
- 医学图像:肿瘤和其它病理定位、组织体积的测量。
- 医学诊断:组织提取,细胞分割。
- 交通控制系统:路况勘察和路标识别等。
- 卫星图像:定位道路、建筑物、农作物森林等。
- 工业检测:零件识别、机械组装、基于机器视觉的破损检测。
- 军事侦察:红外图像目标,物体目标检测。
- 公共安全:侵入、越界目标检测,生物特征识别,交通监控。
传统图像分割的两种方法:
- 边缘方法:假设图像分割结果的某个子区域,在原来图像中一定会有边缘存在。
- 区域方法:假设图像分割结果的某个子区域一定具有相同的性质,而不同区域的像素没有共同性质。
实际应用中,这两种方法各有优缺点,可以考虑把边缘法和区域法结合起来进行图像分割。
随着计算机处理能力的提高,新方法不断涌现,如:基于彩色分量分割,纹理图像分割,运动目标分割,深度学习像素分割等。
语义分割简介:
传统方法只对图像进行二值分割,但不能获得分割结果的语义信息。语义分割是计算机视觉中的基本任务,在语义分割中我们需要将视觉输入分为不同的语义可解释类别,“语义的可解释性”即分类类别在真实世界中是有意义的。常用数据集为 Pascal VOC 2012, PASCAL Context, Cityscapes, Stanford Background Dataset 等。
实例分割,在语义分割的基础上还需要将同一语义类别的不同个体区分开来,即做到每个实例的分割。常用数据集为 MS COCO。
5.1 边缘检测和边缘连接⚓
边缘像素是图像中灰度突变的像素。边缘是连接边缘像素的集合。因此对于边缘检测,最有效的方法是检测灰度级的变化。
理想边缘模型中,每个像素都处在灰度跃变的垂直台阶上。但实际边缘由于噪声干扰,边缘模型为具有“类斜面”的剖面,边缘为一组彼此相连的点集,边缘宽度取决于斜坡长度。
一阶导数:
一阶导数的幅度可用于检测图像中某个点处是否存在一个边缘,通常在图像中产生较粗的边缘。
二阶导数:
对精细的细节如孤立点、细线和噪声有较强的响应;在灰度斜坡和灰度台阶过渡处会产生双边缘响应;二阶导数的符号可以用于确定边缘像素是在边缘亮的一侧还是暗的一侧;二阶导数的零交叉点可用于定位粗边缘的中心。
使用阈值法:如果一个点的二维一阶导数大于指定阈值,则此点为图像中的边缘点。
一阶梯度算子:
Robert 算子 \(|\nabla f| \approx |z9-z5|+|z8-z6|\) 。定位比较精确,但由于不包括平滑,所以对于噪声比较敏感。
Sobel 算子,有 x 和 y 两个方向模板(这里 x 方向为竖直方向),能够较好地抑制噪声。
二阶梯度算子:
Laplace 算子。对噪声敏感,常产生双像素宽的边缘,很少直接用于边缘检测。可用于孤立点、细线的检测,及已知边缘像素后确定该像素是在亮的一侧还是暗的一侧。
使用 Laplace 算子检测孤立点,模板:
若某点处该模板的响应的绝对值超过阈值 T,则认为此时模板中心位置为孤立点。将孤立点标注为1,其余点标注为0,得到二值化输出图像。
Note
一阶、二阶导数都对噪声很敏感,但往往二阶导数更加敏感。应用微分算子之前要预处理,如平滑去噪。
边缘点通常被定义为灰度值发生显著变化的地方,但这种变化可以是多种形式的,不一定是垂直台阶,也可能是平滑渐变。
Canny 边缘检测算子⚓
思路:平滑后求导,有粗到细。
主要步骤:
- 高斯滤波平滑。
- 计算梯度的幅值图像和角度图像,\(M(x,y)=\sqrt{G_x^2+G_y^2},\; \alpha(x,y)=\arctan(G_y/G_x)\) 。
- 对梯度幅值进行非极大值抑制(NMS),细化边缘。非极大值抑制首先要指定边缘法线的许多离散方向,并为每个方向定义角度范围。如对于水平边缘法线,可定义其方向角范围为 \(-157.5^\circ\sim+157.5^\circ\) 和 \(-22.5^\circ\sim+22.5^\circ\) 。可扩展以定义水平、垂直、 \(+45^\circ\) 、 \(-45^\circ\) 四种边缘法线的离散方向。 对某一个像素点,找到最接近 \(\alpha(x,y)\) 的方向 \(d_k\) ,若该点梯度幅值 \(M(x,y)\) 大于沿 \(d_k\) 方向上的两个邻居,则 \(g_N(x,y)=M(x,y)\) 幅值保持,否则置 \(g_N(x,y)=0\) 抑制。由此得到非极大值抑制后的图像 \(g_N(x,y)\) 。
- 双阈值算法检测与边缘连接: \(g_{NH}(x,y)=g_N(x,y)\geqslant T_H, g_{NL}(x,y)=g_N(x,y)\geqslant T_L\) 。
Hough 变换⚓
霍夫变换,用于检测直线,经过一个点 \((x_i,y_i)\) 的直线对应参数空间的一个点 \((a,b)\) ,x-y 平面内同一条直线上所有点,在参数空间中都经过同一点 \((a,b)\) ,根据此原理检测直线。将参数空间分割为累加器单元,累加器的值超过某一阈值则认为存在直线。
使用前述直角坐标方程时,如果直线接近竖直方向,则 \(a,b\) 的值都可能趋向无穷大而是计算量大增(因为累加器尺寸将会很大)。可以采用极坐标方程 \(x\cos\theta+y\sin\theta=\rho\) ,在 \(\rho,\theta\) 参数空间构造累加器。
Hough 变换检测到的直线并不一定可靠,受到噪声、分辨率、变换参数等因素影响,可能检测到不存在的直线。
补充知识: Hough 圆变换
Hough 圆变换进行圆检测,与直线检测原理类似。直线用2个参数表示,而圆 \((x-a)^2+(y-b)^2=r^2\) 需要3个参数 a,b,r。
经过 \((x_0,y_0)\) 的所有圆,在 \(a-b-r\) 三维参数空间中对应曲线 \(a=x_0-r\cos\theta, b=y_0-r\sin\theta\) 。对图像中所有的点进行上述操作,如果两个不同点得到的曲线在空间 \(a-b-r\) 相交, 代表它们在同一个圆上。如果交于一点的曲线的数量超过阈值, 则认为这个交点所代表的参数 \((a,b,r)\) 在原图像中为一个圆。
上述标准做法在三位参数空间中计算消耗大,OpenCV 霍夫圆变换使用“霍夫梯度法”进行优化,只在二维数组中进行峰值检测,避免在三维参数空间中进行搜索:
- 边缘检测:首先对图像应用边缘检测,获取梯度信息,如 Canny, Sobel 算子等。
- 霍夫累加器:遍历边缘点,根据其梯度方向,通过增量搜索找到与该点梯度方向相符的可能圆心位置,(沿梯度方向划线)有一个线经过某点,累加器相应加1,得到一个二维累加器数组。
- 峰值检测:在霍夫累加器数组中,寻找高于预设阈值的峰值,每一个峰值代表一个可能的圆心位置。
- 确定半径:计算边缘点距离圆心的距离,距离从小到大排序,选取范围内的半径,对选取的半径设置累加器,对于满足半径 r 的累加器+1,在累加器中寻找大于预设阈值的对应半径。
RANSAC⚓
随机抽样一致(RANSAC, RANdom SAmple Consensus),通过使用观测到的数据点来估计数学模型参数的迭代方法。可用于拟合含有噪声数据集的模型,可应用于平面直线拟合、图像拼接。基本假设:
- 样本中包含正确数据(inliers,符合模型的数据)和异常数据(Outliers,不符合模型的数据),即数据集中含有噪声。
- 给定的一组数据,存在可以计算出符合这些数据的模型参数的方法。
通过反复选择数据中的一组随机子集来达成目标。算法步骤:
- 随机选择一些原始数据作为假设 inliners 子集。
- 基于现有 inliners 子集进行模型拟合。
- 用其他数据来验证,根据错误率来判断其是否符合该模型。
- 若足够多的点都符合模型,则对该模型进行新一次模型拟合。
- 重复步骤1-4,得到多个模型,在所有模型中舍弃 inliners 点太少的模型,再选用 inliners 与模型的正确率最高的。
边缘连接⚓
理论上,边缘检测应该仅产生处在边缘上的一组像素点。由于噪声、不均匀照明产生的边缘间断、以及其他虚假亮度间断产生的影响,使得到的一组像素很少能完整地描绘一条边缘。因此,需要采用连接处理,将边缘像素点组合成有意义的边缘。
使用“局部处理”方法:
是分析每一个边缘点 (x,y) 的一个邻域(3×3,5×5)内像素的梯度特性(如强度、方向),然后依据事先预定的准则,连接相似的边缘点,形成由共同满足准则的像素组成的一条边缘。
确定边缘点相似性的两个主要性质:
- 用于生成边缘点的梯度算子的强度。中心点 \((x_0,y_0)\) 邻域内,中心点与其他点梯度值之差小于某个阈值 \(|\nabla f(x,y)-\nabla f(x_0,y_0)|\leqslant E\) ,则认为幅度上相似。
- 梯度向量的方向。梯度向量的方向角只差小于某个阈值 \(|\alpha(x,y)-\alpha(x_0,y_0)|\leqslant A\) ,其中 \(a(x,y)=\arctan (G_y/G_x)\) ,则认为角度上相似,且 \((x,y)\) 处的边缘方向垂直于此点处的梯度向量方向。
5.2 阈值处理⚓
全局阈值。使用单一的一个全局阈值,一般取图像灰度级最大值和最小值的均值,大于阈值设为白,小于阈值设为黑,得到二值图像。
迭代确定阈值法:
- 选择一个阈值 T 的初始值。
- 用 T 分割图像,获得2组像素 \(G_1\) (灰度大于 T)和 \(G_2\) (灰度小于 T)。
- 计算区域 \(G_1,G_2\) 中所有像素平均灰度 \(g_1,g_2\) 。
- 计算新阈值 \(T=(g_1+g_2)/2\)
- 重复步骤2至4,直到逐次迭代所得的 \(T\) 值之差小于某参数 \(T_0\) 。
大津算法(最大类间方差法)。思想:类间方差最大,类内方差最小。判决准则 \(\eta(t) = 1-\dfrac{\sigma_\omega^2}{\sigma_T^2}\) ,最佳阈值 \(t\) 为(等效于使类间方差最大的阈值): \(t^*=\underset{0\leqslant t\leqslant L-1}{\argmax}\ \eta(t)\) 。
自适应阈值算法。划分子图像,不同子图像使用不同阈值。由于每个像素使用的阈值,取决于像素在子图像中的位置,所以这类阈值处理是自适应的。重点在划分图像,可以与大津算法、迭代阈值法等结合使用。
不同阈值分割方法对比分析:
算法名称 | 优点 | 缺点 |
---|---|---|
全局阈值 | 适用于直方图呈现明显双峰的情况。 | 不适用于直方图中双峰差别大或者双峰间谷比较宽广而平坦的图像,以及单峰直方图的情况。 |
大津算法 | 算法较为简单,适用于类间方差为单峰的图像。 | 只能针对单一目标分割,或者感兴趣的目标都属于同一灰度范围。若需探测目标灰度范围分布较大,则必将有一部分目标探测丢失 |
自适应阈值 | 适用于当目标与背景的大小比例悬殊时(例如受光照不均、反光或背景复杂等因素影响)而使类间方差准则函数可能呈现双峰或多峰情况 | 其对于子区域分割的标准要求较高,只有划分出适宜的子区域,才可以得到较好的分割结果。 |
5.3 基于区域的分割⚓
基于区域的分割:以直接寻找区域为基础的分割方法。
区域生长法⚓
根据事先定义的准则,将像素或子区域聚合成更大区域。基本方法:以一组“种子”点开始,将与种子性质相似(如灰度或颜色)的相邻像素附加到生长区域的每个种子上,在没有像素满足加入某个区域条件时,生长停止。该方法要求图像有连通特性,并且终止规则的制定需要谨慎。
示例:在焊缝检测中的应用。
- 应用中已知有缺陷的焊缝像素为最大灰度值,因此取所有255像素为起点。
- 添加任何与种子间灰度差小于某个数(此数字根据直方图得来)的像素。添加入每一个区域的像素必须至少与此区域中一个像素是8连通的。如果某个像素与多于一个区域相联系,就将这些区域合并。
区域拆分-合并法⚓
在开始时将图像分割为一系列任意不相交的区域,然后通过一定的规则,对它们进行聚合合并或分拆,以满足相应条件。典型方法:四叉树分割法。
分水岭算法⚓
目标是找到一个合理的区域分割算法。
- 精准:分割算法能够尽可能精准地分离出图像的不同区域。
- 简洁:分割得到的区域数目尽量少,防止图像中的同一个物体被错分为多个物体,产生没有必要的亚像素块。
从局部极低点开始注水淹没,不同水源升高到一定程度后会连接,在中间水坝(即分水岭),则图像将被分水岭划分为多个集水区域。最后的分水岭即为图像的分割线。
算法步骤:
Step 1: 确定集水区域和水位始末值
- 求出图像局部极小点 \(M_1, M_2, ..., M_n\),对应集水区域 \(C(M_1), C(M_2), ..., C(M_n)\)(像素点集合)。
- 求出图像全局最小值 \(h_{min}\) 和全局最大值 \(h_{max}\),水位 \(h\) 从 \(h_{min}\) 开始上涨,达到 \(h_{max}\) 时结束。
Step 2: 开始注水
- 逐步升高水位 \(h \to h+1\),每次升高后将灰度值等于当前水位的像素点加到距离最近的集水区域中。
- 采用灰度值的测地线距离:如点 A 到 \(C_h(M_1)\) 的测地线距离 \((d_{11}+d_{12})\) ,大于点 A 到 \(C_h(M_1)\) 的测地线距离 \(d_2\) ,相当于 A 到 \(M_1\) 要先翻过山才能过去,距离更远,因此将点 A 加入到 \(C_{h+1}(M_2)\) 中。
Step 3: 形成分水岭
- 随着水位 \(h\) 的上升,当某些像素点到不同集水区域的距离相等时,对应的集水区域发生汇聚,此时需要设置分水岭阻止其汇聚。
- 水位为 \(h+1\) 时两个集水区域发生汇聚形成水域 \(C\) ,则对水位 \(h\) 淹没区域进行膨胀,依次对两个集水区域进行膨胀,直到完全覆盖水域 \(C\) ;每次标记膨胀区域的交点,位于 \(C\) 内的交点即为分水岭。
分水岭算法得到的是输入图像的不同集水盆地之间的边界(分水岭)。显然,分水岭表示的是图像的极大值点。因此,如果将图像的梯度图作为输入,那么得到的分水岭将是原图像的边缘信息,即不同区域的精准分割。
改进:基于标记的分水岭算法。因为直接使用分水岭算法会导致过度分割,解决方法是:平滑滤波,消除多余的局部最小点;选择标记(markers)作为先验信息,其中 internal markers 为局部最小区域,external markers 为应用分水岭算法得到的分水岭线。
MSER 算法⚓
最大稳定极值区域(Maximally Stable Extremal Regions),是一种图像分割算法,基于分水岭的思想对图像进行特征区域检测,特别适用于检测图像中的稳定区域(如文字、斑点等)。
MSER 算法对灰度图像进行量化处理,阈值从0到255依次递增,类似于形态学中的膨胀操作。最低点首先被淹没,随着水面的上升逐渐淹没整个山谷,直到所有的点全部被淹没。在不同阈值下,如果某些连通区域不变或变化很小,则该区域称为最大稳定极值区域。
MSER 算法公式为:
其中,\(R(i)\) 表示阈值为 \(i\) 时的某一连通区域,\(\Delta\) 为灰度阈值的微小增加量,\(q(i)\) 为阈值是 \(i\) 时的区域的变化率,\(|R(i)|\) 表示区域 \(R(i)\) 的面积。当 \(q(i)\) 为局部极小值时,说明 \(R(i)\) 区域的变化非常小,则被认为是 MSER。
上述做法只能检测出灰度图像的黑色区域,不能检测出白色区域,因此还需要对原图进行反转(负片),然后再进行阈值从0-255递增的二值化处理过程。这两种操作分别被称为 MSER+ 和 MSER-。
MSER 算法的优点:
- 仿射不变性:对图像灰度具有仿射变换的不变性;提取的区域对于多种变换都具有良好的鲁棒性。
- 稳定性:具有相同阈值范围内所支持的区域才会被选择。
- 无需任何平滑或对齐处理就可以实现多尺度检测。
MSER 算法的局限性:
- MSER 依赖像素强度的极值区域(亮暗对比),因此对低对比度图像的特征检测效果不佳。
- MSER 需要稳定的亮度/颜色分布,而动态场景会导致区域边界频繁变化。因此 MSER 抗动态模糊能力差。
- MSER 假设区域形状相对稳定,图像的几何一致性较弱时会影响 MSER 的性能。因此 MSER 对存在非刚性形变或畸变的场景失效。
应用:随着机器学习的发展,MSER 算法被与 CNN,SVM 等结合起来,应用于场景文字的检测与识别、OCR 文字定位等领域。一种算法是首先产出大量 MSER 区域,进而用 SVM 或者 CNN 进行二分类过滤掉非文字区域,最后合并文字区域产生文字区域。
超像素分割⚓
超像素是具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。特点是:计算效率比较高;含有更多的感知信息;过度分割可以减少像素损失;超像素上表示图形更加高效。
超像素分割利用像素之间特征的相似性将像素分组,用少量的超像素代替大量的像素来表达图片特征,降低了图像后处理的复杂度,通常作为分割算法的预处理步骤。
超像素分割的应用:跟踪、标签分类、超像素词袋、视频前景分割、目标检测、骨架提取、人体姿态估计、医学图像分割等对分割的速度有要求的应用。
超像素生成算法,可以基于梯度下降的方法:SLIC(Simple Linear Iterative Clustering)将彩色图像转化为 CIE Lab 颜色空间和 XY 坐标下的5维特征向量,然后对5维特征向量构造距离度量标准,对图像像素进行局部聚类。该算法速度较快,能生成紧凑、近似均匀的超像素。
5.4 数学形态学在图像分割的应用⚓
腐蚀: \(A\ominus B\) ,求局部最小值的操作,因为局部极小值(暗区域)通常在腐蚀操作中被保留。腐蚀操作会使图像中的高亮区域逐渐减小。作用:腐蚀把临近背景的目标像素值置为背景来达到缩小目标面积的作用。结果为结构元B全部位于A中时的子图像。
膨胀: \(A\oplus B\) ,求局部最大值的操作。膨胀操作会使图像中的高亮区逐渐增长。作用:膨胀把邻接背景的背景像素值置为目标来达到增加目标面积的作用。结果为结构元B与A有相交时的子图像。
开运算: \(A^\circ B=(A\ominus B)\oplus B\) ,先腐蚀后膨胀。开的结果是A的子集。开运算可以滤除比结构元素小的突刺,切断细长搭接,起到分离作用。
闭运算: \(A\cdot B=(A\oplus B)\ominus B\) ,先膨胀后腐蚀。A是闭运算结果的子集。闭运算可以填充比结构元素小的缺口或孔,搭接短的间断,起到连通作用。
开闭运算都可以去除比结构元素小的特定图像细节。
顶帽运算: \(T_w(A,B)=A-A^\circ B\) ,A 对 B 顶帽的操作为“A 减去 A 和 B 开运算”,可以从给定图像中提取明亮的小元素和细节。作用:从给定的图像中提取较小的元素和细节,并且比周围环境更亮。例如提取出白色的小突刺。
黑帽运算: \(T_b(A,B)=A\cdot B-A\) ,A 对 B 黑帽的操作为“A 和 B 闭运算减去 A”,可以从给定图像中提取暗的小元素和细节并变明亮。作用:从给定的图像中提取较小的元素和细节,并且比周围环境更暗,提取后的细节变得明亮。例如提取出黑色小空洞并变成白色。
5.5 基于显著性区域的图像分割方法⚓
显著性区域(salient region):面对一个场景时,人类会自动地过滤不感兴趣区域而只关注感兴趣区域,这些人们感兴趣的区域被称为显著性区域。
HC(Histogram Contrast)算法,基于直方图对比的显著性检测:选择合适的阈值将显著性图二值化得到分割结果。
主要步骤:输入原始图像 → 颜色通道量化 → 基于直方图的加速 → 颜色空间平滑 → 计算显著性值 → 选择阈值进行分割。颜色对比度使用到了 CIE Lab 颜色空间。
RC(Region Contrast)算法,基于区域对比度的显著性检测,是对 HC 的改进,思想:在颜色对比度的基础上引入空间位置作为权重。
主要步骤:输入原始图像 → 基于图的图像分割 → 颜色通道量化 → 基于直方图的加速 → 颜色空间平滑 → 计算区域空间权值→ 计算加权显著性值 → 选择阈值进行分割。
补充 彩色图像处理⚓
人眼的视觉特性表明,人眼虽然只能分辨出几十种灰度级,但却可以分辨出上千种不同的颜色。因此,借助彩色来处理图像,对人眼而言,增强了视觉效果,可以提高对事物的认识程度。通常,对于彩色图像的增强,可分为伪彩色增强,全彩色增强(真彩色增强)两种处理方法。
伪彩色增强⚓
对原来灰度图象中不同灰度值的区域“赋予”不同的彩色,以更明显地区分。
方法:
(1) 亮度分层切割
定义 \(M\) 个灰度级平面 \(L_1,L_2,\ldots,L_M\) ,M 个平面把图像灰度函数分成 \(M+1\) 个区间,每个灰度区间赋予一种彩色 \(C_m\) 。
优点:简单易行;便于计算及软硬件实现。
缺点:彩色生硬;不够调和;量化噪声较大。
(2) 伪彩色变换映射
不同于亮度分层方法,该方法对输入的像素灰度级,进行3个独立的变换。变换结果,构成 RGB 的3个值,由此合成显示一幅彩色图像。此方法获得的彩色内容,受变换函数的特性所调制,可显示出不同的色彩。
伪彩色变换映射与亮度切割分层的关系:
- 亮度切割方法利用线性分段函数从灰度到彩色进行变换。
- 伪彩色变换映射方法可以使用光滑的、非线性的变换函数。
- 亮度切割分层法可以看成伪彩色变换映射的特例。
(3) 频域滤波。见图片:
全彩色图像增强⚓
处理策略:(对于线性独立操作,两种方法处理结果相同,例如邻域平均)
- 分别处理彩色图像的每一个分量 \(f_r,f_g,f_b\) ,然后合成。
- 将彩色像素 \(f(x,y)\) 看作 \(\mathbb{R}^{3\times1}\) 的向量,直接对彩色向量处理。
(1) 单分量变换增强:
将 RGB 分量图转换为 HSI 分量图,使用灰度图增强方法,增强其中某一个分量,再转换为 RGB 分量图。
例如,只对 I 通道增强,可实现亮度增强。只对 S 通道操作,可增强饱和度。增加饱和度:彩色更浓,反差增加、边缘清晰。减小饱和度:部分区域成为灰色,整体比较平淡。只对 H 通道操作,可增强色调增强。色调减小会感觉图像变冷,色调增大会感觉图像变暖。如果色调增减大常数,图像会发生强烈变化和失真,可能从黄色直接变为红色或绿色。
(2) 彩色分层增强
突出图像中特殊的彩色区域。不能采用各通道灰度切分增强的方法,因为彩色像素是一个 \(n\) 维向量。
基本处理方法:显示感兴趣的颜色,以利从背景分离。像模板一样,使用由彩色定义的区域。
见图片: