数字图像处理 第10章-图像分割

数字图像处理 第10章-图像分割

分割将图像细分为构成它的子区域或物体。细分的程度取决于要解决的问题。也就是说,在应用中,当感兴趣的物体或区域已经被检测出来时,就停止分割。

异常图像的分割是图像处理中最困难的任务之一。分割的精度决定着计算分析过程最终的成败。因此,应该对改进准确分割的可能性给予相当的关注。

本章中的多数分割算法均基于灰度值的两个基本性质之一:不连续性和相似性。在第一类中,方法是以灰度突变为基础分割一幅图像,比如图像的边缘。在第二类中,主要方法是根据一组预定义的准则将一幅图像分割为相似的区域。阈值处理、区域生长、区域分裂和区域聚合都是这类方法的例子。

10.1 基础知识

令R表示一幅图像占据的整个空间区域。我们可以将图像分割视为把R分为n个子区域R1,R2,…,Rn的过程,满足:
1、所有子区域并起来等于R
2、 R i R_i Ri是一个连通集, i = 1 , 2 , … , n i=1,2,…,n i=1,2,,n
3、所有子区域没有交集
4、 Q ( R i ) = T R U E , i = 1 , 2 , … , n Q(R_i)=TRUE,i=1,2,…,n Q(Ri)=TRUE,i=1,2,,n
5、 Q ( R i ⋃ R j ) = F A L S E Q(R_i⋃R_j)=FALSE Q(RiRj)=FALSE,对于任何 R i R_i Ri R j R_j Rj的邻接区域。

条件1指出,分割必须是完全的;也就是说,每个像素都必须在一个区域内。
条件2要求一个区域中的点以某些预定义的方式来连接(即这些点必须是4连接的或8连接的。
条件3指出,各个区域必须是不相交的。
条件4涉及分割后的区域中的像素必须满足的属性——例如,如果R中的所有像素都有相同的灰度级,则Q®=TRUE。
最后,条件5指出,两个邻接区域 R i R_i Ri R j R_j Rj在属性 Q Q Q的意义上必须是不同的。

10.2 点、线和边缘检测

本节将集中在以灰度局部剧烈变化检测为基础的分割方法上。我们感兴趣的三种图像特征是孤立点、线和边缘。边缘像素是图像中灰度突变的那些像素,而边缘(或边缘线段)是连接的边缘像素的集合。边缘检测器是设计用来检测边缘像素的局部图像处理方法。一条线可视为一条边缘线段,该线两侧的背景灰度要么远亮于该线像素的灰度,要么远暗于该线像素的灰度。

10.2.1 背景知识

正如在之前我们所看到的局部平均平滑一幅图像那样,假设平均处理类似于积分对于灰度的突变,局部变化可以用微分来检测应该并不奇怪。由于变化非常短促,因此一阶微分和二阶微分特别适合于这种目的。

数字函数的导数可用差分来定义。近似这些差分的方法有多种,但对于用于一阶导数的任何近似,我们要求:
(1)在恒定灰度区域必须为零
(2)在灰度台阶或斜坡开始处必须不为零
(3)在沿灰度斜坡点处也必须不为零。

类似地,对于所用的二阶导数的近似,我们要求:
(1)在恒定灰度区域必须为零
(2)在灰度台阶或斜坡的开始处和结束处必须不为零
(3)沿灰度斜坡必须为零。因为我们处理的是数字量,故它们的值是有限的,最大可能的灰度变化也是有限的,且在其上发生变化的最短距离是在两个邻接像素间的距离。

具体公式参照之前的章节,其实也是高等数学的基础知识。

10.2.2 孤立点的检测

基于前一节得到的结论,我们可知点的检测应以二阶导数为基础。由3.6.2节的讨论,这意味着使用拉普拉斯:
▽ 2 f ( x , y ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 ▽^2f(x,y)={∂^2f\over∂x^2}+{∂^2f\over∂y^2} 2f(x,y)=x22f+y22f

其中:
∂ 2 f ( x , y ) ∂ x 2 = f ( x + 1 , y ) + f ( x − 1 , y ) − 2 f ( x , y ) {∂^2f(x,y)\over∂x^2}=f(x+1,y)+f(x−1,y)-2f(x,y) x22f(x,y)=f(x+1,y)+f(x1,y)2f(x,y)
∂ 2 f ( x , y ) ∂ y 2 = f ( x , y + 1 ) + f ( x , y − 1 ) − 2 f ( x , y ) {∂^2f(x,y)\over∂y^2}=f(x,y+1)+f(x,y-1)-2f(x,y) y22f(x,y)=f(x,y+1)+f(x,y1)2f(x,y)
故:
▽ 2 f ( x , y ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 = f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) − 4 f ( x , y ) ▽^2f(x,y)={∂^2f\over∂x^2}+{∂^2f\over∂y^2}=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y-1)-4f(x,y) 2f(x,y)=x22f+y22f=f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y)

