文章目录
- 二值图像形态学算法
- 连通分量提取
- 灰度图形态学算法
- 灰度重建
- 区域最大值查找
本文先列举一些近期用到的形态学算法,以后可能会再进行补充。
二值图像形态学算法
连通分量提取
在上一篇文章中已经提到连通分量的概念,这里再进行回顾:
令 S S S表示图像中像素的一个子集。如果完全由 S S S中所有像素组成的两个像素 p p p和 q q q之间存在一个通路,那么称 p p p和 g g g在 S S S中是连通的。对于S中的任何像素 p p p,在 S S S中连通到该像素的像素集称为 S S S的连通分量。若S仅有一个连通分量,则集合S称为连通集。(表现为S中任意两个像素之间都是连通的)
那么如何提取一幅图像里面的所有连通分量?
令原图为
I
I
I,
A
A
A是由一个或多个连通分量组成的前景像素集合。首先由基于
A
A
A形成一幅图像
X
0
X_0
X0,
X
0
X_0
X0由每个连通分量内任取一个已知点构成(假如有
k
k
k个连通分量,那么
X
0
X_0
X0中就有
k
k
k个像素点。)我们的目标就是从
X
0
X_0
X0开始,找到原图
I
I
I中的所有连通分量。以下迭代过程可以实现这个目的:
X
k
=
(
X
k
−
1
⊕
B
)
∩
I
,
k
=
1
,
2
,
3
,
⋯
X_k=(X_{k-1}\oplus B)\cap I,k=1,2,3,\cdots
Xk=(Xk−1⊕B)∩I,k=1,2,3,⋯
B
B
B是下图中结构元(8连通,也可以是4连通)。当
X
k
=
X
k
−
1
X_k=X_{k-1}
Xk=Xk−1时,迭代过程结束,
X
k
X_k
Xk包含图像中前景像素的所有连通分量。该式使用了和原图进行取交集这一条件膨胀来限制膨胀的增长。
灰度图形态学算法
灰度重建
灰度重建其实指的是marker图像 J J J在mark I I I下进行条件膨胀。类似二值图像中提取连通分量的算法,这里直接贴文献[1]中的定义:
单步重建操作时先对marker J J J进行膨胀(对于灰度图而言就是取结构元 B B B覆盖区域的最大值),然后再和原图取交集(即比较原图和膨胀结果取其中最小值),这样下来得到的条件膨胀图像中对应点的像素值一定不会比原图 I I I对应点的像素值大!最终结果就是单步重建到稳定状态(不再变化)。
需要注意的是,膨胀的时候是使用原图像素进行灰度膨胀而不是使用膨胀像素进行膨胀,很容易通过Matlab验证:
%测试下灰度膨胀(是使用原图的像素膨胀的而不是膨胀的像素)
img = [3,2,1,1];
se = strel('square',3);
img_dil = imdilate(img,se); %结果是[3, 3, 2, 1]
区域最大值查找
首先区域最大值的概念定义如下:
区域最大值点是具有同一强度值的连通像素分量,其周围的像素强度值比该值低。
这里再贴一条文献[1]当中给出的定义:
如何求区域最大值,文献[1]中给出了这样一种方法:
即给定原图 I I I,其区域最大值可以通过原图减去对 I − 1 I-1 I−1(即原图的灰度值-1)进行灰度重建的结果来得到。
(自己的理解就是把 I − 1 I-1 I−1这个图像逐步进行单步灰度重建到稳定状态时,此时除区域最大值外,其他像素值都与原图相同,这样用 I I I减去该重建结果就只剩下区域最大值为1了)
Matlab中求区域最大值的函数是imregionalmax
函数,用法如下:
针对上述求取区域最大值的方法,可以通过Matlab验证结果的一致性:
%提取区域最大值
A = 10*ones(10,10);
A(2:4,2:4) = 22;
A(6:8,6:8) = 33;
A(2,7) = 44;
A(3,8) = 45;
A(4,9) = 44
regmax = imregionalmax(A) % 用1来标记最大值
%根据公式计算最大值
sub1_A_recon = imreconstruct(A-1,A,8);
regmax1 = A - sub1_I_recon;
此外,针对一些搞不清的情况进行了测试。
对下面两个灰度矩阵:
其求取区域最大值的结果分别是:
总结为:如果一块连通区域的外边界有比该连通区域像素值大的像素,那么这块连通区域都不会是区域最大值。如果外边界没有比该连通区域大的像素值,那么该连通区域可以确定为区域最大值。