形态学图像处理

基本概念

基本思想

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

特点

形态学图像处理表现为一种领域运算形式

一种特殊的领域称之为结构元素(Structure Element),在每个像素位置上它与二值图像对应的区域进行特定的逻辑运算,逻辑运算的结果为输出图像的相应像素

形态学运算的效果取决于结构元素的大小、内容以及逻辑运算的性质

用途

简化图像数据,保持基本形状特性,并去除不相干结构

基本运算

二值腐蚀和膨胀、二值开闭运算

集合论基础

二值图像的逻辑运算

在上图中,ab是两个二值图像,c是a的补,d是ab的并,e是ab的交,f是ab的差

集合的反射

由集合A中所有元素相对于原点的反射元素组成的集合称为集合A的反射表达式为

图示见下

集合的平移

由集合A中所有元素平移y=(y1,y2)后组成的元素集合称为集合A的平移,记为(A)y,表达式为

图示见下

平移和反射的例子

这里原点是图中的黑点

注意:逻辑操作只针对二值图像

三种形态学基本运算

膨胀

膨胀是使图像扩大,扩的是图像中的一些轮廓

A用B来膨胀写作A⊕B,表示B的反射进行平移与A交集不为空的部分

含义

每当结构元素B的反射在目标图像A上平移后,结构元素B的反射与其覆盖的子图像中至少有一个元素相交时,就将目标图像中与结构元素B的反射的原点对应的那个位置的像素值置为1,否则为0

注意

1、当结构元素中原点位置的值是0时,仍把它看作是0,而不是1

2、当结构元素在目标图像上平移时,允许结构元素中的非原点像素超出目标图像范围

例子

如图所示,膨胀相当于就是模版的结构元素之要有一个部分与它重合就把模版结构元素的原点置为1或0

改变结构元素后结果发生了改变

下图中,我们利用膨胀运算将相邻的物体连接起来

下图中我们利用膨胀运算填充目标区域的小孔

腐蚀

腐蚀是使图像缩小,记作A O B

每当在目标图像A中找到一个与结构元素B相同的子图像时,就把该子图像中与B的原点位置对应的那个像素位置标注为1,图像A上标注出的所有这样的像素组成的集合,即为腐蚀运算的结果。

腐蚀运算的实质就是在目标图像中标出那些与结构元素相同的子图像的原点位置的像素

例子

也就是可以理解为结构元素在目标图像上平移的时候,结构元素中的任何元素不能超出目标图像的范围

下图是用不同结构元素进行图像腐蚀的实例

不同结构单元对腐蚀和膨胀的影响

上图是3*3方形结构单元

利用腐蚀算法消除物体之间的粘连示例

利用腐蚀算法识别物体示例

这里我们把要找的设为模版,一旦找到一个同样形状和大小的就会标出其中心点

开操作与闭操作

开操作

B对A进行的开操作就是先用B对A腐蚀,然后用B对结果进行膨胀

我们发现,开运算平滑了对象的轮廓,断开了狭窄的连接,去掉了细小的突出部分和噪声

闭操作

B对A进行的闭操作就是先用B对A膨胀,然后用B对结果进行腐蚀

我们发现,闭运算能使物体的轮廓线变得光滑,将狭窄的缺口连起来,并填充比结构元素小的洞口

开闭运算的作用

开运算

1、使轮廓平滑,抑制A物体边界的小离散点或尖峰

2、用来消除小物体,在纤细点处分离物体、平滑较大的物体边界的同时不明显改变其面积

闭运算

1、用来填充物体内细小空洞、连接邻近的物体、平滑其边界的同时并不明显改变其面积

例子如下

开闭运算的综合运用

利用matlab进行形态学运算

利用Strel来构造各种形状和大小结构的元素

1
Se = strel(Shape, parameters)

菱形结构

可以使用Se=strel(‘diamond’,R)创建一个平坦的菱形结构元素,其中R是从结构元素原点到菱形的最远点距离,比如

1
Se=strel('diamond',5)

圆盘型结构

可以使用Se=strel(‘disk’,R)创建一个平坦的圆盘型结构元素,其中R是半径,比如

1
Se=strel('disk',5)

线性结构

可以使用Se=strel(‘line’,LEN,DEG)创建一个平坦的线性结构元素,其中LEN表示长度,DEG表示线的角度,比如