如3.6.2节中解释的那样,该表达式可以用图3.37(a)中的模板来实现。此外,如该节描述的那样,我们可以把上式扩展为包括对角项,并使用图 3.37(b)中的模板。使用图10.4(a)中的拉普拉斯模板,它与图 3.37(b)中的模板相同,如果在某点处该模板的响应的绝对值超过了一个指定的阈值,那么我们说在模板中心位置(x,y)处的该点已被检测到了。在输出图像中,这样的点被标注为1,而所有其他点则被标注为 0,从而产生一幅二值图像。换句话说,输出是使用如下表达式得到的:

g ( x , y ) = { 1 , ∣ R ( x , y ) ∣ ≥ T 0 , 其他 g(x,y)=\begin{cases} 1,|R(x,y)|≥T\\ 0, \quad 其他 \end{cases} g(x,y)={1R(x,y)T0,其他

其中,g是输出图像,T是一个非负的阈值,R由下式给出:
R = ∑ k = 1 9 w k z k R=∑^9_{k=1}w_kz_k R=k=19wkzk
其中z是像素的灰度,该像素的空间位置对应于模板中第k个系数的位置。

该式简单地度量一个像素及其8个相邻像素间的加权差。从直观上看,这一概念是一个孤立点的灰度将完全不同于其周围像素的灰度,因而,使用这种类型的模板可很容易地检测出这个孤立点。考虑的重点仅仅是灰度的不同对于研究孤立点已很充分了。注意,通常对于一个导数模板,这些系数之和为零表明在恒定灰度区域模板响应将是0。

在这里插入图片描述

10.2.3 线检测

复杂度更高的检测是线检测。基于10.2.1节中的讨论,我们知道,对于线检测,可以预期二阶导数将导致更强的响应,并产生比一阶导数更细的线。这样,对于线检测,我们也可以使用图10.4(a)中的拉普拉斯模板,记住,二阶导数的双线效应必须做适当的处理。

10.2.4 边缘模型

边缘检测是基于灰度突变来分割图像的最常用的方法。

边缘模型根据它们的灰度剖面来分类。台阶边缘是指在1个像素的距离上发生两个灰度级间理想的过渡。图 10.8(a)显示了一个垂直台阶边缘的一部分和通过该边缘的一个水平剖面。例如,用于诸如固体建模和动画领域的出现在由计算机生成的图像中的台阶边缘。这些清晰、理想的边缘可出现在1个像素的距离上,不需要提供任何使它们看上去“很真实”的附加处理(如平滑)。在算法开发中数字台阶边缘常用做边缘模型。

在这里插入图片描述

10.2.5 基本边缘检测

图像梯度及其性质
为了在一幅图像f的(x,y)位置处寻找边缘的强度和方向,所选择的工具就是梯度,梯度用▽f来表示,并用向量来定义:
▽ f ≡ g r a d ( f ) ≡ [ g x g y ] = [ ∂ f ∂ x ∂ f ∂ y ] ▽f≡grad(f)≡ \begin{bmatrix} \begin{matrix} g_x \\g_y \\\end{matrix} \end{bmatrix}= \begin{bmatrix} \begin{matrix} {∂f\over∂x}\\ \\{∂f\over∂y} \\\end{matrix} \end{bmatrix} fgrad(f)[gxgy]= xfyf

该向量有一个重要的几何性质,它指出了f在位置(x,y)处的最大变化率的方向。

向量 ▽f 的大小(长度)表示为 M(x,y),即:
M ( x , y ) = m a g ( ▽ f ) = g x 2 + g y 2 M(x,y)=mag(▽f)=\sqrt {g^2_x+g_y^2} M(x,y)=mag(f)=gx2+gy2
它是梯度向量方向变化率的值。注意, g x g y g_xg_y gxgy和 M(x,y)都是与原图像大小相同的图像,是x和y在f中的所有像素位置上变化时产生的。实践中,我们通常称后一图像为梯度图像,或者在含义很清楚时简称为梯度

梯度向量的方向由下列对于x轴度量的角度给出:
α ( x , y ) = a r c t a n [ g x g y ] α(x,y)=arctan[{g_x\over g_y}] α(x,y)=arctan[gygx]

如在梯度图像的情况那样,α(x,y)也是与由 g y g_y gy除以 g x g_x gx的阵列创建的尺寸相同的图像。任意点(x,y)处一个边缘的方向与该点处梯度向量的方向α(x,y)正交。

几种梯度算子
罗伯特算子:
g x = ∂ f ∂ x = ( z 9 − z 5 ) g_x={∂f\over∂x}=(z_9-z_5) gx=xf=(z9z5)
g y = ∂ f ∂ y = ( z 8 − z 6 ) g_y={∂f\over∂y}=(z_8-z_6) gy=yf=(z8z6)
下面是用代码实现出的效果:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('image.jpg')
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 灰度化处理图像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 罗伯特算子
kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
kernely = np.array([[0, -1], [1, 0]], dtype=int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)

absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']

# 显示图形
plt.subplot(121), plt.imshow(img_RGB), plt.title('原始图像') 
plt.subplot(122), plt.imshow(Roberts, cmap=plt.cm.gray), plt.title('罗伯特算子')
plt.savefig('output.png')
plt.show()

在这里插入图片描述

Prewitt算子:
g x = ∂ f ∂ x = ( z 7 + z 8 + z 9 ) − ( z 1 + z 2 + z 3 ) g_x={∂f\over∂x}=(z_7+z_8+z_9)-(z_1+z_2+z_3) gx=xf=(z7+z8+z9)(z1+z2+z3)
g y = ∂ f ∂ y = ( z 3 2 z 6 + z 9 ) − ( z 1 + z 4 + z 7 ) g_y={∂f\over∂y}=(z_32z_6+z_9)-(z_1+z_4+z_7) gy=yf=(z32z6+z9)(z1+z4+z7)
下面是用代码实现出的效果:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('image.jpg')
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 灰度化处理图像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Prewitt算子
kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']

# 显示图形
plt.subplot(121), plt.imshow(img_RGB), plt.title('原始图像')
plt.subplot(122), plt.imshow(Prewitt, cmap=plt.cm.gray), plt.title('Prewitt算子')
plt.savefig('output.png')
plt.show()

在这里插入图片描述

Sobel算子:
g x = ∂ f ∂ x = ( z 7 + 2 z 8 + z 9 ) − ( z 1 + 2 z 2 + z 3 ) g_x={∂f\over∂x}=(z_7+2z_8+z_9)-(z_1+2z_2+z_3) gx=xf=(z7+2z8+z9)(z1+2z2+z3)
g y = ∂ f ∂ y = ( z 3 + 2 z 6 + z 9 ) − ( z 1 + 2 z 4 + z 7 ) g_y={∂f\over∂y}=(z_3+2z_6+z_9)-(z_1+2z_4+z_7) gy=yf=(z3+2z6+z9)(z1+2z4+z7)

import cv2
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('image.jpg')
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 灰度化处理图像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Sobel算子
x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0)  # 对x求一阶导
y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1)  # 对y求一阶导
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']


