第一部分 图像代数 — 数学形态学

63

Click here to load reader

Upload: lionel

Post on 12-Jan-2016

84 views

Category:

Documents


6 download

DESCRIPTION

第一部分 图像代数 — 数学形态学. 一、 引言 二、 二值形态学 三、 形态学的应用 四、 应用实例 —— 细化. 1 . 引 言. 数学形态学 (Mathematical Morphology) 诞生于 1964 年,是由法国巴黎矿业学院博士生赛拉 (J. Serra) 和导师马瑟荣,在从事铁矿核的定量岩石学分析及预测其开采价值的研究中提出 “ 击中 / 击不中变换 ” , 并在理论层面上第一次引入了形态学的表达式,建立了颗粒分析方法。他们的工作奠定了这门学科的理论基础。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第一部分 图像代数 — 数学形态学

第五章图像平滑

第一部分 图像代数—数学形态学

一、 引言

二、 二值形态学

三、 形态学的应用

四、 应用实例——细化

Page 2: 第一部分 图像代数 — 数学形态学

第五章图像平滑

1 . 引 言 数学形态学 (Mathematical Morphology) 诞生于 1964 年,是由法国巴黎矿业学院博士生赛拉 (J. Serra) 和导师马瑟荣,在从事铁矿核的定量岩石学分析及预测其开采价值的研究中提出“击中 / 击不中变换”, 并在理论层面上第一次引入了形态学的表达式,建立了颗粒分析方法。他们的工作奠定了这门学科的理论基础。

数学形态学的基本思想是用具有一定形态的结构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。

Page 3: 第一部分 图像代数 — 数学形态学

第五章图像平滑

数学形态学的数学基础和所用语言是集合论,因此它具有

完备的数学基础,这为形态学用于图像分析和处理奠定了坚实

的基础。

数学形态学的应用可以简化图像数据,保持它们基本的形

状特性,并除去不相干的结构。

数学形态学的算法具有天然的并行实现的结构, 实现了形

态学分析和处理算法的并行,大大提高了图像分析和处理的速

度。

Page 4: 第一部分 图像代数 — 数学形态学

第五章图像平滑 数学形态学的基本运算有 4 个: 膨胀(或扩张)、腐蚀(或侵蚀)、开启和闭合, 它们对图像的处理各有特点。

基于这些基本运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析及处理,包括图像分割、特征抽取、边界检测、 图像滤波、图像增强和恢复等。数学形态学方法利用一个称作结构元素的“探针”收集图像的信息,当探针在图像中不断移动时, 便可考察图像各个部分之间的相互关系,从而了解图像的结构特征。

Page 5: 第一部分 图像代数 — 数学形态学

第五章图像平滑 基本符号和术语

1. 元素和集合 在数字图像处理的数学形态学运算中,把一幅图像称为一个集合。

对于二值图像而言,将整幅图像看作是由目标和背景组成,目标中所有

的像素组成集合 A ,背景中所有像素就是集合 A 的补集, 集合 A 中元素与

目标中像素是一一对应的。

对于一幅图像,如果点 a 在 A 的区域以内, 那么就说 a 是 A 的元素,记

为 a A∈ ,否则,记作 a A∈ , 如下图( a )所示。

a

A

b

B A

(a ) (b )

Page 6: 第一部分 图像代数 — 数学形态学

第五章图像平滑

2. 交集、 并集和补集

并集: 两个图像集合 A 和 B 的公共点组成的集合称为两个集合的交集, 记

为 A∩B ,即 A∩B={a | a A∈ 且 a∈B} 。

交集:两个集合 A 和 B 的所有元素组成的集合称为两个集合的并集,记为 A

∪B ,即 A∪B={a | a∈A 或 a∈B} 。

补集:对一幅图像 A ,在图像 A 区域以外的所有点构成的集合称为 A 的补集,记为 AC ,即 AC={a | a ∈ A} 。

交集、并集和补集运算是集合的最基本的运算,如下图所示。

B

A

B

A

B

A

A CA ¡ÈBA ¡ÉB

Page 7: 第一部分 图像代数 — 数学形态学

第五章图像平滑

3. 击中( Hit )与击不中( Miss )

设有两幅图像 A 和 B ,如果 A∩B≠ ,那么称 B 击中 A ,记为 B↑A , 其中 是空集合的符号;否则,如果 A∩B= , 那么称B 击不中 A , 如图所示。

图 击中与击不中( a ) B 击中 A ; ( b ) B 击不中 A

(a ) (b )

AB B

A

Page 8: 第一部分 图像代数 — 数学形态学

第五章图像平滑

