计算机视觉(八):图像分割

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eeeee123456/article/details/82968868

一、阈值处理

      由于阈值处理直观、实现简单且计算速度快,因此图像阈值处理在图像分割应用中处于核心地位。

1. 基础知识

      假设图1(a)中的灰度直方图对应于图像 f ( x , y ) f(x,y) ,该图像由暗色背景上的较亮物体组成,以这样的组成方式,物体像素和背景像素所具有的灰度值组成了两种支配模式。从背景中提取物体的一种明显方法是,选择一个将这些模式分开的阈值 T T 。然后, f ( x , y ) > T f(x,y)>T 的任何点 ( x , y ) (x,y) 称为一个对象点;否则该点称为背景点。分割后的图像 g ( x , y ) g(x,y) 由下式给出:
g ( x , y ) = { 1 , f ( x , y ) > T 0 , f ( x , y ) T            ( 1 ) g(x,y) = \begin{cases} 1, & \text{$f(x,y) > T$} \\ 0, & \text{$f(x,y) ≤ T$}\ \ \ \ \ \ \ \ \ \ (1) \end{cases} T T 是一个适用于整个图像的常数时,上式给出的处理称为全局阈值处理。当 T T 值在一幅图像上改变时,我们把该处理称为可变阈值处理(局部阈值处理或区域阈值处理有时用于表示可变阈值处理)。若 T T 取决于空间坐标 ( x , y ) (x,y) 本身,则可变阈值处理通常称为动态阈值处理或自适应阈值处理。
      图1(b)显示了一个更为困难的阈值处理问题,它包含有三个支配模式的直方图。分割的图像由下式给出:
g ( x , y ) = { a , f ( x , y ) > T 2 b , T 1 < f ( x , y ) T 2 c , f ( x , y ) T 1 g(x,y) = \begin{cases} a, & \text{$f(x,y) > T_2$} \\ b, & \text{$T_1 < f(x,y) ≤ T_2$} \\ c, & \text{$f(x,y) ≤ T_1$} \end{cases} 式中,a、b和c是任意三个不同的灰度值。
在这里插入图片描述

图1

2. 基本的全局阈值处理

      当物体和背景像素的灰度分布十分明显时,可以用适用于整个图像的单个(全局)阈值。能对每幅图像自动估计阈值的算法如下:
① 为全局阈值 T T 选择一个初始估计值。
② 在式(1)中用 T T 分割该图像。这将产生两组像素: G 1 G_1 由灰度值大于 T T 的所有像素组成, G 2 G_2 由所有小于等于 T T 的像素组成。
③ 对 G 1 G_1 G 2 G_2 的像素分别计算平均灰度值(均值) m 1 m_1 m 2 m_2
④ 计算一个新的阈值: T = 1 2 ( m 1 + m 2 ) T = {1\over 2}(m_1+m_2)
⑤ 重复步骤2到步骤4,直到连续迭代中的 T T 值间的差小于一个预定义的参数 Δ T \Delta T 为止。
      通常, Δ T \Delta T 越大,则算法执行的迭代次数越少。所选的初始阈值必须大于图像中的最小灰度级而小于最大灰度级。图像的平均灰度对于 T T 来说是较好的初始选择。

3. 用Otsu方法的全局阈值处理

      令 { 0 , 1 , 2 , . . . , L 1 } \{0,1,2,...,L-1\} 表示一幅大小为 M × N M\times N 像素的数字图像中的 L L 个不同的灰度级, n i n_i 表示灰度级为 i i 的像素数。图像中的像素总数为 M N = n 0 + n 1 + . . . + n L 1 MN = n_0+n_1+...+n_{L-1} 。归一化的直方图具有分量 p i = n i / M N p_i = n_i/MN 。由此有
i = 0 L 1 p i = 1 ,      p i 0 \sum_{i=0}^{L-1}p_i = 1,\ \ \ \ p_i\geq 0       假设使用阈值把输入图像处理为两类 C 1 C_1 C 2 C_2 ,Ostu算法如下:
① 计算输入图像的归一化直方图。使用 p i p_i i = 0 , 1 , 2 , . . . , L 1 i=0,1,2,...,L-1 表示该直方图的各个分量。
② 使用
P 1 ( k ) = i = 0 k p i P_1(k) = \sum_{i=0}^kp_i 对于 k = 0 , 1 , 2 , . . . , L 1 k=0,1,2,...,L-1 ,计算累积和 P 1 ( k ) P_1(k)
③ 使用
m ( k ) = i = 0 k i p i m(k) = \sum_{i=0}^kip_i 对于 k = 0 , 1 , 2 , . . . , L 1 k=0,1,2,...,L-1 ,计算累积均值 m ( k ) m(k)
④ 使用
m G = i = 0 L 1 i p i m_G = \sum_{i=0}^{L-1}ip_i 计算全局灰度均值 m G m_G
⑤ 使用
σ B 2 ( k ) = [ m G P 1 ( k ) m ( k ) ] 2 P 1 ( k ) [ 1 P 1 ( k ) ] \sigma_B^2(k) = {{[m_GP_1(k)-m(k)]^2}\over{P_1(k)[1-P_1(k)]}} 对于 k = 0 , 1 , 2 , . . . , L 1 k=0,1,2,...,L-1 ,计算类间方差 σ B 2 ( k ) \sigma_B^2(k)
⑥ 得到Otsu阈值 k k^* ,即使得 σ B 2 ( k ) \sigma_B^2(k) 最大的 k k 值。如果最大值不唯一,用相应检测到的各个最大值 k k 的平均得到 k k^*
⑦ 在 k = k k = k^* 处计算
σ G 2 = i = 0 L 1 ( i m G ) 2 p i \sigma_G^2 = \sum_{i=0}^{L-1}(i-m_G)^2p_i η ( k ) = σ B 2 ( k ) σ G 2 \eta(k) = {{\sigma_B^2(k)}\over{\sigma_G^2}} 得到可分性测度 η \eta^* ,该测度可用于得到类别可分性的定量估计。

4. 用图像平滑改善全局阈值处理

      噪声会将简单的阈值处理问题变为不可解决的问题。当噪声不能在源头减少,并且阈值处理又是所选择的分割方法时,通常能增强性能的一种技术是,在阈值处理之前平滑图像。
      经平滑和分割后的图像,由于对边界的模糊,会造成物体和背景间的边界稍微有点失真。对一幅图像平滑越多,分割后的结果中的边界误差就越大。

5. 利用边缘改进全局阈值处理

       f ( x , y ) f(x,y) 表示输入图像,利用边缘改进全局阈值处理算法如下:
① 采用特征检测中讨论的任何一种方法来计算一幅边缘图像,无论是 f ( x , y ) f(x,y) 梯度的幅度还是拉普拉斯的绝对值均可。
② 指定一个阈值 T T
③ 用步骤2中的阈值对步骤1中的图像进行阈值处理,产生一幅二值图像 g T ( x , y ) g_T(x,y) 。在从 f ( x , y ) f(x,y) 中选取对应于“强”边缘像素的下一步中,该图像用做一幅模板图像。
④ 仅用 f ( x , y ) f(x,y) 中对应于 g T ( x , y ) g_T(x,y) 中像素值为1的位置的像素计算直方图。
⑤ 用步骤4中的直方图全局地分割 f ( x , y ) f(x,y) ,例如使用Ostu 方法。

6. 多阈值处理

      迄今为止,我们关注的是用单个全局阈值对图像进行分割。我们可将用Otsu方法的全局阈值处理扩展到任意数量的分类。在 K K 个类 C 1 , C 2 , . . . , C K C_1, C_2, ..., C_K 的情况下,类间方差可归纳为下面的表达式:
σ B 2 ( k ) = k = 1 K P k ( m k m G ) 2 \sigma_B^2(k) = \sum_{k=1}^KP_k(m_k - m_G)^2 式中,
P ( k ) = i C K k p i P(k) = \sum_{i\in C_K}^kp_i m ( k ) = 1 P K i C K k i p i m(k) = {1\over P_K}\sum_{i\in C_K}^kip_i m G = i = 0 L 1 i p i m_G = \sum_{i=0}^{L-1}ip_i K K 类由 K 1 K-1 个阈值分离,这些值 k 1 , k 2 , . . . , k K 1 k_1^*, k_2^*, ..., k_{K-1}^* 是式的最大值。
      对于由三个灰度间隔组成的三个类(这三个类由两个阈值分隔),类间方差由下式给出:
σ B 2 = P 1 ( m 1 m G ) 2 + P 2 ( m 3 m G ) 2 + P 3 ( m 3 m G ) 2 \sigma_B^2 = P_1(m_1-m_G)^2 + P_2(m_3-m_G)^2 + P_3(m_3-m_G)^2 式中,
P 1 ( k ) = i = 0 k 1 p i ,        P 2 ( k ) = i = 0 k 2 p i ,        P 3 ( k ) = i = 0 k 3 p i P_1(k) = \sum_{i=0}^{k_1}p_i,\ \ \ \ \ \ P_2(k) = \sum_{i=0}^{k_2}p_i,\ \ \ \ \ \ P_3(k) = \sum_{i=0}^{k_3}p_i m 1 ( k ) = 1 P 1 i = 0 k 1 i p i ,        m 2 ( k ) = 1 P 2 i = 0 k 2 i p i ,        m 3 ( k ) = 1 P 3 i = 0 k 3 i p i m_1(k) = {1\over P_1}\sum_{i=0}^{k_1}ip_i,\ \ \ \ \ \ m_2(k) = {1\over P_2}\sum_{i=0}^{k_2}ip_i,\ \ \ \ \ \ m_3(k) = {1\over P_3}\sum_{i=0}^{k_3}ip_i 两个最佳阈值 k 1 k_1^* k 2 k_2^* 是使得 σ B 2 ( k 1 , k 2 ) \sigma_B^2(k_1, k_2) 最大的值。阈值处理后的图像由下式给出:
g ( x , y ) = { a , f ( x , y ) k 1 b , k 1 < f ( x , y ) k 2 c , f ( x , y ) > k 2 g(x,y) = \begin{cases} a, & \text{$f(x,y) ≤ k_1^*$} \\ b, & \text{$k_1^* < f(x,y) ≤ k_2^*$} \\ c, & \text{$f(x,y) > k_2^*$} \end{cases} 式中,a、b和c是任意三个有效的灰度值。最后,为单个阈值定义的可分性测度可直接扩展到多个阈值:
η ( k 1 , k 2 ) = σ B 2 ( k 1 , k 2 ) σ G 2 \eta(k_1^*, k_2^*) = {{\sigma_B^2(k_1^*, k_2^*)}\over{\sigma_G^2}}

7. 可变阈值处理

      噪声和非均匀光照这样的因素的阈值处理算法的性能影响起着重要作用。前面说过,图像平滑和边缘信息的使用有益于阈值处理,然而,常常会出现这种情况,要么预处理不切实际,要么对这一情形的改进简单而无效。在这种情况下,更为高级且复杂的阈值处理涉及可变阈值问题。
① 图像分块
      把一幅图像分成不重叠的矩形,选择的矩形要足够小,以便每个矩形的光照都近似是均匀的。最后对每个矩形进行阈值处理。

② 基于局部图像特性的可变阈值处理
      与图像分块相比,更为一般的方法是在一幅图像中的每点 ( x , y ) (x,y) 计算阈值,该阈值以一个或多个在 ( x , y ) (x,y) 领域计算的特性为基础。令 σ x y \sigma_{xy} m x , y m_{x,y} 表示一幅图像中以坐标 ( x , y ) (x,y) 为中心的邻域 S x y S_{xy} 所包含的像素集合的标准差和均值。下面是可变局部阈值的通用形式:
T x y = a σ x y + b m x y T_{xy} = a\sigma_{xy} + bm_{xy} 式中,a和b是非负常数,且
T x y = a σ x y + b m G T_{xy} = a\sigma_{xy} + bm_G 其中, m G m_G 是全局图像均值。分割后的图像计算如下:
g ( x , y ) = { 1 , f ( x , y ) > T x y 0 , f ( x , y ) T x y            ( 1 ) g(x,y) = \begin{cases} 1, & \text{$f(x,y) > T_{xy}$} \\ 0, & \text{$f(x,y) ≤ T_{xy}$}\ \ \ \ \ \ \ \ \ \ (1) \end{cases} 式中, f ( x , y ) f(x,y) 是输入图像。该式对图像中的所有像素位置进行求值,并在每个点 ( x , y ) (x,y) 处使用邻域 S x y S_{xy} 中的像素计算不同的阈值。

扫描二维码关注公众号,回复: 3644073 查看本文章

③ 使用移动平均
      以上讨论的局部阈值处理的一种特殊情形,是以一幅图像的扫描行计算移动平均为基础的。通常,为减少光照偏差,扫描是以Z字姓模式逐行执行的。令 z k + 1 z_{k+1} 表示步骤 k + 1 k+1 中扫描序列遇到的点的灰度。这个新点出的移动平均(平均灰度)由下式给出:
m ( k + 1 ) = 1 n i = k + 2 n k + 1 z i = m ( k ) + 1 n ( z k + 1 z k n ) m(k+1) = {1\over n}\sum_{i=k+2-n}^{k+1}z_i = m(k) + {1\over n}(z_{k+1} - z_{k-n}) 式中, n n 是用于计算平均的点数。因为对图像中的每个点都计算移动平均,因此用式实现分割,其中 T x y = b m x y T_{xy} = bm_ {xy} b b 是常数, m x y m_{xy} 是在输入图像中的点 ( x , y ) (x,y) 处使用式得到的移动平均。

8. 多变量阈值处理

      在某些情况下,传感器可产生多个可利用的变量来表征图像中的每个像素,这样,就允许多变量阈值处理。最显著的例子就是彩色成像,其中红(R)、绿(G)、蓝(B)分量用于形成一幅合成彩色图像。在这种情况下,每个“像素”由三个值来表征,并且可以表示为一个三维向量 z = ( z 1 , z 2 , z 3 ) T z=(z_1, z_2, z_3)^T ,其分量是一个点的RGB彩色。这些三维点通常称为体素,以便与图像元素相对应来表示体积元素。
      多变量阈值处理可视为一种距离计算。计算任意彩色点 z z 和平均彩色 a a 间的距离测度 D ( z , a ) D(z, a) ,我们按如下方式分割图像:
g = { 1 , D ( z , a ) < T 0 , 其他 g = \begin{cases} 1, & \text{$D(z, a) < T$} \\ 0, & \text{其他} \end{cases} 其中, T T 是一个阈值。根据n维欧几里得距离定义:
D ( z , a ) = z a = [ ( z a ) T ( z a ) ] 1 2 D(z, a) = ||z-a|| = [(z-a)^T(z-a)]^{1\over 2} 一种更有用的距离测度是所谓的马氏(Mahalanobis)距离,定义为:
D ( z , a ) = [ ( z a ) T C 1 ( z a ) ] 1 2 D(z, a) = [(z-a)^TC^{-1}(z-a)]^{1\over 2} 其中, C C z z 的协方差矩阵。



二、基于区域的分割

      本段讨论以直接寻找区域为基础的分割技术。

1. 区域生长

      区域生长是根据预先定义的生长准则,将像素或子区域组合为更大区域的过程。基本方法是从一组“种子”点开始,将与种子预先定义的性质相似的那些邻域像素添加到每个种子上,来形成这些生长区域(如特定范围的灰度或颜色)。
      令 f ( x , y ) f(x, y) 表示一个输入图像阵列; S ( x , y ) S(x, y) 表示一个种子阵列,阵列中种子点位置处为1,其他位置处为0; Q Q 表示在每个位置 ( x , y ) (x, y) 处所用的属性。假设阵列 f f S S 的尺寸相同。基于8连接的一个基本区域生长算法如下:
① 在 S ( x , y ) S(x, y) 中寻找所有连通分量,并把每个连通分量腐蚀为一个像素;把找到的所有这种像素标记为1,把 S S 中的所有其他像素标记为0.
② 在坐标对 ( x , y ) (x, y) 处形成图像 f Q f_Q :若输入图像在该坐标处满足给定的属性 Q Q ,则令 f Q ( x , y ) = 1 f_Q(x,y) = 1 ,否则令 f Q ( x , y ) = 0 f_Q(x,y) = 0
③ 令 g g 是这样形成的图像:即把 f Q f_Q 中为8连通种子点的所有1值点,添加到 S S 中的每个种子点。
④ 用不同的区域标记标出 g g 中的每个连通分量。这就是由区域生长得到的分割图像。

2. 区域分裂与聚合

      区域分裂与聚合指,首先将一幅图像细分为一组任意的不相交区域,然后聚合和/或分裂这些区域,试图满足我们所需的分割条件。
      令 R R 表示整幅图像区域,并选择一个属性 Q Q 。对 R R 进行分割的一种方法是,依次将它细分为越来越小的四象限区域,以便对于任何区域 R i R_i Q ( R i ) = T R U E Q(R_i)=TRUE 。具体过程如下:
① 把满足 Q ( R i ) = F A L S E Q(R_i) = FALSE 的任何区域 R i R_i 分裂为4个不相交的象限区域。
② 不可能进一步分裂时,对满足条件 Q ( R j R k ) = T R U E Q(R_j \bigcup R_k) = TRUE 的任意两个邻域区域 R j R_j R k R_k 进行聚合。
③ 无法进一步聚合时,停止操作。



三、用形态学分水岭的分割

1. 背景知识

      形态学分水岭分割将前面讨论的分割方法中的许多概念进行了具体化,因此通常会产生更稳定的分割结果,包括连接的分割边界。
      分水岭的概念是以三维方式来形象化一幅图像为基础的:两个空间坐标作为灰度的函数,如图2所示。在这种“地形学”解释中,我们考虑三种类型的点:
(a) 属于一个区域最小值的点;
(b) 把一点视为一个水滴,如果把这些点放在任意位置上,水滴一定会下落到某个最小值点;
(c) 处在该点的水会等概率地流向不止一个这样的最小值点。
对于一个特定的区域最小值,满足条件(b)的最小值点的集合称为该最小值的汇水盆地或分水岭。满足条件(c)的点形成地面的峰线,它称为分割线或分水线。
在这里插入图片描述

图2

      基于这些概念的分割算法的主要目标是找出分水线,其基本思想非常简单。假设在每个区域的最小值上打一个洞,并且让水通过洞以均匀的速率上升,从低到高淹没整个地形。当不同汇水盆地中上升的水聚集时,修建一个水坝来阻止这种聚合。水将达到在水线上只能见到各个水坝的顶部的程度。这些大坝的边界对应于分水岭的分割线。具体见图3。
      分水岭分割的主要应用之一是,从背景中提取近乎一致的物体。由变化较小的灰度表征的区域有较小的梯度值。因此,我们经常见到分水岭分割方法用于一幅图像的梯度,而不是图像本身。
在这里插入图片描述

图3    (a) 原图像;(b) 地形俯视图;(c)~(d) 被水淹没的两个阶段;(e) 进一步淹没的结果;
(f) 来自两个汇水盆地的水开始汇聚(两个汇水盆地之间构筑了一个较短的水坝);(g) 较长的水坝;(h) 最终的分水(分割)线

2. 分水岭分割算法

      令 M 1 , M 2 , . . . , M R M_1,M_2,...,M_R 是梯度图像 g ( x , y ) g(x,y) 中区域最小值点的坐标集。令 C ( M i ) C(M_i) 是与区域最小值 M i M_i 相关的汇水盆地中的点的坐标集。符号 m i n min m a x max 表示 g ( x , y ) g(x,y) 的最小值和最大值。最后,令 T [ n ] T[n] 表示满足 g ( s , t ) < n g(s,t)<n 的坐标 ( s , t ) (s,t) 的集合,即:
T [ n ] = { ( s , t ) g ( s , t ) < n } T[n] = \{(s,t) | g(s,t)<n\} C n ( M i ) C_n(M_i) 表示汇水盆地中与淹没阶段 n n 的最小值 M i M_i 相关联的点的坐标集,即:
C n ( M i ) = C ( M i ) T [ n ] C_n(M_i) = C(M_i) \bigcap T[n] 接下来,令 C [ n ] C[n] 表示阶段 n n 中已被水淹没的汇水盆地的并集:
C [ n ] = i = 1 R C n ( M i ) C[n] = \bigcup_{i=1}^RC_n(M_i) 然后,令 C [ m a x + 1 ] C[max+1] 表示所有汇水盆地的并集:
C [ m a x + 1 ] = i = 1 R C ( M i ) C[max+1] = \bigcup_{i=1}^RC(M_i)       寻找分水线的算法使用 C [ m i n + 1 ] = T [ m i n + 1 ] C[min+1] = T[min + 1] 来初始化。然后,该算法进行递归处理,由 C [ n 1 ] C[n-1] 计算 C [ n ] C[n] 。由 C [ n 1 ] C[n-1] 求得 C [ n ] C[n] 的过程如下:令 Q Q 表示 T [ n ] T[n] 中的连通分量的集合。然后,对于每个连通分量 q Q [ n ] q\in Q[n] ,有如下三种可能性:
q C [ n 1 ] q \bigcap C[n-1] 为空集。
q C [ n 1 ] q \bigcap C[n-1] 包含 C [ n 1 ] C[n-1] 的一个连通分量
q C [ n 1 ] q \bigcap C[n-1] 包含 C [ n 1 ] C[n-1] 的一个以上的连通分量
      由 C [ n 1 ] C[n-1] 构建 C [ n ] C[n] 取决于这三个条件中的哪个条件成立。
      遇到一个新的最小值时,条件①发生,这种情况下,连通分量 q q 并入 C [ n 1 ] C[n-1] 中形成 C [ n ] C[n]
      当 q q 位于某些局部最小值的汇水盆地内时,条件②发生,这种情况下, q q 并入 C [ n 1 ] C[n-1] 中形成 C [ n ] C[n]
      当遇到全部或部分分隔两个或多个汇水盆地的山脊线时,条件③发生。进一步淹没会导致这些汇水盆地中的水位聚合。因此,必须在 q q 内构筑一个水坝(如果涉及两个以上的汇水盆地,就要构筑多个水坝)以阻止汇水盆地间的水溢出。



四、代码实现(Python+OpenCV)(未完,待续

使用分水岭算法进行图像分割

import cv2





以上全部内容参考书籍如下:
冈萨雷斯《数字图像处理(第三版)》
Joe Minichino、Joseph Howse《OpenCV 3计算机视觉Python语言实现(原书第2版)》

猜你喜欢

转载自blog.csdn.net/eeeee123456/article/details/82968868