# 显示图形
plt.subplot(121), plt.imshow(img_RGB), plt.title('原始图像')
plt.subplot(122), plt.imshow(Sobel, cmap=plt.cm.gray), plt.title('Sobel算子')
plt.savefig('output.png')
plt.show()

在这里插入图片描述
可以很明显的看出3个算子的区别。

10.2.6 边缘连接和边界检测

理想情况下,边缘检测应该仅产生位于边缘上的像素集合。实际上,由于噪声、不均匀照明引起的边缘间断,以及其他引人灰度值虚假的不连续的影响,这些像素并不能完全描述边缘特性。因此一般是在边缘检测后紧跟着连接算法,所设计的算法将边缘像素组合成有意义的边缘或区域边界。
局部处理
连接边缘点最简单的方法之一是在每个点(x,y)处的一个小邻域内分析像素的特点。根据预定的准则,将所有的相似点连接起来,以形成根据指定准则满足相同特性像素的一条边缘。
区域处理
我们可以使用在区域的基础上连接像素的技术,所期望的结果是该区域边界的近似。对这类处理的一种方法是函数近似,这里,我们对已知点拟合一条二维曲线。典型地,我们的兴趣在于快速执行的技术,它可对边界的基本特性产生一个近似,例如端点和凹点。多边形近似尤其有吸引力,因为在保持边界表示(如多边形的顶点)相对简单的情况下,它们可以捕捉基本形状特性。
使用霍夫变换的全局处理
一种基于像素集是否位于指定形状的曲线上的方法。一旦检测到,这些曲线就会形成边缘或感兴趣的区域边界。