4. 平移和反射

设 A 是一幅数字图像(见图 (a) ), b 是一个点(见图 (b) ),那么定

义 A 被 b 平移后的结果为 A + b = {a + b| a∈A} ,即取出 A 中的每个点 a

的坐标值,将其与点 b 的坐标值相加,得到一个新的点的坐标值 a+b ,所有

这些新点所构成的图像就是 A 被 b 平移的结果,记为 A+b ,如图( c )所示。

0 1 2 3 4 x

y

1

2

3

4

5

(a )

x0 1 2 3 4

1

2

3

y

(b )

b

0 1 2 3 4 x

y

1

2

3

4

5

y

1

2

3

4

01234x

(c ) (d )

图 平移与反射

Page 9: 第一部分 图像代数 — 数学形态学

第五章图像平滑

5. 目标和结构元素

将要被处理的图像称为目标图像,一般用大写英文字母表示。

“ 结构元素”一般也用大写英文字母表示,例如用 S 表示。在图像中不断移动结构元素, 就可以考察图像之间各部分的关系。一般,结构元素的尺寸要明显小于目标图像的尺寸。

(a ) (b ) (c )

£«

Page 10: 第一部分 图像代数 — 数学形态学

第五章图像平滑

2. 二值形态学 设 A 为图像集合, S 为结构元素,数学形态学运算是用 S

对 A 进行操作。对每个结构元素需要指定一个原点,它是结构

元素参与形态学运算的参考点。 原点可以包含在结构元素中,

也可以不包含在结构元素中,但运算的结果常不相同。二值形

态学中两个最基本的运算——腐蚀与膨胀,如图所示。

Page 11: 第一部分 图像代数 — 数学形态学

第五章图像平滑

腐蚀与膨胀示意图

¶þֵͼÏñ

¸¯Ê´ ÅòÕÍ

Page 12: 第一部分 图像代数 — 数学形态学

第五章图像平滑

1. 腐蚀

对一个给定的目标图像 X 和一个结构元素 S , 将 S 在图像上移动。在每一个当前位置 x , S+x只有三种可能的状态(见图):

(1) S+x X ; (2) S+x XC ; (3) S+x∩X 与 S+x∩XC均

不为空。

x

S £«x1

S £«x 2

S £«x 3

S+x 的三种可能的状态

Page 13: 第一部分 图像代数 — 数学形态学

第五章图像平滑 第一种情形说明 S+x 与 X 相关最大,第二种情形说明 S+x 与X 不相关,而第三种情形说明 S+x 与 X只是部分相关。因而满足式 (8-1) 的点 x 的全体构成结构元素与图像最大相关点集,这个点集称为 S 对 X 的腐蚀 ( 简称腐蚀,有时也称 X 用 S腐蚀 ) ,记为 XS 。

腐蚀也可以用集合的方式定义,即

上式表明, X 用 S腐蚀的结果是所有使 S 平移后仍在 X 中的 x

的集合。换句话说,用 S来腐蚀 X得到的集合是 S 完全包括在 X

