图像分割笔记(冈萨雷斯-数字图像处理)


第10章 图像分割

?分割将一幅图像细分为其组成区域或对象。(针对不同问题有不同的细分需求)

?单色图像分割算法通常基于图像亮度值的两个特性:不连续性(图像边缘)和相似性(相似区域)。

1. 点、线和边缘检测

?采用图像掩膜运算(卷积),如图像做\(3\times3\)的掩膜运算表示如下:


\(3\times3\)掩膜

\[R = w_1z_1+w_2z_2+\cdots+w_9z_9 = \sum_{i=1}^9w_iz_i \]

1.1 点检测

通过掩膜运算,使满足\(|R|\geq T?\),点检测模板如下:


点检测掩膜

点检测的要求是:当掩膜的中心位于一个孤立点时,掩膜的响应必须最强,而在亮度不变的区域中响应为零(掩膜系数之和为零)。

1.2 线检测

线检测同理,采用不同的掩膜可以检测出不同方向的线:


点检测掩膜

1.3 edge函数边缘检测

亮度值的不连续性通常采用一阶(梯度)和二阶(凹凸)导数检测。

边缘检测基本准则

  • 找到亮度的一阶导数在幅度上比指定阈值大的地方。

  • 找到亮度的二阶导数有零交叉的地方。

    零交叉点:零灰度轴和二阶导数极值的连线的交点称为该二阶导数的零交叉点。

    因为用二阶导数对图象进行处理(提取边缘)往往会产生双边缘。这是由于二阶导数是在一阶导数的基础上求导。一阶导数如同一条斜线,由斜率决定,二阶导数在一阶导数的两端会分别产生正值和负值(就只有在端点上有值),而一阶导数中间斜率不变的部分求二阶导数后成了零,这样就出现了双边缘。所以,想象一条虚拟直线,连接求二阶导数导数产生的端点值,这样就会在中点附近通过坐标轴。这样就可以确定边缘的中心,从而避免了产生双边缘的不方便。

边缘检测器 基本特性
Sobel 使用Sobel近似导数查找边缘
Prewitt 使用Prewitt近似导数查找边缘
Roberts 使用Roberts近似导数查找边缘
Laplacian of a Gaussian (LoG) 在使用高斯滤波器对\(f(x,y)\)滤波之后,通过寻找零交叉来查找边缘
Zero crossings (零交叉)? 使用一个自定义的滤波器对\(f(x,y)\)滤波之后,通过寻找零交叉来查找边缘
Canny【1986】 通过寻找\(f(x,y)\)的梯度的最大值来查找边缘。梯度由高斯滤波器的导数来计算。该方法使用两个阈值检测强边缘和弱边缘,若它们连结到了强边缘,则输出中只包含弱边缘。因此,这种方法更适合用于检测真正的弱边缘。


边缘检测器

上图算子实现边缘检测过程:先采用左边算子对图像\(f?\)进行滤波,再使用右边算子对图像\(f?\)滤波,然后分别计算两幅图像中像素值的平方,将它们相加后计算平方根。

2. 使用Hough变换的线检测

受噪声、不均匀光照影响,图像边缘断裂、亮度不连续而难以得到完全的边缘特性,而Hough变换【1962】可以弥补这一点,寻找并链接图像中的线段

如下图,采用\(Hough\)变换时,考虑一个点\((x_i,y_i)\)和所有通过该点的线,则点\((x_i,y_i)\)的线有无数条,这些线对某些\(a\)值和\(b\)值来说,均满足\(y_i = ax_i+b\)。将该公式写为\(b = -x_ia+y_i\)并考虑\(ab\)平面(参数空间),可对一个固定点\((x_i,y_i)\)产生单独的一条直线。此外,第二个点\((x_j,y_j)\)也有这样一条在参数空间上与它相关的直线,这条直线与\((x_i,y_i)\)相关的直线相交于点\((a',b’)\),其中\(a'\)\(b'\)分别是\(xy\)平面上包含\((x_i,y_i)\)\((x_j,y_j)\)的直线的斜率截距。事实上,在这条直线上的所有点都有在参数空间中相交于\((a',b')?\)的直线。


hough变换1

\(a?\)(直线的斜率)接近无限大时(垂直),这种表示方法很将使直接检测问题会变得非常困难,由此采用以下标准表示法:

\[xcos\theta+ysin\theta=\rho \]


hough变换2

?如图,\(\theta=0^{\circ}\)时,\(\rho\)等于正的\(x\)截距,\(\theta=90^{\circ}\)时,\(\rho\)等于正的\(y\)截距,或\(\rho=-90^{\circ}\)时,\(\rho\)等于负的\(y\)截距。上图\((b)\)中的每一条正弦曲线表示通过特定点\((x_i,y_i)\)的一族直线。交点\((\rho',\theta')\)对应于通过\((x_i,y_i)\)\((x_j,y_j)\)的直线。

2.1 使用Hough变换做峰值检测

使用\(Hough\)变换进行线检测和链接的第一步是峰值检测。在\(Hough\)变换中找到一组有意义的明显峰值是一种挑战。因为数字图像的空间中的量化、\(Hough\)变换的参数空间中的量化以及典型图像的边缘都不是很直这个事实,\(Hough\)变换的峰值一般都位于多个\(Hough\)变换单元中。克服这个问题的一个策略如下所示:
1)找到包含有最大值的Hough变换单元并记下它的位置。
2)把第一步中找到的最大值点的领域中的Hough变换单元设为零。
3)重复该步骤,直到找到需要的峰值数时为止,或者达到一个指定的阈值时为止。

2.2 使用Hough变换做线检测和链接