10.3 阈值处理

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

10.3.1 基础知识

灰度阈值处理基础
假设图10.35(a)中的灰度直方图对应于图像f(x,y),该图像由暗色背景上的较亮物体组成,以这样的组成方式,物体像素和背景像素所具有的灰度值组合成了两种支配模式。从背景中提取物体的一种明显方法是选择一个将这些模式分开的阈值 T。然后,f(x,y)>T的任何点(x,y)称为一个对象点;否则将该点称为背景点。换句话说,分割后的图像g(x,y)由下式给出:
g ( x , y ) = { 1 , f ( x , y ) > T 0 , f ( x , y ) ≤ T g(x,y)=\begin{cases} 1,f(x,y)>T\\ 0,f(x,y)≤T \end{cases} g(x,y)={1f(x,y)T0f(x,y)T
当T是一个适用于整个图像的常数时,该公式给出的处理称为全局阈值处理。当T值在一幅图像上改变时,我们使用可变值处理这个术语。术语局部阈值处理区域阈值处理有时用于表示可变阈值处理,此时,图像中任何点(x,y)处的T值取决于(x,y)的邻域的特性(例如邻域中的像素的平均灰度)。如果T取决于空间坐标(x,y)本身,则可变阈值处理通常称为动态阈值处理或自适应阈值处理。

图 10.35(b)显示了一个更为困难的阈值处理问题,它包含有三个支配模式的直方图,例如,这三个支配模式对应于暗色背景上的两个明亮物体。这里,如果f(x,y)≤ T 1 T_1 T1,则多阈值处理把点(x,y)分类为属于背景;如果 T 1 < f ( x , y ) ≤ T 2 T_1<f(x,y)≤T_2 T1<f(x,y)T2,则分为一个物体;如果 f ( x , y ) > T 2 f(x,y)>T_2 f(x,y)>T2,则为分另一个物体。即分割的图像由下式给出:
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,f(x,y)>T_2\\ b,T_1<f(x,y)≤T_2\\ c,f(x,y)≤T_1 \end{cases} g(x,y)= af(x,y)>T2bT1<f(x,y)T2cf(x,y)T1
其中,a,b和c是任意三个不同的灰度值。
在这里插入图片描述

基于前面的讨论,我们可以凭直觉推断灰度阈值的成功与否直接关系到可区分的直方图模式的谷的宽度和深度。而影响波谷特性的关键因素是:
(1)波峰间的间隔(波峰离得越远,分离这些模式的机会越好)
(2)图像中的噪声内容(模式随噪声的增加而展宽)
(3)物体和背景的相对尺寸
(4)光源的均匀性
(5)图像反射特性的均匀性。

10.3.2 基本的全局阈值处理

正像前节说明的那样,当物体和背景像素的灰度分布十分明显时,可以用适用于整个图像的单个(全局)阈值。

在大多数应用中,通常图像之间有较大变化,即使全局值是一种合适的方法,对每一幅图像有能力自动估计阈值的算法也是需要的。下面的迭代算法可用于这一目的:

1、为全局阈值T选择一个初始估计值。
2、用 T T T分割该图像。这将产生两组像素: G 1 G_1 G1由灰度值大于T的所有像素组成, G 2 G_2 G2由所有小于等于T的像素组成。
3、对 G 1 G_1 G1 G 2 G_2 G2的像素分别计算平均灰度值(均值) m 1 m_1 m1 m 2 m_2 m2
4、计算一个新的阈值:
T = 1 2 ( m 1 + m 2 ) T={1\over2}(m_1 +m_2) T=21(m1+m2)
5、重复步骤2到步骤4,直到连续迭代中的 T T T值间的差小于一个预定义的参数 Δ T ΔT ΔT 为止

当与物体和背景相关的直方图模式间存在一个相当清晰的波谷时,这个简单的算法工作得很好。在速度是一个重要因素的情形下,参数 Δ T ΔT ΔT 用于控制迭代的次数。通常, Δ T ΔT ΔT越大,则算法执行的迭代次数越少。所选的初始阈值必须大于图像中的最小灰度级而小于最大灰度级。图像的平均灰度对于T来说是较好的初始选择。

示例代码及结果如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('image.jpg')

gray = np.mean(image)
timage = cv2.threshold(image, gray, 255, cv2.THRESH_BINARY)[1]
fig, a = plt.subplots(1, 2, figsize=(12, 6))

a[0].imshow(image, cmap='gray')
a[0].set_title('原始图像')
a[0].axis('off')

a[1].imshow(timage, cmap='gray')
a[1].set_title('使用全局阈值对图像分割的结果')
a[1].axis('off')

# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']

plt.tight_layout()
plt.savefig('output.png')
plt.show()

在这里插入图片描述

10.3.3 用 Otsu方法的最佳全局阈值处理

该方法在类间方差最大的情况下是最佳的,即众所周知的统计鉴别分析中所用的度量。基本概念是好阈值分类就它的像素灰度值而论应该是截然不同的,反过来说,就它的灰度值而言给出最好的类间分离的阈值就是最好的(最佳的)阈值。除了其最佳性之外,Otsu方法有一个重要的特性,即它完全以在一幅图像的直方图上执行计算为基础,直方图是很容易得到的一维阵列。
算法步骤如下:
1、计算输入图像的归一化直方图。使用 p i p_i pi,i=0,1,2,…,L-1表示该直方图的各个分量
2、对于k=0,1,2,…,L-1,计算累积和 P 1 ( k ) P_1(k) P1(k)
3、对于k=0,1,2,…,L-1,计算累积均值 m ( k ) m(k) m(k)
4、计算全局灰度均值 m G m_G mG
5、对于k=0,1,2,…,L-1,计算类间方差 σ B 2 ( k ) σ^2_B(k) σB2(k)
6、得到 Otsu 阈值 k ∗ k^* k,即使得 σ B 2 ( k ) σ^2_B(k) σB2(k)最大的k值。如果最大值不唯一,用相应检测到的各个最大值k的平均得到 k ∗ k^* k
7、在 k = k ∗ k=k^* k=k处计算,得到可分性度量 η ∗ η^* η

10.3.6 多阈值处理

迄今为止,我们关注的是用单一全局阈值对图像进行分割。我们可将值处理方法扩展到任意数量的阈值,因为以这种方法为基础的可分性度量也可以扩展到任意数量的分类。在K个类C1,C2,…,Ck 的情况下,类间方差可归纳为下面的表达式:
σ B 2 = ∑ k = 1 K P k ( m k − m G ) 2 σ^2_B=∑^K_{k=1}P_k(m_k-m_G)^2 σB2=k=1KPk(mkmG)2
其中
P k = ∑ i ∈ C k p i P_k=∑_{i∈C_k}p_i Pk=iCkpi
m k = 1 P k ∑ i ∈ C k i p i m_k={1\over P_k}∑_{i∈C_k}ip_i mk=Pk1iCkipi

假定对于三个灰度间隔组成的三个类,类间方差为:
σ B 2 = P 1 ( m 1 − m G ) 2 + P 2 ( m 2 − m G ) 2 + P 3 ( m 3 − m G ) 2 σ^2_B=P_1(m_1-m_G)^2+P_2(m_2-m_G)^2+P_3(m_3-m_G)^2 σB2=P1(m1mG)2+P2(m2mG)2+P3(m3mG)2
多个阈值的可分性度量可以有单个阈值定义扩展而来。

10.3.7 可变阈值处理

图像分块
可变阈值处理最简单的方法之一是把一幅图像分成不重叠的矩形。这种方法用于补偿光照和/或反射的不均匀性。选择的矩形要足够小,以便每个矩形的光照都近似是均匀的。
基于局部图像特性的可变阈值处理
更为一般的方法是在一幅图像中的每一点(x,y)计算阈值,该阈值是以一个或多个在(x,y)邻域计算的特性为基础的。虽然这可能是似乎有点费力的处理,但现代算法和硬件允许进行快速的邻域处理,特别是对于像逻辑操作和算术操作这样的普通函数。

使用移动平均
刚才讨论的局部阈值处理方法的一种特殊情形是以一幅图像的扫描行计算移动平均为基础的。在速度是一种基本要求的文档处理中,这种实现相当有用。典型地,为减少光照偏差,扫描是以Z字形模式逐行执行的。

10.3.8 多变量阈值处理

在某些情况下,传感器可产生多个可利用的变量来表征图像中的每个像素,这样,就允许进行多变量阈值处理。一个显著的例子就是彩色成像,其中红®、绿(G)和蓝(B)分量用于形成一幅合成彩色图像。在这种情况下每个“像素”由三个值来表征。这些三维点通常称为体素,以便与图像元素相对应表示体积元素。

10.4 基于区域的分割

10.4.1 区域生长

正如它的名字所暗示的那样,区域生长是根据预先定义的生长准则将像素或子区域组合为更大区域的过程。基本方法是从一组“种子”点开始,将与种子预先定义的性质相似的那些邻域像素添加到每个种子上来形成这些生长区域(如特定范围的灰度或颜色)。

令f(x,y)表示一个输入图像阵列;
S(x,y)表示一个种子阵列,阵列中种子点位置处为1,其他位置处为 0;
Q表示在每个位置(x,y)处所用的属性。假设阵列f和S的尺寸相同。基于8连接的一个基本区域生长算法可说明如下。

1、在 S(x,y)中寻找所有连通分量,并把每个连通分量腐蚀为一个像素;把找到的所有这种像素标记为1,把S中的所有其他像素标记为0。
2、在坐标对(x,y)处形成图像 f Q f_Q fQ:如果输入图像在该坐标处满足给定的属性Q,则令 f Q ( x , y ) = 1 f_Q(x,y)=1 fQ(x,y)=1,否则令 f Q ( x , y ) = 0 f_Q(x,y)=0 fQ(x,y)=0
3、令g是这样形成的图像:即把 f Q f_Q fQ中为8连通种子点的所有1值点,添加到S中的每个种子点
4、用不同的区域标记(如 1,2,3,…)标出g中的每个连通分量。这就是由区域生长得到的分割图像。

10.4.2 区域分裂与聚合

首先将一幅图像细分为一组任意的不相交区域,然后聚合或分裂这些区域,并力图满足10.1节中阐述的分割条件。

在该过程的任何一步中,我们:

1.对满足 Q ( R i ) = F A L S E Q(R_i)= FALSE Q(Ri)=FALSE 的任何区域 R i R_i Ri 分裂为4个不相交的象限区域。
2.当不可能进一步分裂时,对满足条件 Q ( R j ⋃ R k ) = T R U E Q(R_j⋃R_k)=TRUE Q(RjRk)=TRUE的任意两个邻接区域 R j R_j Rj R k R_k Rk进行聚合
3.当无法进一步聚合时,停止操作。

10.5 用形态学分水岭的分割

10.5.1 分水岭分割算法

分水岭的概念是以三维形象化一幅图像为基础的:两个空间坐标作为灰度的函数。

在这种“地形学”解释中,我们考虑三种类型的点:

(a)属于一个区域最小值的点;

(b)把一点看成是一个水滴,如果把这些点放在任意位置上,水滴一定会下落到一个单一的最小值点;

©处在该点的水会等可能性地流向不止一个这样的最小值点。

对于一个特定的区域最小值,满足条件(b)的点的集合称为该最小值的汇水盆地分水岭。满足条件©的点形成地表面的峰线,这种峰线称为分割线分水线

基于这些概念的分割算法的主要目标是找出分水线,其基本思想非常简单,如下面类似的说明那样。假设在每个区域的最小值上打一个洞,并且让水通过洞以均匀的速率上升,从低到高淹没整个地形。当不同的汇水盆地中上升的水聚集时,修建一个水坝来阻止这种聚合。水将达到在水线上只能见到各个水坝的顶部这样一个程度。这些大坝的边界对应于分水岭的分割线。因此,它们是由分水岭算法提取出来的(连接的)边界。

水坝的构造是以二值图像为基础的,这种图像是二维整数空间 Z 2 Z_2 Z2的成员。构建分离二元点集的水坝的最简方法是使用形态学膨胀。

分水岭分割算法通常会由于噪声和梯度的其他局部不规则性造成过度分割,如图10.57所示,过度分割的严重性足以令算法得到的结果变得毫无用处。在这种情况下这意味着存在大量的分割区域。一个实际解决该问题的方案是通过融入预处理步骤来限制允许存在的区域的数目,设计的预处理步骤是将附加知识应用于分割过程。

在这里插入图片描述

10.6 分割中运动的应用

10.6.1 空间域技术

基本方法
分别检测在时刻 t i t_i ti t j t_j tj获取的两帧图像帧 f ( x , y , t i ) f(x,y,t_i) f(x,y,ti) f ( x , y , t j ) f(x,y,t_j) f(x,y,tj)之间的变化的最简方法之一是逐像素地比较这两幅图像。这样做的一个过程是形成一幅差值图像。假设我们有一幅仅包含固定分量的参考图像。将这幅图像和一幅后续的相同场景但包含一个运动物体的图像进行比较,去掉两幅图像中的固定元素,仅保留对应于非固定图像分量的非零项,就可得到两幅图像的差。

累积差值
考虑一个图像帧序列 f ( x , y , t 1 ) , f ( x , y , t 2 ) , … , f ( x , y , t n ) , f(x,y,t_1),f(x,y, t_2),…,f(x,y,t_n), f(x,y,t1),f(x,y,t2),,f(x,y,tn)令# f ( x , y , t 1 ) f(x,y,t_1) f(x,y,t1)为参考图像。一幅累积差值图像(ADI)是通过将参考图像与序列中每幅后续图像进行比较形成的。当参考图像和序列中一幅图像之间在某个像素位置上出现一次差异时,累积图像中每个像素位置的计数器计数一次。因此,当第k帧图像与参考图像进行比较时,累积图像中一个给定像素的输入项会给出在此位置上灰度与参考图像相应的像素值不同的次数。

建立参考图像
在动态成像问题中,两幅图像的差值倾向于消除图像中的所有固定分量,而只留下对应于噪声和运动物体的图像元素。
实际上,仅用固定元素得到一幅参考图像并不总是可行的,所以有必要根据一组包含一个或多个运动物体的图像来构建一幅参考图像。这尤其适用于描述变化频繁的场景或需要频繁更新的场景的情况。生成参考图像的过程如下所述。考虑将图像序列中的第一幅图像作为参考图像。当一个非固定分量完全移出其参考帧的位置时,在当前帧中对应的背景可复制到最初被参考帧中的物体所占据的位置。当所有的移动物体均已完全移出其原来的位置时,就创建了一幅仅包含固定分量的参考图像。像前节中说明的那样,通过监视正ADI中的变化,可确定物体的位移。

10.6.2 频率域技术

在这一节中,我们考虑通过傅里叶变换公式来确定运动的问题。考虑一个序列 f ( x , y , t ) , 1 = 1 , 2. … K − 1. f(x,y,t),1= 1,2.…K-1. f(x,y,t),1=1,2.K1.该序列是由一台固定的照相机所拍摄的大小为M*N的K帧数字图像。我们从假设所有帧都有零灰度的均匀背景开始讨论。

对于一个由K幅大小为M*N的数字图像序列,在任何整数的瞬时点上,图像投影到x轴上的加权和为:
g x ( t , a 1 ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y , t ) e j 2 π a 1 x Δ t , t = 0 , 1 , ⋅ ⋅ ⋅ , K − 1 g_x(t,a_1)=∑_{x=0}^{M-1}∑_{y=0}^{N-1}f(x,y,t)e^{j2πa_1xΔt},t=0,1,···,K-1 gx(t,a1)=x=0M1y=0N1f(x,y,t)ej2πa1xΔtt=0,1,⋅⋅⋅,K1
y轴类似:
g y ( t , a 2 ) = ∑ y = 0 N − 1 ∑ x = 0 M − 1 f ( x , y , t ) e j 2 π a 2 y Δ t , t = 0 , 1 , ⋅ ⋅ ⋅ , K − 1 g_y(t,a_2)=∑_{y=0}^{N-1}∑_{x=0}^{M-1}f(x,y,t)e^{j2πa_2yΔt},t=0,1,···,K-1 gy(t,a2)=y=0N1x=0M1f(x,y,t)ej2πa2yΔtt=0,1,⋅⋅⋅,K1
a 1 a_1 a1 a 2 a_2 a2都是正整数

这些变换的计算是使用FFT算法执行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值