中时 S 的原点位置的集合。

}|{ XxSxSX

Page 14: 第一部分 图像代数 — 数学形态学

第五章图像平滑

腐蚀在数学形态学运算中的作用是消除物体边界点。如果结构元素取 3×3 的像素块,腐蚀一次将使物体的边界沿周边减少一个像素。腐蚀可以把小于结构元素的物体 (毛刺、 小凸起 ) 去除,这样选取不同大小的结构元素,就可以在原图像中去掉不同大小的物体。如果两个物体之间有细小的连通,那么当结构元素足够大时, 通过腐蚀运算可以将两个物体分开。

Page 15: 第一部分 图像代数 — 数学形态学

第五章图像平滑

例腐蚀运算图解。给出腐蚀运算的一个简单示例。其中, 图 (a) 中的阴影部分为集合 X , 图 (b) 中的阴影部分为结构元素 S , 而图 (c) 中黑色部分给出了 X 被 S腐蚀 的结果。由图可见,腐蚀将图像(区域)收缩小了。

图 腐蚀运算示例

(a ) (b ) (c )

£«

Page 16: 第一部分 图像代数 — 数学形态学

第五章图像平滑

如果 S 包含了原点,即 O S∈ , 那么 X S 将是 X 的一个收

缩, 即 X S X (当 O S∈ 时);如果 S 不包含原点,那么 X S

X未必成立。如果结构元素 S 关于原点 O 是对称的, 那么 S=SV ,

因此 X S=X S V, 但是,如果 S 关于原点 O 不是对称的,那么 X

被 S腐蚀的结果与 X 被 SV腐蚀的结果是不同的。

Page 17: 第一部分 图像代数 — 数学形态学

第五章图像平滑

2. 膨胀

膨胀记为 XS 。若用集合语言,它的定义为

X S = {x| S+x∪x≠ }

与上式等价的膨胀运算定义形式还有:

( 1 ) X S = ∩{X+s| s S} ∈

( 2 ) X S = ∩{S+x| x X} ∈

另外,用腐蚀和膨胀运算还可以实现图像的平移。如果在自定义结构元素时选择不在原点的一个点作为结构元素,则得到的图像形状没有任何改变, 只是位置发生了移动。

Page 18: 第一部分 图像代数 — 数学形态学

第五章图像平滑 开、闭运算

1. 基本概念

一般来讲,膨胀可填充图像中的小孔 (比结构元素小的孔洞 ) 及图像边缘处的小凹陷部分;而腐蚀可以消除图像边缘小的成分,并将图像缩小。

对二值图像来讲,对目标的腐蚀就是对背景的膨胀,对目标的膨胀就是对背景的腐蚀。

但是, 膨胀和腐蚀并不互为逆运算,也就是说对图像先腐蚀再膨胀的结果与对图像先膨胀在腐蚀得到的结果是不同的。

先对图像进行腐蚀然后再膨胀其结果(使用同一个结构元素)称为开运算(或开启)。

先对图像进行膨胀然后腐蚀其结果(使用同一个结构元素)称为闭运算(闭

合)。开运算和闭运算是形态学运算族中两个最为重要的组合运算。

Page 19: 第一部分 图像代数 — 数学形态学

第五章图像平滑 对图像 X 及结构元素 S ,用符号 X○S 表示 S 对图像 X 作开运算, 用符号 X●S 表示 S 对图像 X 作闭运算,它们的定义为

X○S = (XS)S

X●S = (XS)S

X○S 可视为对腐蚀图像 XS 用膨胀来进行恢复,而 X●S 可看

作是对膨胀图像 XS 用腐蚀来进行恢复。不过这一恢复不是信息

无损的,即它们通常不等于原始图像 X 。

Page 20: 第一部分 图像代数 — 数学形态学

第五章图像平滑 图中给出了两个开运算的例子,其中图( a )是结构元素 S1 和 S2 , 图中( b )是用 S1 对 X 进行开运算的结果,图中( c )是用 S2 对 X 进行开运算的结果。当使用圆盘结构元素时, 开运算对边界进行了平滑,去掉了凸角;当使用线段结构元素时,沿线段方向宽度较大的部分才能够被保留下来,而较小的凸部将被剔除。而 X- X○S给出的是图像的凸出特征。可见,不同的结构

元素的选择导致了不同的分割,即提取出不同的特征。

x

y

O

S 1

y

xS 2O

X

X ¡ðS 1 X ¡ðS 2

X

(a ) (b ) (c )

图 开运算去掉了凸角(a) 结构元素 S1 和 S2 ; (b) X○S1 ; (c) X○S2

Page 21: 第一部分 图像代数 — 数学形态学

第五章图像平滑

开启和闭合不受原点是否在结构元素之中的影响。

图给出了两个闭运算的例子, 其中,图( a )是结构元素 S1 和 S2 ,

图( b )是用 S1 对 X 进行闭运算的结果,图( c )是用 S2 对 X 进

行闭运算的结果。可见, 闭运算通过填充图像的凹角来平滑图像,而 X●S- X给出的是图像的凹入特征。

x

y

O

S 1

y

xS 2O

X

X ¡ñS 2

X

(a ) (b ) (c )

X ¡ñS 1S 1

S 1

Page 22: 第一部分 图像代数 — 数学形态学

第五章图像平滑

Page 23: 第一部分 图像代数 — 数学形态学

第五章图像平滑

Page 24: 第一部分 图像代数 — 数学形态学

第五章图像平滑

Page 25: 第一部分 图像代数 — 数学形态学

第五章图像平滑

Page 26: 第一部分 图像代数 — 数学形态学

第五章图像平滑

击中/击不中 (Hit/Miss) 变换

曾经简单地给出了击中与击不中的概念, 下面讨论击中与击不中的严格定义及其在数字图像处理中的意义。一般来说,一个物体的结构可以由物体内部各种成分之间的关系来确定。为了研究物体(在这里指图像)的结构,可以逐个地利用各种成分 (例如各种结构元素 ) 对其进行检验,判定哪些成分包括在图像内,哪些在图像外,从而最终确定图像的结构。击中 / 击不中变换就是在这个意义上提出的。设 X 是被研究的图像, S 是结构元素,而且 S 由两个不相交的部分 S1 和 S2 组成,即 S=S1∪S2 ,且 S1∩S2

= 。于是, X 被 S“ 击中”( X⊙S )的结果定义为

}|{ 21CXxSXxSxSX 且 (8-11)

Page 27: 第一部分 图像代数 — 数学形态学

第五章图像平滑

图 8-14 X 被 S 击中示意图(a) 结构元素 S=S1∪S2 ; (b) 图像 X ; (c) X 被 S 击中 X⊙S

xO

S1

S

y

S2

y

x x

y

0 1 2 3 4

1

2

3

4X

0 1 2 3 4

1

2

3

4X ¡ÑS

(a ) (b ) (c )

Page 28: 第一部分 图像代数 — 数学形态学

第五章图像平滑

击中运算还有另外一种表达形式:

)()(

)()(

)()(

21

21

21

V

CV

C

SXSX

SXSX

SXSXSX

式( 8-12 )表明, X 被 S 击中的结果相当于 X 被 S1腐蚀的

结果与 X 被 S2 的反射集 S2V膨胀的结果之差。图 8-15 解释了这

一过程。由此可见,击中运算也可以借助于腐蚀、膨胀两基本运

算来实现。

Page 29: 第一部分 图像代数 — 数学形态学

第五章图像平滑

8-15

y

xS

S 2

O

S 1

x

y

0 1 2 3 4

1

2

3

4

x

y

0 1 2 3 4

1

2

3

4X

V2S

V2SX

X S1

xx0 1 2 3 4 5

1

2

3

4

y

0 1 2 3 4 5

1

2

3

4

y

(a ) (b ) (c )

(d ) (e )

)( ) ( 21vSXSXSX ¡Ñ £

Page 30: 第一部分 图像代数 — 数学形态学

第五章图像平滑

下面,进一步来讨论击中运算的含义。在图 8-15 中,如果 S

中不包含 S2 ,那么 X⊙S 与 X⊙S1 相同,共包括 6 个点。这表明

X 被 S腐蚀后还剩 6 个点,就是说, X 中共包含 6 个形如 S1 的结

构元素,它们的原点位置构成 X⊙S 。但将 S2 加入 S 后,相当于

对 X⊙S 增加了一个条件:不仅要从 X 中找出那些形如 S1 的部分,

而且要去掉那些在左边有一个邻点的部分。这样一来,在 X 中只

剩下两部分 ( 方框内 )满足要求的结构元素,它们的原点位置构

成了最终的 X⊙S 。

Page 31: 第一部分 图像代数 — 数学形态学

第五章图像平滑

由此可见,击中运算相当于一种条件比较严格的模板匹配, 它不仅指出被匹配点所应满足的性质即模板的形状,同时也指出这些点所不应满足的性质,即对周围环境背景的要求。击中 /

击不中变换可以用于保持拓扑结构的形状细化,以及形状识别和定位。设有一个模板形状 ( 集合 )A ,对给定的图像 X ,假定X 中有包括 A 在内的多个不同物体。我们的目的是识别和定位其中的 A物体。此时,取一个比 A稍大的集合 S 作为结构元素并且使 A 不与 S 的边缘相交,令 S1=A 且 S2=S-A , S2 为“包围” A 或 B1 的外接边框, 此时称 S1 、 S2 为一个结构元素对,简称结构对,记为( S1 , S2 ), 那么 X (⊙ S1, S2) 将给出且仅给出所有 X 中与 A误差在设定范围内的物体的位置。图 8-16描述了一个字符识别的示例。

Page 32: 第一部分 图像代数 — 数学形态学

第五章图像平滑

图 8-16 用击中 / 击不中变换识别字符( a ) 结构元素 S ; ( b ) 图像 X ; ( c ) X⊙( S1 , S2 )

S1

S 2

(a ) (b ) (c )

Page 33: 第一部分 图像代数 — 数学形态学

第五章图像平滑

3. 形态学的应用

形态学滤波

由于开、闭运算所处理的信息分别与图像的凸、凹处相关,

因此,它们本身都是单边算子,可以利用开、闭运算去除图像

的噪声、恢复图像,也可交替使用开、闭运算以达到双边滤波

目的。一般,可以将开、闭运算结合起来构成形态学噪声滤波

器,例如 (X○S)●S 或 (X●S)○S 等。

Page 34: 第一部分 图像代数 — 数学形态学

第五章图像平滑

图 8-23 形态学滤波示意图

Page 35: 第一部分 图像代数 — 数学形态学

第五章图像平滑

比较图中 (a) 和 (f) ,可看出目标区域内外的噪声都消除掉

了,而目标本身除原来的 4 个直角变为圆角外没有太大的变化。

在利用开、 闭运算滤除图像的噪声时,选择圆形结构元素会得

到较好的结果。

Page 36: 第一部分 图像代数 — 数学形态学

第五章图像平滑

8.4.2 骨架抽取

把一个平面区域简化成图( Graph )是一种重要的结构形

状表示法。利用细化技术得到区域的细化结构是常用的方法。

因此, 寻找二值图像的细化结构是图像处理的一个基本问题。

在图像识别或数据压缩时,经常要用到这样的细化结构,例如,

在识别字符之前,往往要先对字符作细化处理,求出字符的细

化结构。骨架便是这样的一种细化结构,它是目标的重要拓扑

描述,具有非常广泛的应用。

Page 37: 第一部分 图像代数 — 数学形态学

第五章图像平滑

下面首先对数字图像细化概念做简要介绍。许多数学形态学算法都依赖于击中 / 击不中变换。其中数字图像细化,便是一种最常见的使用击中 / 击不中变换的形态学算法。对于结构对 B=

(B1 , B2) ,利用 B细化 X 定义为

)( BXXBX

即 X B 为 X 与 XB 的差集。更一般地,利用结构对序列 B1 , B2 ,…, BN迭代地产生输出序列

NNN BXXBXXBXX 121211 ,,,

( 8-30 )

( 8-31 ) 或者

)))(((}{}{ 21 Nii BBBXBXX i=1, 2, …, N ( 8-32 )

Page 38: 第一部分 图像代数 — 数学形态学

第五章图像平滑

随着迭代的进行,得到的集合也不断细化。假设输入集合

是有限的(即 N 为有限),最终将得到一个细化的图像。结构

对的选择仅受结构元素不相交的限制。事实上, 每一个 Bi(i=1,

2, …, N)都可以是相同的结构对,即在不断重复的迭代细化过程

使用同一个结构对。在实际应用中,通常选择一组结构元素对,

迭代过程不断在这些结构对中循环,当一个完整的循环结束时,

如果所得结果不再变化, 则终止迭代过程。

Page 39: 第一部分 图像代数 — 数学形态学

第五章图像平滑

骨架还可以用中轴表示。设想在t=0时刻,将目标边界各处同时点燃,火的前沿以匀速向目标内部蔓延,当前沿相交时火焰熄灭,火焰熄灭点的集合就构成了中轴。图 8-24(a) 是这个过程的图示。另外一种定义骨架的方法使用了最大圆盘概念: 目标X 的骨架由 X 内所有最大内切圆盘的圆心组成,如图 8-24(b) 、(c) 所示。最大圆盘不是其他任何完全属于 X 的圆盘的子集,并且至少有两点与目标边界轮廓相切。骨架的每个点都对应一个相应的最大圆盘和半径 r 。最大圆盘定义的骨架与火种方式定义的骨架除在某些特殊情况下端点处存在差异外,绝大多数情况下都是一致的。

Page 40: 第一部分 图像代数 — 数学形态学

第五章图像平滑

图 8-24 骨架的定义

Page 41: 第一部分 图像代数 — 数学形态学

第五章图像平滑

按照最大圆盘定义骨架的方式,在欧氏二值图像的内部任意

给定一点,如果以该点为圆心存在一个最大圆盘,其整个盘体

都在图像的内部, 且至少有两点与目标边界相切,则该点便是

骨架上的点。所有最大圆盘的圆心构成了图像的骨架(中轴)。

对于图像 X ,一般用 S(X) 表示其骨架。注意,不同的图像可能

有相同的骨架。骨架对噪声非常敏感,而且连通的集合可能具

有不连通的骨架(例如两个相切圆盘的骨架)。

Page 42: 第一部分 图像代数 — 数学形态学

第五章图像平滑 数字骨架可以从形态学的角度进行定义。对于 k = 0 , 1 , 2 ,…, 定义骨架子集 Sk ( X )为图像 X 内所有最大圆盘 kB

的圆心 x 构成的集合。从骨架的定义可知,骨架是所有骨架子集的并, 即

S(X)= { ∪ Sk ( X ) | k = 0 , 1 , 2 , … }

( 8-33 )

可以证明骨架子集为

Sk ( X ) = (XkB)-[ (X k B ) ○B]

式中, B 为结构元素, (X kB ) 代表连续 k 次用 B 对 X腐蚀,即 (X kB)= ((… (XB )B)…) B。由此式和式( 8-33 )可得

S(X) = ∪{ (XkB)-[ (X kB ) ○B] | k = 0 , 1 , 2 , …}( 8-34 )

Page 43: 第一部分 图像代数 — 数学形态学

第五章图像平滑

这就是骨架的形态学表示,它也是用数学形态学方法提取图像骨架技术的依据。对于给定的图像 X 以及结构元素B, (Xk

B ) 可以将 X腐蚀为空集,如果用 N 表示 (X k B ) 运算将 X腐蚀成空集前的最后一次迭代次数,即 N =max{k | (X kB )≠ } ,则式( 8-34 )可以写为

]})[(){()(0

BkBXkBXXSN

k

( 8-35 )

相反,图像 X也可以用 Sk ( X )重构,即

})({0

kBXSX k

N

k

( 8-36 )

Page 44: 第一部分 图像代数 — 数学形态学

第五章图像平滑

式中, B 为结构元素, (Sk(X) ⊕ kB) 代表连续 k 次用 B 对 S

k(X)膨胀, 即 BBBXSkBXS kk )))(((())(( )

利用式( 8-35 )以及图像腐蚀、膨胀的算法可以编写程序实现形态学骨架抽取变换,有兴趣的读者请参考书后的参考文献。图 8-25给出了用形态学方法抽取图像骨架的一个实例。其中,图 8-25(a) 为一幅二值图像,图 8-25(b) 为用 3×3 的结构元素 S (原点在中心)得到的骨架,图 8-25(c) 为用 5×5 的结构元素得到的骨架,图 8-25(d) 为用 7×7 的结构元素得到的骨架。注意图 8-25(c) 和 (d) 中由于模板较大叶柄没有保留下来。

Page 45: 第一部分 图像代数 — 数学形态学

第五章图像平滑

图 8-25 骨架抽取示例(a) 一幅二值图像; ( b ) 用 3×3 的结构元素 S得到的骨架;

(c ) 用 5×5 的结构元素得到的骨架; ( d )用 5×5 的结构元素得到的骨架

Page 46: 第一部分 图像代数 — 数学形态学

第五章图像平滑

8.5 应用实例——细化

利用前面所介绍的形态学知识,下面给出一种实用的对二值

区域进行形态学细化的一种算法。如前所述,一个图像的“骨

架”, 是指图像中央的骨骼部分,是描述图像几何及拓扑性质

的重要特征之一。求一幅图像骨架的过程就是对图像进行“细

化”的过程。在文字识别、地质构造识别、工业零件形状识别或

图像理解中, 先对被处理的图像进行细化有助于突出形状特点

和减少冗余信息量。

Page 47: 第一部分 图像代数 — 数学形态学

第五章图像平滑

在细化一幅图像 X 时应满足两个条件: 第一, 在细化的

过程中, X 应该有规律地缩小; 第二,在 X逐步缩小的过程中,

应当使 X 的连通性质保持不变。下面介绍一个具体的细化算法。

设已知目标点标记为 1 ,背景点标记为 0 。边界点是指本

身标记为 1 而其 8连通邻域中至少有一个标记为 0 的点。算法

对一幅图像的所有边界点即一个 3×3 区域都进行如下检验和操

作:

Page 48: 第一部分 图像代数 — 数学形态学

第五章图像平滑

( 1 ) 考虑以边界点为中心的 8邻域,设 p1 为中心点,对其

邻域的 8 个点逆时针绕中心点分别标记为 p2 , p3 ,…, p9 ,其

中 p2位于 p1 的上方。如果 p1=1( 即黑点 ) 时,下面 4 个条件同

时满足,则删除 p1(p1=0) :

① 2≤N(p1)≤6 ,其中 N(p1) 是 p1 的非零邻点的个数;

② S(p1) = 1 ,其中 S(p1) 是以 p2 , p3 , p4 ,…, p9 为序时

这些点的值从 0到 1 变化的次数;

③ p2p4p6=0 或者 S(p1)≠1 ;

④ p4p6p8 =0 或者 S(p1)≠1 。

Page 49: 第一部分 图像代数 — 数学形态学

第五章图像平滑

( 2 ) 同第( 1 )步,仅将③中的条件改为 p2p4p8=0 ,④中

的条件改为 p2p6p8=0 。同样当对所有边界点都检验完毕后,将

所有满足条件的点删除。

以上两步操作构成一次迭代。算法反复迭代,直至没有点

再满足标记删除的条件,这时剩下的点就组成区域的骨架。图

8-26给出了这一算法的应用示例。其中,图 8-26(b) 、 (c) 、 (d)

是 p1 不可删除的三种情况。在图 8-26(b) 中删除 p1会分割区域,

图 8-26(c) 中删除 p1会分割缩短边缘,图 8-26(d) 中满足条件 2≤

N(p1)≤6但 p1 不可删除。

Page 50: 第一部分 图像代数 — 数学形态学

第五章图像平滑

图 8-26 细化算法示意图(a) 标记 p1 和邻点; (b) p1 不可删除情况一; (c) p1 不可删除情况二;

(d) p1 不可删除情况三; (e) 细化前图像; (f) 细化后的结果

p3

p2

p9

p 4 p 1 p 8

p5

p6

p7

(a )

1

(b )

1

0

p 1

1 0

1

0 0

0

(c )

1

0

p 1

0 0

0

0 0

1

(d )

0

1

p 1

0 1

0

1 1

(e ) ( f )

Page 51: 第一部分 图像代数 — 数学形态学

第五章图像平滑 下面是上述细化算法的 VC++函数框架和主要算法。 //******************************************

//函数名称: BOOL ThiningDIB()

// 基本功能: 本函数对 CDibObject 对象中的图像进行细化运算

//参数说明: CDibObject *pDibObject 默认为 NULL

//返回值: BOOL 成功返回 TRUE , 失败返回 FALSE

//******************************************

BOOL CMorphPro: : ThiningDIB(CDibObject *pDibObject)

{

//使用传入的 CDibObject 对象

//无 CDibObject 对象时, 返回 FALSE

// 定义变量

unsigned char *pBuffer, *pBits;

RGBQUAD *pPalette;

Page 52: 第一部分 图像代数 — 数学形态学

第五章图像平滑 int nWidthBytes, nNumColors;

int lWidth, lHeight;

//获得图像指针

//获得颜色数

//获得调色板指针

//获得位图数据指针

// 指向源图像的指针

// 指向缓存图像的指针

// 指向缓存 DIB 图像的指针

//循环变量

long i;

long j;

int n;

int m;

Page 53: 第一部分 图像代数 — 数学形态学

第五章图像平滑 //四个条件

BOOL bCondition1;

BOOL bCondition2;

BOOL bCondition3;

BOOL bCondition4;

//计数器

unsigned char nCount;

// 像素值

unsigned char pixel;

//5×5 相邻区域像素值

unsigned char neighbour[ 5][ 5] ;

// 暂时分配内存, 以保存新图像

hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);

// 锁定内存

Page 54: 第一部分 图像代数 — 数学形态学

第五章图像平滑 lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 初始化新分配的内存, 设定初始值为 255

lpDst = (char *)lpNewDIBBits;

memset(lpDst, (BYTE)255, lWidth * lHeight);

bModified=TRUE;

while(bModified)

{

bModified = FALSE;

// 初始化新分配的内存, 设定初始值为 255

lpDst = (char *)lpNewDIBBits;

memset(lpDst, (BYTE)255, lWidth * lHeight);

for(j = 2; j <lHeight-2; j++)

{

for(i = 2; i <lWidth-2; i++)

{

Page 55: 第一部分 图像代数 — 数学形态学

第五章图像平滑

bCondition1 = FALSE;

bCondition2 = FALSE;

bCondition3 = FALSE;

bCondition4 = FALSE;

// 指向源图像倒数第 j 行, 第 i 个像素的指针

lpSrc = (char *)pBits + lWidth * j + i;

// 指向目标图像倒数第 j 行, 第 i 个像素的指针

lpDst = (char *)lpNewDIBBits + lWidth * j + i;

// 取得当前指针处的像素值, 注意要转换为 unsigned char型

pixel = (unsigned char)*lpSrc;

// 目标图像中含有 0 和 255 外的其他灰度值

if(pixel != 255 && *lpSrc != 0)

Page 56: 第一部分 图像代数 — 数学形态学

第五章图像平滑 return FALSE;

continue;

// 如果源图像中当前点为白色, 则跳过

else if(pixel = = 255)

continue;

//获得当前点相邻的 5×5 区域内像素值, 白色用 0 代表, 黑色用 1

代表

for (m = 0; m < 5; m++ )

{

for (n = 0; n < 5; n++)

{

neighbour[ m][ n] =(255-(unsigned char)*(lpSrc+((4-m)-2)*l

Width\ +n-2 ))/255;

}

}

Page 57: 第一部分 图像代数 — 数学形态学

第五章图像平滑

//逐个判断条件。判断 2<=NZ(P1)<=6

nCount = [ZK(]neighbour[ 1][ 1] +neighbour[ 1][ 2] +neighbour[ 1][ 3] \

+ neighbour[ 2][ 1] + neighbour[ 2][ 3] + \

+ neighbour[ 3][ 1] + neighbour[ 3][ 2] + neighbour[ 3][ 3] ;

if ( nCount >= 2 && nCount <=6)

bCondition1 = TRUE;

//判断 Z0(P1)=1

nCount = 0;

if (neighbour[ 1][ 2] ==0 && neighbour[ 1][ 1] ==1)

nCount++;

if (neighbour[ 1][ 1] = = 0 && neighbour[ 2][ 1] = = 1)

nCount++;

Page 58: 第一部分 图像代数 — 数学形态学

第五章图像平滑

if (neighbour[ 2][ 1] = = 0 && neighbour[ 3][ 1] = = 1)

nCount++;

if (neighbour[ 3][ 1] = = 0 && neighbour[ 3][ 2] = = 1)

nCount++;

if (neighbour[ 3][ 2] = = 0 && neighbour[ 3][ 3] = = 1)

nCount++;

if (neighbour[ 3][ 3] = = 0 && neighbour[ 2][ 3] = = 1)

nCount++;

if (neighbour[ 2][ 3] = = 0 && neighbour[ 1][ 3] = = 1)

nCount++;

if (neighbour[ 1][ 3] = = 0 && neighbour[ 1][ 2] = = 1)

nCount++;

Page 59: 第一部分 图像代数 — 数学形态学

第五章图像平滑

if (nCount = = 1)

bCondition2 = TRUE;

//判断 P2*P4*P8=0 or Z0(p2)!=1

if (neighbour[ 1][ 2] *neighbour[ 2][ 1] *neighbour[ 2][ 3] = = 0)

bCondition3 = TRUE;

else

{

nCount = 0;

if (neighbour[ 0][ 2] = = 0 && neighbour[ 0][ 1] = = 1)

nCount++;

if (neighbour[ 0][ 1] = = 0 && neighbour[ 1][ 1] = = 1)

nCount++;

Page 60: 第一部分 图像代数 — 数学形态学

第五章图像平滑 if (neighbour[ 1][ 1] = = 0 && neighbour[ 2][ 1] = = 1)

nCount++;

if (neighbour[ 2][ 1] = = 0 && neighbour[ 2][ 2] = = 1)

nCount++;

if (neighbour[ 2][ 2 ] = = 0 && neighbour[ 2][ 3] = = 1)

nCount++;

if (neighbour[ 2][ 3] = = 0 && neighbour[ 1][ 3] = = 1)

nCount++;

if (neighbour[ 1][ 3] = = 0 && neighbour[ 0][ 3] = = 1)

nCount++;

if (neighbour[ 0][ 3] = = 0 && neighbour[ 0][ 2] = = 1)

nCount++;

if (nCount != 1)

bCondition3 = TRUE;

}

Page 61: 第一部分 图像代数 — 数学形态学

第五章图像平滑 //判断 P2*P4*P6=0 or Z0(p4)!=1

if (neighbour[ 1][ 2] *neighbour[ 2][ 1] *neighbour[ 3][ 2] ==0)

bCondition4 = TRUE;

else

{

nCount = 0;

if (neighbour[ 1][ 1] = = 0 && neighbour[ 1][ 0 ==1)

nCount++;

if (neighbour[ 1][ 0] = = 0 && neighbour[ 2][ 0] ==1)

nCount++;

if (neighbour[ 2][ 0] = = 0 && neighbour[ 3][ 0] ==1)

nCount++;

if (neighbour[ 3][ 0] = = 0 && neighbour[ 3][ 1] = = 1)

nCount++;

Page 62: 第一部分 图像代数 — 数学形态学

第五章图像平滑

if (neighbour[ 3][ 1] = = 0 && neighbour[ 3][ 2] = = 1)

nCount++;

if (neighbour[ 3][ 2] = = 0 && neighbour[ 2][ 2] = = 1)

nCount++;

if (neighbour[ 2][ 2] = = 0 && neighbour[ 1][ 2] = = 1)

nCount++;

if (neighbour[ 1][ 2] = = 0 && neighbour[ 1][ 1] = = 1)

nCount++;

if (nCount != 1)

bCondition4 = TRUE;

}

if(bCondition1 && bCondition2 && bCondition3 && bCondition4)

Page 63: 第一部分 图像代数 — 数学形态学

第五章图像平滑 { *lpDst = (unsigned char)255; bModified = TRUE; } else { *lpDst = (unsigned char)0; } } } // 复制腐蚀后的图像 } // 复制腐蚀后的图像 // 释放内存 // 返回 return TRUE;

}