一旦在\(Hough\)变换中识别出了一组候选的峰被,则它们还要留待确定是否存在与这些峰值相关的线段以及它们的起始和结束位置。对每一个峰值来说,第一步是找到图像中影响到峰值的每一个非零值点的位置。然后将与找到的位置相关的像素组合成线段:
1)将像素位置旋转\(90^{\circ}-\theta\),以便它们大概位于一条垂直线上。
2)按旋转的\(x\)值来对这些像素位置分排序。
3)找到裂口。忽视掉小裂口;这将合并被小空白分离的相邻线段。
4)返回比最小阈值长的线段的信息。

3. 阈值处理

如图,计算图像\(f(x,y)\)直方图,设定一个阈值\(T\),有:

\[g(x,y)=\left\{\begin{matrix} 1 & 如果f(x,y)\ge T & \\ 0 & 如果f(x,y)

\(T\)为常数时,就是全局阈值处理。


直方图阈值

3.1 全局阈值处理

自动选择阈值\(Gonzalez\)\(Woods\)[2002]描述了如下迭代步骤:
1)为\(T\)选一个初始估计值(建议初始估计值为图像中最大亮度值和最小亮度值的中间值)
2)使用\(T\)分割图像。这会产生两组像素:亮度值\(\geq T\)的所有像素组成的\(G_1\),亮度值\(的所有像素组成\(G_2\).
3)计算\(G_1\)\(G_2\)范围内的像素的平均亮度值\(\mu_1\)\(\mu_2\)
4)计算一个新阈值:\(T=\frac{1}{2}(\mu_1+\mu_2)\)
5)重复步骤2到步骤4,直到连续迭代中\(T\)的差比预先指定的参数\(T_o\)小为止。

3.2 局部阈值处理

全局阈值处理方法在背景照明不均匀时有可能无效。通常需要针对照明问题做预处理以补偿图像,再进行全局阈值处理;或者采用局部阈值处理:

\[g(x,y)=\left\{\begin{matrix} 1 & 若f(x,y)\ge T(x,y) & \\ 0 & 若f(x,y)< T(x,y) \end{matrix}\right. \]

其中,\(T(x,y)=f_o(x,y)+T_o?\),图像\(f_o(x,y)?\)\(f?\)的形态学开运算。

4. 基于区域的分割

4.1 基础公式

\(R\)表示整个区域。我们可将分割看做是把\(R\)分成\(n\)个子区域\(R_1,R_2,R_3,\cdots,R_n\)的处理,满足:
(a) \(\bigcup_{i=1}^{n}R_i=R\)。(分割必须是完全的,即每个点都在一个区域中)
(b) \(R_i\)是一个连接区域,\(i=1,2,\cdots,n\)。(区域中的点都按预先定义好的方式(如4连接、8连接)连接)
(c) \(R_i\bigcap R_j=\varnothing\),对所有的\(i\)\(j\)\(i\neq j\)。(区域间不相交)
(d) \(P(R_i)=TRUE\),对\(i=1,2,\cdots,n\)。(分割区域中像素点满足相同的性质)
(e) \(P(R_i\bigcup R_j)=FALSE\),对任何邻接区域\(R_i\)\(R_j\)。(邻近区域\(R_i\)\(R_j\)在谓词\(P\)上的意义是不一样的)
其中,\(P(R_i)\)是定义在集合\(R_i\)中的点上的逻辑谓词,\(\varnothing\)是空集。

4.2 区域生长

区域生长:根据预先定义的生长准则来把像素或子区域集合成较大区域的处理方法。
基本处理方法:以一组“种子”点开始来形成生长区域,即将那些预定义属性类似于种子的邻域像素附加到每个种子上(如指定的灰度级或颜色)。
问题
1)根据处理的任务、图像数据类型,选择不同的相似性准则;
2)区域生长停止规则的公式表达。

4.3 区域分离和合并

\(R\)代表整个图像区域并选择一个谓词\(P\)。分割\(R?\)的一种方法是把它再细分为更新的象限区域,它可以用四叉树来表示,如下图:


区域分离和合并

实现步骤
1)把任意区域\(R_i\)分为4个不相连的象限,其满足\(P(R_i)=FALSE\)
2)当不可能再分时,合并任何满足\(P(R_j\bigcup R_k)=TRUE\)的区域\(R_j\)\(R_k\)
3)当不可能进一步合并时,停止。

5. 使用分水岭变换的分割

分水岭:指一个山脊,在该山脊两边的区域中有着不同流向的水系。
汇水盆地:指排入河流或水库的地理区域。

理解分水岭变换要求我们把灰度级图像看作是一个拓扑表面,其中\(f(x,y)\)的值被解释为高度。水落在脊线上时,流向两个汇水盆地的概率相同。

5.1 使用距离变换的分水岭分割

二值图像的距离变换是一个相对简单的概念:它是每一个像素到最近非零值像素的距离。


分水岭距离变换.jpg

5.2 使用梯度的分水岭分割

在使用分水岭变换之前,通常要使用梯度幅度来预处理图像。梯度幅度图像在沿对象的边缘处有较高的像素值,而在其他地方则有较低的像素值。理想情况下,分水岭变换会在沿对象边缘处产生分水岭脊线。

5.3 控制标记符的分水岭分割

分水岭变换直接用于梯度图像时,噪声和梯度的其他局部不规则性常常会导致过分割。其导致的问题可能会非常严重,以至于产生不可用的结果。解决办法是引入标记符控制过分割,标记符是一个属于一幅图像的连接分量。我们希望有一个内部标记符集合(处在每一个感兴趣对象的内部)和一个外部标记符集合(包含在背景中)。标记符计算方法包括线性滤波、非线性滤波及形态学处理。对于特定的应用,选择的方法高度依赖于与应用相关的图像的特性。