灰度级形态学处理的是形如
f
(
x
,
y
)
f(x,y)
f(x,y)和
b
(
x
,
y
)
b(x,y)
b(x,y)的数字函数,其中
f
(
x
,
y
)
f(x,y)
f(x,y)是灰度图像,
b
(
x
,
y
)
b(x,y)
b(x,y)是结构元
(
S
E
)
(SE)
(SE)。灰度级形态学中结构元分为两类:平坦结构元和非平坦结构元,如图。
需要注意的是,灰度级形态学处理是由集合论的形态学定义延伸出来的,所以它们有相似的性质。如集合论的形态学一样,上面两个结构元在用的时候也需要先明确原点。类似的,我们定义结构元的反射:
b
^
(
x
,
y
)
=
b
(
−
x
,
−
y
)
\hat{b}(x,y)=b(−x,−y)
b^(x,y)=b(−x,−y)
灰度级膨胀与腐蚀
腐蚀:当平坦结构元
b
b
b的原点是
(
x
,
y
)
(x, y)
(x,y)时,它在
(
x
,
y
)
(x, y)
(x,y)处对图像f的灰度腐蚀定义为,图像
f
f
f与
b
b
b重合区域中的最小值。平坦结构元b在位置
(
x
,
y
)
(x,y)
(x,y)处对图像f的腐蚀写为:
[
f
⊖
b
]
(
x
,
y
)
=
min
(
s
,
t
)
∈
b
{
f
(
x
+
s
,
y
+
t
)
}
[f \ominus b](x,y)=\min_{\mathclap{(s,t)\in b}} \{f(x+s,y+t)\}
[f⊖b](x,y)=(s,t)∈bmin{f(x+s,y+t)}
膨胀:类似的,我们定义膨胀为:
[
f
⊕
b
]
(
x
,
y
)
=
max
(
s
,
t
)
∈
b
^
{
f
(
x
−
s
,
y
−
t
)
}
[f \oplus b](x,y)=\max_{\mathclap{(s,t)\in \hat b}} \{f(x-s,y-t)\}
[f⊕b](x,y)=(s,t)∈b^max{f(x−s,y−t)}
膨胀和腐蚀的效果如下图所示:
非平坦结构元具有随定义域而变化的灰度级。非平坦结构元
b
N
b_N
bN对图像f的腐蚀定义如下:
[
f
⊖
b
N
]
(
x
,
y
)
=
min
(
s
,
t
)
∈
b
N
{
f
(
x
+
s
,
y
+
t
)
−
b
N
(
s
,
t
)
}
[f \ominus b_N](x,y)=\min_{\mathclap{(s,t)\in b_N}} \{f(x+s,y+t)-b_N(s,t)\}
[f⊖bN](x,y)=(s,t)∈bNmin{f(x+s,y+t)−bN(s,t)}
这里,我们实际上是从f中减去
b
N
b_N
bN的值来确定任一点处的腐蚀。
采用类似的方式,使用非平坦结构元的膨胀定义如下:
[
f
⊕
b
N
]
(
x
,
y
)
=
max
(
s
,
t
)
∈
b
N
{
f
(
x
−
s
,
y
−
t
)
+
b
N
(
s
,
t
)
}
[f \oplus b_N](x,y)=\max_{\mathclap{(s,t)\in b_N}} \{f(x-s,y-t)+b_N(s,t)\}
[f⊕bN](x,y)=(s,t)∈bNmax{f(x−s,y−t)+bN(s,t)}
如二值情况那样,腐蚀和膨胀是关于函数的补集和反射对偶的,即
(
f
⊖
b
)
c
(
x
,
y
)
=
(
f
c
⊕
b
^
)
(
x
,
y
)
(f \ominus b)^c(x,y)=(f^c \oplus \hat{b})(x,y)
(f⊖b)c(x,y)=(fc⊕b^)(x,y)
其中,
f
c
=
−
f
(
x
,
y
)
f_c=-f(x,y)
fc=−f(x,y)且
b
^
=
b
(
−
x
,
−
y
)
\hat b=b(-x,-y)
b^=b(−x,−y)。相同的表达式对非平坦结构元同样有效。为了清除起见,下面的讨论中我们忽略所有函数的参数以简化表达式,这种情况下,前一式可写为
(
f
⊖
b
)
c
=
(
f
c
⊕
b
^
)
(f \ominus b)^c=(f^c \oplus \hat{b})
(f⊖b)c=(fc⊕b^)
类似地,
(
f
⊕
b
)
c
=
(
f
c
⊖
b
^
)
(f \oplus b)^c=(f^c \ominus \hat{b})
(f⊕b)c=(fc⊖b^)
开操作与闭操作
灰度级图像的开操作和闭操作的表达式与二值图像对应的操作有相同的形式。结构元
b
b
b对图像f的开操作表示为
f
∘
b
f\circ b
f∘b,即
f
∘
b
=
(
f
⊖
b
)
⊕
b
f \circ b=(f \ominus b) \oplus b
f∘b=(f⊖b)⊕b
类似地,
b
b
b对
f
f
f的闭操作表示为
f
⋅
b
f \centerdot b
f⋅b,即
f
⋅
b
=
(
f
⊕
b
)
⊖
b
f \centerdot b=(f \oplus b) \ominus b
f⋅b=(f⊕b)⊖b
同样的,灰度级图像的开操作和闭操作关于函数的补集和反射也是对偶的:
(
f
∘
b
)
c
=
(
f
c
⋅
b
^
)
(f \circ b)^c=(f^c \centerdot \hat{b})
(f∘b)c=(fc⋅b^)和
(
f
⋅
b
)
c
=
(
f
c
∘
b
^
)
(f \centerdot b)^c=(f^c \circ \hat{b})
(f⋅b)c=(fc∘b^)
因为
f
c
=
−
f
(
x
,
y
)
f_c=-f(x,y)
fc=−f(x,y),所以
(
f
∘
b
)
c
=
(
f
c
⋅
b
^
)
(f \circ b)^c=(f^c \centerdot \hat{b})
(f∘b)c=(fc⋅b^)也可以写成
−
(
f
∘
b
)
=
(
−
f
⋅
b
^
)
-(f \circ b)=(-f \centerdot \hat{b})
−(f∘b)=(−f⋅b^),对于后一个也类似。
跟二值图像类似的,灰度图的开操作和闭操作也具有简单的几何解释,如下图所示。
其中,我们将灰度图
f
(
x
,
y
)
f(x,y)
f(x,y)看成一个三维平面,灰度值可以解释为
x
y
xy
xy平面上的高度值。
开操作就是由结构元
b
b
b从
f
f
f的下方向上推动达到的最高值,此时
b
b
b的原点访问
f
f
f的每一个坐标点
(
x
,
y
)
(x,y)
(x,y)时所能取的最大值的集合即为完全开操作,如图9.38-c所示。
闭操作正好相反,是由结构元
b
b
b从
f
f
f的上方向夏推动达到的最小值,此时
b
b
b的原点访问
f
f
f的每一个坐标点
(
x
,
y
)
(x,y)
(x,y)时所能取的最小值的集合即为完全闭操作,如图9.38-e。
灰度级开操作满足如下性质:
- f ∘ b ↩ f f \circ b \hookleftarrow f f∘b↩f。
- 如果 f 1 ↩ f 2 f_1 \hookleftarrow f_2 f1↩f2,则 ( f 1 ∘ b ) ↩ ( f 2 ∘ b ) (f_1 \circ b)\hookleftarrow (f_2 \circ b) (f1∘b)↩(f2∘b)。
- ( f ∘ b ) ∘ b = ( f ∘ b ) (f \circ b) \circ b=(f \circ b) (f∘b)∘b=(f∘b)
符号 e ↩ r e \hookleftarrow r e↩r表示 e e e的域是 r r r的域的一个子集,且对于 e e e的域中任何 ( x , y ) (x,y) (x,y),有 e ( x , y ) ⩽ r ( x , y ) e(x,y)\leqslant r(x,y) e(x,y)⩽r(x,y)。
注:原作者写的是↵,我在katex公式编辑器中没找到。
类似的,闭操作满足如下性质:
- f ↩ f ⋅ b f \hookleftarrow f \centerdot b f↩f⋅b。
- 如果 f 1 ↩ f 2 f_1 \hookleftarrow f_2 f1↩f2,则 ( f 1 ⋅ b ) ↩ ( f 2 ⋅ b ) (f_1 \centerdot b)\hookleftarrow (f_2 \centerdot b) (f1⋅b)↩(f2⋅b)。
- ( f ⋅ b ) ⋅ b = ( f ⋅ b ) (f \centerdot b) \centerdot b=(f \centerdot b) (f⋅b)⋅b=(f⋅b)
这些性质用途类似于二值图像中的对应性质。
开操作和闭操作实现效果如下:
一些基本的灰度级形态学算法
形态学平滑
开操作抑制比结构元小的亮细节,而闭操作抑制暗细节,所以他们常常以形态滤波的形式结合起来被用于图像平滑和噪声去除。
上图分别为原图、经半径为5的结构元进行开闭顺序操作的结果以及分别用半径为2~5的结构元交替顺序滤波的结果。可以看到后者是比前者更为模糊的。
形态学梯度
膨胀和腐蚀可以与图像相减结合起来得到一幅图像的形态学梯度,在这里,由
g
g
g来定义:
g
=
(
f
⊕
b
)
−
(
f
⊖
b
)
g=(f \oplus b)-(f \ominus b)
g=(f⊕b)−(f⊖b)
膨胀粗化一幅图像的区域,而腐蚀则细化它们,二者的差强调了区域间的边界。如下图,a为头部CT扫描图像,接下来的两幅图像是用所有元素都为1的结构元对该图像进行开操作和闭操作的结果。而他们的差(d图)清楚描绘了区域间的边界,而这与二维微分图像的预期相同,因此叫做该图像的形态学梯度。
顶帽变换和底帽变换
图像相减与开操作闭操作结合,会产生所谓的顶帽(Top-hat)变换和底帽(Bottom-hat)变换。
灰度级图像
f
f
f的顶帽变换被定义为
f
f
f减去其开操作:
T
h
a
t
(
f
)
=
f
−
(
f
∘
b
)
T_{hat}(f)=f-(f \circ b)
That(f)=f−(f∘b)
类似的,
f
f
f的底帽变换定义为
f
f
f的闭操作减去
f
f
f:
B
h
a
t
(
f
)
=
(
f
⋅
b
)
−
f
B_{hat}(f)=(f \centerdot b)-f
Bhat(f)=(f⋅b)−f
顶帽变换用于暗背景上的亮物体,而底帽变换则用于相反的情况,因此,顶帽变换又称白顶帽变换,而底帽变换被称为黑底帽变换。
顶帽变换的一个重要用途是矫正不均匀光照。
上图很明显可以看出,图b在阈值分割的时候有些细节因为原图的不均匀光照分错了,导致有些米粒未被提取出来,而经过半径为40的圆盘结构元进行开操作后,再用原图减去它得到的图5(左下)很清楚地提取出了米粒。
我们可以看到最后一张图片有很好的对比度,这也是顶帽底帽变换的一种联合应用,用来增强对比度,具体操作是:
f
f
f的顶帽变换与底帽变换的差,再加上原图
f
f
f所得到的图形。
粒度检测
在图像处理方面,粒度测定是属于判断图像中颗粒的尺寸分布的领域。形态学可以间接用于估计颗粒的尺寸分布,并且不需要识别并测量图像中的每个颗粒。
下图为木按钉图像平滑后分别经过半径为10、20、25、30的结构元开操作后的结果。
下图是结构元半径为0-35时每次与之后一个结构元的像素值之和的差值,很明显可以看出有两个峰值,这很清楚的表明存在两种主要的物体尺寸。
纹理分割
图9.45(a)是一幅在亮背景上叠加了暗斑点的噪声图像。这幅图像中有两个纹理区域:由右侧的大斑点组成的区域和由左侧的小斑点组成的区域。我们的任务是根据纹理内容找到两个区域的边界。
感兴趣目标比背景暗,并且我们知道用一个比小斑点大的结构元对图像进行闭运算可以删除这些斑点。那么就好办了,我们将小的删除,只剩大的斑点,然后再利用尺寸大于9.45(b)中斑点间距的结构元对(b)做开操作,可以删除这些间距。然后再利用形态学梯度求出边界,最后把边界重合到原图,任务就完成了。
注:这里使用元素全为1且大小为3*3的结构元执行的形态学梯度
灰度级形态学重建
与二值图像类似。令
f
f
f和
g
g
g分别代表标记图像和模板图像。假设
f
f
f和
g
g
g是大小相同的灰度级图像,且
f
⩽
g
f\leqslant g
f⩽g。
f
f
f关于
g
g
g的大小为1的测地膨胀定义为
D
g
(
1
)
(
f
⊕
b
)
∧
g
D^ {(1)}_g \relax{(f \oplus b) \wedge g}
Dg(1)(f⊕b)∧g
式中,
∧
\wedge
∧表示点方式的最小算子。
f
f
f关于
g
g
g的大小为
n
n
n的测地膨胀定义为
D
g
(
n
)
(
f
)
=
D
g
(
1
)
[
D
g
(
n
−
1
)
(
f
)
]
D^{(n)}_g(f)=D^{(1)}_g\big[D^{(n-1)}_g(f)\big]
Dg(n)(f)=Dg(1)[Dg(n−1)(f)]
并有
D
g
(
0
)
(
f
)
=
f
D^{(0)}_g(f)=f
Dg(0)(f)=f。
类似的,
f
f
f关于
g
g
g的大小为1的测地腐蚀定义为
E
g
(
1
)
(
f
⊖
b
)
∨
g
E^ {(1)}_g \relax{(f \ominus b) \vee g}
Eg(1)(f⊖b)∨g
式中,
∨
\vee
∨表示点方式的最大算子。
f
f
f关于
g
g
g的大小为
n
n
n的测地腐蚀定义为
E
g
(
n
)
(
f
)
=
E
g
(
1
)
[
E
g
(
n
−
1
)
(
f
)
]
E^{(n)}_g(f)=E^{(1)}_g\big[E^{(n-1)}_g(f)\big]
Eg(n)(f)=Eg(1)[Eg(n−1)(f)]
并有
E
g
(
0
)
(
f
)
=
f
E^{(0)}_g(f)=f
Eg(0)(f)=f。
灰度级标记图像
f
f
f对灰度级模板图像
g
g
g的膨胀形态学重建定义为
f
f
f关于
g
g
g的测地膨胀反复迭代直至达到稳定,即
R
g
D
(
f
)
=
D
g
(
k
)
(
f
)
R^{D}_g(f)=D^{(k)}_g(f)
RgD(f)=Dg(k)(f)
并有
k
k
k使
D
g
(
k
)
(
f
)
=
D
g
(
k
+
1
)
(
f
)
D^{(k)}_g(f)=D^{(k+1)}_g(f)
Dg(k)(f)=Dg(k+1)(f)。
f
f
f对
g
g
g的腐蚀形态学重建定义为
f
f
f关于
g
g
g的测地腐蚀反复迭代直至达到稳定,即
R
g
E
(
f
)
=
E
g
(
k
)
(
f
)
R^{E}_g(f)=E^{(k)}_g(f)
RgE(f)=Eg(k)(f)
并有
k
k
k使
E
g
(
k
)
(
f
)
=
E
g
(
k
+
1
)
(
f
)
E^{(k)}_g(f)=E^{(k+1)}_g(f)
Eg(k)(f)=Eg(k+1)(f)。
一幅图像
f
f
f的大小为
n
n
n的重建开操作定义为先对
f
f
f进行大小为
n
n
n的腐蚀,再由
f
f
f的膨胀重建,即
O
R
(
n
)
(
f
)
=
R
f
D
[
(
f
⊖
n
b
)
]
O^{(n)}_R(f)=R^{D}_f[(f\ominus nb)]
OR(n)(f)=RfD[(f⊖nb)]
一幅图像
f
f
f的大小为
n
n
n的重建闭操作定义为先对
f
f
f进行大小为
n
n
n的膨胀,再由
f
f
f的腐蚀重建,即
C
R
(
n
)
(
f
)
=
R
f
E
[
(
f
⊕
n
b
)
]
C^{(n)}_R(f)=R^{E}_f[(f\oplus nb)]
CR(n)(f)=RfE[(f⊕nb)]
用形态学分水岭的分割
形态学分水岭分割将 1 ◯ \textcircled{1} 1◯边缘检测 2 ◯ \textcircled{2} 2◯阈值处理 3 ◯ \textcircled{3} 3◯区域生长这三种分割方法中的许多概念进行了具体化,因此通常会产生更稳定的分割结果,包括连接的分割边界。
背景知识
分水岭的概念是以三维方式来显示一幅图像为基础的:两个空间坐标和灰度坐标,如图所示。在这种“地形学”的解释中,我们考虑三种类型的点:
- 属于一个区域极小值的点;
- 水滴所在位置的点,如果把水滴放在任意点处,水滴必定会流向某个极小值点;
- 处于该点的水等概率地流向不止一个极小值的点。
对于某个特定的区域极小值,满足条件(2)的点集称为该极小值的汇水盆地或分水岭。满足条件(3)的点形成地形表面的峰线,它称为分割线或分水线。
基于这些概念的分割算法的主要目标是找出分水线。如下图,水一步步上涌,直至最后构建出分水线使得不同区域的水无法汇聚到一起。值得一提的是,分水岭算法通常作用于图像的梯度,而不是原图。
水坝构建
如下,假设图10.58(a)中的每个连通分量已被图10.58©中的结构元膨胀,满足两个条件:
- 膨胀必须约束到q上(这意味着在膨胀过程中,结构元的中心只能位于q中的点处);
- 不能对使得正被膨胀集合聚合(变成单个连通分量)的那些点执行膨胀。
很显然,第一次膨胀时,所有点都满足(1)而不被(2)限制,所以每个区域的边界就被均匀地扩展了。
第二次膨胀时,有很多点满足(1)但是受限于(2)被抛弃了,所以可以看到边界是断断续续的。那么很明显,
q
q
q中只有 满足上述两个条件的电才能描绘出图10.58(d)中打叉的线显示的1像素宽的连通路径。而这个就是我们水坝的位置,而水坝构建时是在这个路径上所有点都设置为图像最大灰度值+1的值来完成的。
分水岭分割算法
令
M
1
,
M
2
,
.
.
.
,
M
R
M1,M2,...,M_R
M1,M2,...,MR是图像
g
(
x
,
y
)
g(x,y)
g(x,y)的区域极小值中的点的坐标集。
标记的使用
很明显,当有很多噪声或者梯度不规则时,图像会被过度分割,无法得到想要的效果,因此引入了标记的使用。首先预处理,用一个平滑滤波器对图像进行过滤,在区域内给定一个值,使水面从这个值开始而不是最低点,如下面动图所示,这样就可以避免很多无用的分割。
使用了标记的图片分割就有相对好的效果了。
动图摘自https://blog.csdn.net/weixin_40647819/article/details/90231477