1
2
Se=strel('line',9,0)
Se=strel('line',3,45)

第二个的效果图如下

使用imdilate执行膨胀运算

1
2
3
4
5
I = imread('word.tif');
Se = strel('square',3);
I1 = imdilate(I,Se);
subplot(1,2,1); imshow(I);
subplot(1,2,2); imshow(I1);

效果如下

使用imerode执行腐蚀运算

1
2
3
4
5
I = imread('utk.tif');
Se = strel('square',3);
I1 = imerode(I,Se);
subplot(1,2,1); imshow(I);
subplot(1,2,2); imshow(I1);

效果如下

使用imopen执行开运算

1
2
3
4
5
I = imread('shapes.tif');
Se = strel('square',20);
I1 = imopen(I,Se);
subplot(1,2,1); imshow(I);
subplot(1,2,2); imshow(I1);

效果如下

使用imclose执行闭运算

1
2
3
4
5
I = imread('shapes.tif');
Se = strel('square',20);
I1 = imclose(I,Se);
subplot(1,2,1); imshow(I);
subplot(1,2,2); imshow(I1);

效果如下

开闭混合运算

1
2
3
4
5
6
I = imread('shapes.tif');
Se = strel('square',20);
I1 = imopen(I,Se);
I1 = imclose(I1,Se);
subplot(1,2,1); imshow(I);
subplot(1,2,2); imshow(I1);

效果如下

课后练习1

练习1:利用形态学运算对fingerprint.tif进行如下处理

代码

1
2
3
4
5
6
7
8
9
10
11
I = imread('fingerprint.tif');
Se = strel('square',3);
I1 = imerode(I,Se);
I2 = imdilate(I1,Se);
I3 = imdilate(I2,Se);
I4 = imerode(I3,Se);
subplot(2,3,1); imshow(I);
subplot(2,3,2); imshow(I1);
subplot(2,3,3); imshow(I2);
subplot(2,3,4); imshow(I3);
subplot(2,3,5); imshow(I4);

效果

形态学运算的应用

利用形态学运算进行边缘提取

设集合A的边界表示为ß(A),选取结构元素B,先用B对A腐蚀,而后用A减去腐蚀的结果

代码

1
2
3
4
5
I = imread('utk.tif');
Se = strel('square',3);
I_i = imerode(I,Se);
subplot(1,2,1);imshow(I);
subplot(1,2,2);imshow(I-I_i);

效果

使用Bwmorph实现基于膨胀和腐蚀组合的操作

语法格式

BW2 = bwmorph(BW,operation) 对二值图像进行指定的形态学处理

BW2 = bwmorph(BW,operation,n) 对二值图像进行n次指定的形态学处理

operation的取值范围如下:

对图像进行腐蚀,开闭运算后再细化

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
I = imread('fingerprint.tif');
se = strel('square',3);
I_erode = imerode(I,se);
I_open = imopen(I,se);
I_dilate = imdilate(I_open,se);
f = imerode(I_dilate,se);
g1 = bwmorph(f,'thin',1);
g2 = bwmorph(f,'thin',2);
gn = bwmorph(f,'thin',Inf);
subplot(2,2,1); imshow(f);
subplot(2,2,2); imshow(g1);
subplot(2,2,3); imshow(g2);
subplot(2,2,4); imshow(gn);

效果

课后练习2

练习2:实现如下效果

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
I = imread('kkk.tif');
I = I(:,:,1);
Se = strel('square',3);
g1 = imerode(I,Se);
g1 = I-g1;
g2 = I;
g2(:,:,2) = 0;
g2(:,:,3) = 0;
g2(:,:,1) = g1;
[m,n] = size(I);
subplot(1,3,1); imshow(I);
subplot(1,3,2); imshow(g1);
subplot(1,3,3); imshow(g2);

效果

练习3:对彩色图像进行膨胀和腐蚀

原理实际上还是一样的,对卷积核所在的区域取空间最小值或最大值

1
2
3
4
5
6
7
I = imread('onion.png');
Se = strel('square',10);
I1 = imerode(I,Se);
I2 = imdilate(I,Se);
subplot(1,3,1); imshow(I);
subplot(1,3,2); imshow(I1);
subplot(1,3,3); imshow(I2);

Author: YihangBao
Link: https://roarboil.github.io/2020/05/29/shapeimg/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.