基于Matlab的形态学图像处理学习笔记

本例程配套完整视频、源码和素材图片下载

视频在线观看请点击

第12章  形态学图像处理

      12.1  基本的形态学运算

             例12-1 创建结构元素

             例12-2 创建图像并进行矩形腐蚀操作

             例12-3 创建图像并进行矩形膨胀操作

             例12-4 对二值图像进行线性膨胀操作

             例12-5 对灰度图像进行球性膨胀操作

             例12-6 对二值图像进行盘状腐蚀操作

             例12-7 对二值图像进行腐蚀和膨胀操作

             例12-8 对灰度图像进行开运算

             例12-9 对灰度图像进行闭运算

      12.2  组合形态学运算

             例12-10 对灰度图像进行形态学高帽滤波

             例12-11 通过高帽滤波和低帽滤波增强图像对比度

             例12-12 对二值图像进行填充操作

             例12-13 对灰度图像进行填充操作

             例12-14 创建图像并获取所有数据局部最大值

             例12-15 获取创建图像中设定阈值的局部极大值(1)

             例12-15 获取灰度图像中设定阈值的局部极大值(2)

             例12-16 创建图像通过imhmax()对极大值进行抑制

             例12-17 通过膨胀腐蚀获取灰度图像边缘

             例12-18 获取二值图像的边缘

             例12-19 二值图像的细化

             例12-20 二值图像的骨架化

             例12-21 移除二值图像的内部像素点

      12.3  二值图像的其他形态学操作

             例12-22 对二值图像进行极限腐蚀

             例12-23 建立表格和查表操作

             例12-24 二值图像的标记

             例12-25 通过函数label2rgb()显示标记矩阵

             例12-26 通过函数bwselect()进行对象选择

             例12-27 通过函数bwarea()计算二值图像的面积

             例12-28 通过函数bweuler()计算二值图像的欧拉数

      12.4  本章小结

 

 

第12章  形态学图像处理

形态学是一种应用于图像处理模式识别领域的新的方法,是一门建立在严格的数学理论基础上而又密切联系实际的科学。由于形态学具有完备的数学基础,这为形态学用于图像分析和处理等奠定了坚实的基础。本章详细的介绍利用MATLAB软件进行形态学图像处理,主要内容包括基本运算组合形态学运算以及二值图像的其他形态学运算等内容。

12.1  基本的形态学运算

数学形态学可以看作是一种特殊的数字图像处理方法和理论,主要以图象的形态特征为研究对象。它通过设计一整套运算概念算法,用以描述图象的基本特征。这些数学工具不同于常用的频域或空域算法,而是建立在微分几何以及随机集论的基础之上的。数学形态学作为一种用于数字图象处理和识别的新理论和新方法,它的理论虽然很复杂,但它的基本思想却是简单而完美的。         

数学形态学方法比其他空域或频域图像处理和分析方法具有一些明显的优势。例如,基于数学形态学的边缘信息提取处理优于基于微分运算的边缘提取算法它不像微分算法对噪声那样敏感,提取的边缘比较光滑;利用数学形态学方法提取的图像骨架也比较连续,断点少等;数学形态学易于用并行处理方法有效的实现,而且硬件实现容易

12.1.1  基本概念

集合论是数学形态学的基础,首先对集合论的一些基本概念做一个简单介绍。腐蚀运算膨胀运算是数学形态学的两个基本变换。参加运算的对象有两个:图像A(感兴趣目标)和结构集合BB称为结构元素。结构元素通常是个圆盘,但它其实可以是任何形状。

   基于Matlab的形态学图像处理学习笔记_第1张图片

   

12.1.2  结构元素

结构元素膨胀和腐蚀的最基本组成部分用于测试输入图像二维结构元素是由数值01组成的矩阵结构元素原点指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的领域像素在进行膨胀或腐蚀操作时是否参与计算

在MATLAB软件中,结构元素定义为一个STREL对象。如果nhood结构元素定义的领域,则任意大小和维数的结构元素的原点坐标为:origin=floor((size(nhood)+1)/2)。在MATLAB软件中,采用函数strel( )创建任意大小和形状的STREL对象。函数strel( )支持常用的形状,例如线型(line矩形(rectangle方形(square球形(ball钻石型(diamond自定义的任意型(arbitrary等。

例12-1 创建结构元素

clear all; close all; clc;%关闭所有窗口,清空变量,命令行
se1=strel('square', 3)%矩形结构元素
se2=strel('line', 10, 45)%线形结构元素,角度为45度

基于Matlab的形态学图像处理学习笔记_第2张图片基于Matlab的形态学图像处理学习笔记_第3张图片 基于Matlab的形态学图像处理学习笔记_第4张图片

注:se1包含9个邻居(neighbors),se2包含7个邻居(neighbors),值为1的才为邻居

12.1.3  膨胀与腐蚀

膨胀将与物体接触的所有背景点合并到该物体中使边界向外部扩张的过程通过膨胀,可以填充图像中的小孔,及在图像边缘处的小凹陷部分。结构元素B对图像A的膨胀,记作,定义为:

                                                                 

腐蚀和膨胀是对偶操作。腐蚀是一种消除边界点使边界向内部收缩的过程。利用腐蚀操作,可以消除小且无意义的物体。集合A被结构元素B腐蚀,记作,定义为:

                                                                      

腐蚀的原理

二值图像前景物体为1,背景为0。假设原图像中有一个前景物体,那么我们用一个结构元素去腐蚀原图的过程是这样的:遍历原图像的每一个像素,然后用结构元素的中心点对准当前正在遍历的这个像素,然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最小值,用这个最小值替换当前像素值。由于二值图像最小值就是0,所以就是用0替换,即变成了黑色背景。从而也可以看出,如果当前结构元素覆盖下,全部都是背景,那么就不会对原图做出改动,因为都是0。如果全部都是前景像素,也不会对原图做出改动,因为都是1。只有结构元素位于前景物体边缘的时候,它覆盖的区域内才会出现0和1两种不同的像素值,这个时候把当前像素替换成0就有变化了。因此腐蚀看起来的效果就是让前景物体缩小了一圈一样。对于前景物体中一些细小的连接处,如果结构元素大小相等,这些连接处就会被断开。

膨胀的原理

二值图像前景物体为1,背景为0。假设原图像中有一个前景物体,那么我们用一个结构元素去膨胀原图的过程是这样的:遍历原图像的每一个像素,然后用结构元素的中心点对准当前正在遍历的这个像素,然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值,用这个最大值替换当前像素值。由于二值图像最大值就是1,所以就是用1替换,即变成了白色前景物体。从而也可以看出,如果当前结构元素覆盖下,全部都是背景,那么就不会对原图做出改动,因为都是0.如果全部都是前景像素,也不会对原图做出改动,因为都是1。只有结构元素位于前景物体边缘的时候,它覆盖的区域内才会出现0和1两种不同的像素值,这个时候把当前像素替换成1就有变化了。因此膨胀看起来的效果就是让前景物体胀大了一圈一样。对于前景物体中一些细小的断裂处,如果结构元素大小相等,这些断裂的地方就会被连接起来。

例12-2 创建图像并进行矩形腐蚀操作

clear all; close all;%关闭所有窗口,清空变量,命令行
bw=zeros(9,9);%创立一个值都为0的9*9的二值图像
bw(2:6, 3:7)=1%2-6行,3-7列的元素赋值为1
se=strel('square', 5)%创立5*5的矩形结构元素
bw2=imerode(bw, se)%图像bw进行腐蚀操作
figure;
subplot(121);  imshow(bw);%显示原图
title('输入原图像');
subplot(122);  imshow(bw2);%显示腐蚀后的图像
title('腐蚀后图像');

   基于Matlab的形态学图像处理学习笔记_第5张图片   基于Matlab的形态学图像处理学习笔记_第6张图片

  基于Matlab的形态学图像处理学习笔记_第7张图片    基于Matlab的形态学图像处理学习笔记_第8张图片

相当于输入图像每个像素进行遍历,以当前像素为中心构成输入图像的5*5的矩阵,在此矩阵内的最小值即为新的当前位置像素值。

例12-3 创建图像并进行矩形膨胀操作

clear all; close all;%关闭所有窗口,清空变量,命令行
bw=zeros(9,9);%创立一个值都为0的9*9的二值图像
bw(3:5, 4:6)=1%3-5行,4-6列的元素赋值为1
se=strel('square', 3)%创立3*3的矩形结构元素
bw2=imdilate(bw, se)%图像bw进行膨胀操作
figure;
subplot(121);  imshow(bw);%显示原图
title('输入原图像');
subplot(122);  imshow(bw2);%显示膨胀后的图像
title('膨胀后图像');

                            基于Matlab的形态学图像处理学习笔记_第9张图片    基于Matlab的形态学图像处理学习笔记_第10张图片

基于Matlab的形态学图像处理学习笔记_第11张图片              基于Matlab的形态学图像处理学习笔记_第12张图片

相当于输入图像每个像素进行遍历,以当前像素为中心构成输入图像的3*3的矩阵,在此矩阵内的最大值即为新的当前位置像素值。

例12-4 对二值图像进行线性膨胀操作

clear all; close all;%关闭所有窗口,清空变量,命令行
bw=imread('text.png');%读取一张二值图像
se=strel('line', 11, 90);%%创建一个线形结构元素,角度为90度
bw2=imdilate(bw, se);%对图像bw进行膨胀操作
figure;
subplot(121);  imshow(bw);%显示原图
title('输入原图像');
subplot(122);  imshow(bw2);%显示膨胀后的图像
title('膨胀后图像');

基于Matlab的形态学图像处理学习笔记_第13张图片   基于Matlab的形态学图像处理学习笔记_第14张图片

相当于输入图像每个像素进行遍历,以当前像素为中心构成输入图像的11*1的矩阵,在此矩阵内的最大值即为新的当前位置像素值。,所以看起来只是上下被拉长了。

例12-5 对灰度图像进行球性膨胀操作

clear all; close all;%关闭所有窗口,清空变量,命令行
bw=imread('cameraman.tif');%读取一张灰度图像
se=strel('ball', 5, 5);%创建一个球形结构元素
bw2=imdilate(bw, se);%对图像bw进行膨胀操作
figure;
subplot(121);  imshow(bw);%显示原图
title('输入原图像');
subplot(122);  imshow(bw2);%显示膨胀后的图像
title('膨胀后图像');

基于Matlab的形态学图像处理学习笔记_第15张图片   基于Matlab的形态学图像处理学习笔记_第16张图片

例12-6 对二值图像进行盘状腐蚀操作

clear all; close all;%关闭所有窗口,清空变量
bw=imread('circles.png');%读取一张二值图像
se=strel('disk', 11)%创建一个盘状结构元素
bw2=imerode(bw, se);%对图像bw进行腐蚀操作
figure;
subplot(121);  imshow(bw);%显示原图
title('输入原图像');
subplot(122);  imshow(bw2);%显示膨胀后的图像
title('腐蚀后图像');

基于Matlab的形态学图像处理学习笔记_第17张图片    基于Matlab的形态学图像处理学习笔记_第18张图片

例12-7 对二值图像进行腐蚀和膨胀操作

clear all; close all;%关闭所有窗口,清空变量
se=strel('rectangle', [40, 30]);%%创建一个40*30的矩形结构元素,值都为1
bw1=imread('circbw.tif');%读取一张二值图像
bw2=imerode(bw1, se);%对图像bw1进行腐蚀操作
bw3=imdilate(bw2, se);%对图像bw2进行膨胀操作
figure;
subplot(131);  imshow(bw1);
title('输入原图像');
subplot(132);  imshow(bw2);
title('腐蚀后图像');
subplot(133);  imshow(bw3);
title('膨胀后图像');

基于Matlab的形态学图像处理学习笔记_第19张图片   基于Matlab的形态学图像处理学习笔记_第20张图片

可见,由于选取的是一个比较大的矩阵结构元素,所以在进行腐蚀操作时,便可以将宽度和厚度都小于结构元素的区域都滤去,剩下的再通过相同结构元素膨胀操作后便可以恢复到原图像一样大小,以此提取原图像中较大形状的区域图像(但是这样操作得到的膨胀后的图像的边缘都是矩形的,所以会丢失原图像边缘的一些细节

12.1.4  开运算和闭运算

结构元素BA的开运算,定义为:

即首先采用结构元素对A腐蚀运算然后再做膨胀运算,使用相同的结构元素。闭运算是开运算的对偶运算,

定义为:

即首先用结构元素BA做膨胀运算然后再做腐蚀运算,使用相同的结构元素。

例12-8 对灰度图像进行开运算

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('snowflakes.png');%读取一张灰度图像
se=strel('disk', 5);%建立一个盘状结构元素
J=imopen(I, se);%对图像I进行开运算
figure;
subplot(121);  imshow(I);%显示原图
title('输入原图像');
subplot(122);  imshow(J, []);%显示开运算后的图像
title('开运算后图像');

可见,通过开运算先腐蚀,后膨胀去除了原图像中一些比较小的点

例12-9 对灰度图像进行闭运算

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('circles.png');%读取一张二值图像
se=strel('disk', 10);%建立一个半径为10的盘状结构元素
J=imclose(I, se);%对图像I进行闭运算
figure;
subplot(121);  imshow(I);%显示原图
title('输入原图像');
subplot(122);  imshow(J, []);%显示闭运算后的图像
title('闭运算后图像');

基于Matlab的形态学图像处理学习笔记_第21张图片

可见,通过闭运算先膨胀,后腐蚀,可以将图像中的多个圆变为一个整体

12.2  组合形态学运算

图像的膨胀和腐蚀是最基本的形态学运算。下面介绍组合形态学运算,主要内容包括高帽滤波低帽滤波边界提取区域填充

12.2.1  高帽滤波和低帽滤波

图像的形态学高帽滤波(top-hat filtering)定义为:

其中为A输入的图像,B为采用的结构元素,即从图像中减去形态学开操作后的图像。通过高帽滤波可以增强图像的对比度

图像的形态学低帽滤波(bottom-hat filtering)定义为:

其中为A输入的图像,B为采用的结构元素,即从图像中减去形态学闭操作后的图像。通过低帽滤波可以获取图像的边缘

例12-10 对灰度图像进行形态学高帽滤波

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('rice.png');%读取一张灰度图像
se=strel('disk', 11);%建立一个半径为11的盘状结构元素
J=imtophat(I, se);%对图像I进行高帽滤波
K=imadjust(J);%对图像J进行灰度变换增强对比度
figure;
subplot(131);  imshow(I);%显示原图
title('输入原图像');
subplot(132);  imshow(J);%显示高帽滤波后的图像
title('高帽滤波后图像');
subplot(133);  imshow(K);%显示灰度变换后的图像
title('图像增强后图像');

基于Matlab的形态学图像处理学习笔记_第22张图片

可见,高帽滤波后的图像改变了图像的背景灰度变换图像的对比度增强了图像变得更加清晰

例12-11 通过高帽滤波和低帽滤波增强图像对比度

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('pout.tif');%读取一张灰度图像
se=strel('disk', 3);%建立一个半径为3的盘状结构元素
J=imtophat(I, se);%对图像I进行高帽滤波得到J
K=imbothat(I, se);%对图像I进行低帽滤波得到K
L=imsubtract(imadd(I, J), K);%I与K图像先进行相加,然后相减操作
figure;
subplot(141);  imshow(I);%显示原图
title('输入原图像');
subplot(142);  imshow(J);%高帽滤波
title('高帽滤波后图像');
subplot(143);  imshow(K);%低帽滤波
title('低帽滤波后图像');
subplot(144);  imshow(L);%显示增强图像L
title('增强后图像');

基于Matlab的形态学图像处理学习笔记_第23张图片

可见,通过形态学处理后,增强了图像的对比度(最左I和最右L对比)

12.2.2  图像填充操作

MATLAB软件中,采用函数imfill( )二值图像或灰度图像进行填充操作。函数imfill( )的调用格式为:

BW2=imfill(BW)该函数对二值图像BW进行填充操作,对于二维图像允许用户通过鼠标选择填充的点。通过键盘上面的

Backspace键或Delete键可以取消当前选择的点,通过键盘上的Return键可以结束交互式的选择。

[BW2, locations]=imfill(BW)该函数中返回值locations包含了交互式选择时的点的坐标。

BW2=imfill(BW, locations)该函数中通过参数locations指定了进行填充时的点的坐标。

BW2=imfill(BW, holes)该函数通过参数holes可以填充二值图像中的空洞。

I2=imfill(I) 该函数对灰度图像进行填充操作,返回值 I2 也是灰度图像。

例12-12 对二值图像进行填充操作

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('coins.png');%读取一张灰度图像
J=im2bw(I);%将图像I转换为二值图像J
K=imfill(J, 'holes');%对二值图像J进行填充
figure;
subplot(121);  imshow(J);%显示二值图像J
title('二值图像');
subplot(122);  imshow(K);%显示填充后图像K
title('填充后图像');

基于Matlab的形态学图像处理学习笔记_第24张图片

可见,二值图像进行填充后,内部的空洞都被填充好了。

例12-13 对灰度图像进行填充操作

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('tire.tif');%读取一张灰度图像
J=imfill(I, 'holes');%对灰度图像I进行填充
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示填充后后图像
title('填充后图像');

基于Matlab的形态学图像处理学习笔记_第25张图片

12.2.3  最大值和最小值

对于一幅图像可以有多个局部极大值或极小值但只有一个最大值或最小值。在MATLAB软件中,采用函数imregionalmax( )获取图像的所有局部极大值,采用函数imregionalmin( )获取局部极小值。函数imregionalmax ( )的调用格式为:

BW=imregionalmax(I)该函数获取灰度图像I的局部极大值,返回值BW为和原图像大小相同的二值图像,BW中元素1对应的是极大值,其它元素值为0

BW=imregionalmax(I, conn)该函数中参数conn为连通类型。对于二维图像conn可以取值为48,默认值为8。对于三维图像,conn可取值为61826,默认值为26

 例12-14 创建图像并获取所有数据局部最大值

clear all; close all; clc;%关闭所有窗口,清空变量,命令行
I=10*ones(6, 10);%创建一个6*10的,值都为10的矩阵
I(3:4, 3:4)=13;%矩阵的3-4行,3-4列对应的数都赋值为13
I(4:5, 7:8)=18;%矩阵的4-5行,7-8列对应的数都赋值为18
I(2,8)=15%矩阵第2行,第八列对应的数赋值为15
bw=imregionalmax(I)%获取局部最大值

基于Matlab的形态学图像处理学习笔记_第26张图片

基于Matlab的形态学图像处理学习笔记_第27张图片

在程序中,建立了矩阵,通过 imregionalmax() 函数获取了矩阵内所有的局部极大值,返回值为二值图像,局部极大值对应的元素为1,其它元素对应为0

 例12-15 获取创建图像中设定阈值的局部极大值(1)

clear all; close all; clc;%关闭所有窗口,清空变量,命令行
I=10*ones(6, 10);%创建一个6*10的,值都为10的矩阵
I(3:4, 3:4)=13;%矩阵的3-4行,3-4列对应的数都赋值为13
I(4:5, 7:8)=18;%矩阵的4-5行,7-8列对应的数都赋值为18
I(2,8)=15%矩阵第2行,第八列对应的数赋值为15
bw=imextendedmax(I, 3)%[输入像素值-周围值(10)]>3(设定阈值)时,二值图像中此处为1

基于Matlab的形态学图像处理学习笔记_第28张图片

基于Matlab的形态学图像处理学习笔记_第29张图片J = imextendedmax(I,3),可以看出只有18(15)-10=8(5)> 3,所以返回的二值图像中值为1。[imextendedmin函数用法和imextendedmax用法类似]

 例12-15 获取灰度图像中设定阈值的局部极大值(2)

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('glass.png');%读取一张灰度图像
%带阈值的局部极大值(即指定阈值为80的局部最大值求取)
J=imextendedmax(I, 150);
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示极大值结果图像
title('带阈值局部极大值结果图像');

基于Matlab的形态学图像处理学习笔记_第30张图片

在程序中,首先读入一张灰度图像,然后获取图像的局部极大值,阈值为80,运行后,左图为灰度图像,右图为获取的局部极大值组成的二值图像(即二值图像中白色区域(值为1)的原图像素值比其周围像素值都大于80以上

阈值设定为150时:

基于Matlab的形态学图像处理学习笔记_第31张图片

 例12-16 创建图像通过imhmax()对极大值进行抑制

基于Matlab的形态学图像处理学习笔记_第32张图片

clear all; close all; clc;%关闭所有窗口,清空变量,命令行
I=2*ones(5, 10);%创建一个5*10的,值都为2的矩阵
I(2:4, 2:4)=3;%矩阵的2-4行,2-4列对应的数都赋值为3
I(4:5, 6:7)=9;%矩阵的4-5行,6-7列对应的数都赋值为9
I(2,8)=5%矩阵第2行,第8列对应的数赋值为5
J=imregionalmax(I)%获取I中所有极大值
K=imhmax(I, 4)%对极大值进行抑制

基于Matlab的形态学图像处理学习笔记_第33张图片

基于Matlab的形态学图像处理学习笔记_第34张图片

基于Matlab的形态学图像处理学习笔记_第35张图片

基于Matlab的形态学图像处理学习笔记_第36张图片

12.2.4  图像的边界测定

对于灰度图像可以通过形态学的膨胀和腐蚀来获取图像的边缘。通过形态学获取灰度图像的边缘的优点对边缘的方向性依赖比较小。下面通过例子程序进行说明。

 例12-17 通过膨胀腐蚀获取灰度图像边缘

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('rice.png');%读取一张灰度图像
se=strel('disk', 2);%%建立一个半径为2的盘状结构元素
J=imdilate(I, se);%膨胀操作
K=imerode(I, se);%腐蚀操作
L=J-K;%相减
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(L);%显示边缘结果图像
title('边缘结果图像');

基于Matlab的形态学图像处理学习笔记_第37张图片

 例12-18 获取二值图像的边缘

基于Matlab的形态学图像处理学习笔记_第38张图片

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('circbw.tif');%读取一张二值图像
J=bwperim(I, 8);%获取边缘
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示边缘结果图像
title('二值图像边缘');

基于Matlab的形态学图像处理学习笔记_第39张图片

 

12.2.5  二值图像的形态学操作

MATLAB软件中,通过函数bwmorph( )可以进行二值图像的大量形态学操作,例如图像的骨骼化图像的细化,以及开操作闭操作等等。该函数的功能非常强大,读者可以查询MATLAB的帮助系统获取该函数的调用格式。下面通过几个例子程序介绍该函数的功能。

 例12-19 二值图像的细化

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('text.png');%读取一张二值图像
J=bwmorph(I, 'thin', Inf);%对图像I进行细化
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示边缘结果图像
title('二值图像的细化');

基于Matlab的形态学图像处理学习笔记_第40张图片

 例12-20 二值图像的骨架化

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('circbw.tif');%读取一张二值图像
J=bwmorph(I, 'skel', Inf);
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示边缘结果图像
title('骨架化后图像');

基于Matlab的形态学图像处理学习笔记_第41张图片

 例12-21 移除二值图像的内部像素点

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('circles.png');%读取一张二值图像
J=bwmorph(I, 'remove');%移除内部像素点
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示结果图像
title('移除内部像素点后图像');

基于Matlab的形态学图像处理学习笔记_第42张图片

12.3  二值图像的其他形态学操作

图像的膨胀和腐蚀是最基本的形态学操作。下面介绍一些常用的形态学操作,主要包括极限腐蚀、查表操作、图像的标记、对象的选择、图像的面积和欧拉数等。

12.3.1  二值图像的极限腐蚀

MATLAB软件中,采用函数bwulterode( )进行图像的极限腐蚀,每个对象最后变为一个像素点为止。函数bwulterode( )的调用格式为:

BW2=bwperim(BW1)该函数获取二值图像的边缘,返回值BW2是和原图像大小相同的二值图像。

BW2=bwulterode(BW, method, conn)该函数中设置参数method,可取值为euclideancityblockchessboardquasi-euclidean。对于二维图像,参数conn可取值为48,默认值为8。对于三维图像,conn可取值为61826,默认值为26

  例12-22 对二值图像进行极限腐蚀

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('circles.png');%读取一张二值图像
J=bwulterode(I);%极限腐蚀
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示结果图像
title('极限腐蚀后图像');

基于Matlab的形态学图像处理学习笔记_第43张图片

 12.3.2  二值图像的查表操作

为了提高二值图像的处理速度,MATLAB软件提供了查表操作的相关函数。查表操作适合处理2×23×3的邻域情况。在MATLAB软件中,函数makelut( )用于建立表单,函数applylut( )用于查表操作。函数makelut( )的调用格式为:

lut=makelut(fun, n)该函数建立表单,其中参数fun为设定判断条件的函数,n为邻域大小,可取值为23

采用函数makelut( )建立表单后,可以采用函数applylut( )进行查表操作。在MATLAB中,函数applylut( )的调用格式为:

A=applylut(BW, LUT)该函数采用查表的方式对二值图像的邻域进行操作,参数BW为二值图像,参数LUT为采用函数makelut( )建立的表单。返回值A为查表操作后得到的二值图像。

  例12-23 建立表格和查表操作

clear all; close all;%关闭所有窗口,清空变量,命令行
fun=@(x) (sum(x(:))==4);%建立匿名函数
lut=makelut(fun, 2);%建立表格
I=imread('text.png');%读取一张二值图像
J=applylut(I, lut);%查表
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示结果图像
title('查表后图像');

基于Matlab的形态学图像处理学习笔记_第44张图片

 12.3.3  二值图像的标记

对于属于同一个像素连通区域的所有像素分配相同的编号,对不同的连通区域分配不同的编号,称为连通区域的标记。在MATLAB中,采用函数bwlabel( )和函数bwlabeln( )进行连通区域的标记操作。函数bwlabel( )只支持二维的二值图像,函数bwlabeln( )支持任意维数的二值图像。函数bwlabel( )的调用格式为:

L=bwlabel(BW, n)该函数建对二值图像BW的连通区域进行标记,参数n为连通类型,可取值为48,默认值为8,即8-连通。函数的返回值L为标记矩阵,和原来的二值图像有相同的大小。

[L, num]=bwlabel(BW, n)该函数对二值图像BW进行标记,返回值num为连通区域的数目。

  例12-24 二值图像的标记

clear all; close all; clc;%关闭所有窗口,清空变量,命令行
BW=zeros(4, 8); %建立4*8的零矩阵
BW(2:3, 2:3)=1;%矩阵的2-3行,2-3列对应的数都赋值为1
BW(2, 5)=1;%矩阵第2行,第5列对应的数赋值为1
BW(3, 7)=1%矩阵第3行,第7列对应的数赋值为1
[L, num]=bwlabel(BW, 8)%二值图像的标记clear all; close all; clc;%关闭所有窗口,清空变量,命令行
BW=zeros(4, 8); %建立4*8的零矩阵
BW(2:3, 2:3)=1;%矩阵的2-3行,2-3列对应的数都赋值为1
BW(2, 5)=1;%矩阵第2行,第5列对应的数赋值为1
BW(3, 7)=1%矩阵第3行,第7列对应的数赋值为1
[L, num]=bwlabel(BW, 8)%二值图像的标记

基于Matlab的形态学图像处理学习笔记_第45张图片

基于Matlab的形态学图像处理学习笔记_第46张图片  

可见,连通区域(非0且在一起的归为一个区域)分别被标记为了区域1,区域2,区域3

  例12-25 通过函数label2rgb()显示标记矩阵

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('rice.png');%读取一张灰度图像
J=im2bw(I, graythresh(I));%转换为二值图像
K=bwlabel(J);%对二值图像J标记
RGB=label2rgb(K);%将标记矩阵转换为RGB图像
figure;
subplot(121);  imshow(J);%显示原图像
title('原图像');
subplot(122);  imshow(RGB);%显示结果图像
title('RGB标记图像');

基于Matlab的形态学图像处理学习笔记_第47张图片

左图为二值图像,右图为采用真彩色图像显示的标记矩阵

 12.3.4  二值图像的对象选择

MATLAB软件中,采用函数bwselect( )在二值图像中选择单个的对象,要求图像必须是二维的。函数bwselect( )的调用格式为:

BW2=bwselect(BW, c, r, n)该函数对输入的二值图像BW进行对象选择,输入参数(c, r)为对象的像素点的位置,cr的维数相同,参数n为对象的连通类型,可取值为48。返回值BW2为选择了指定对象的二值图像,和原图像有相同的大小。

BW2=bwselect(BW, n)该函数采用交互的方式,用户采用鼠标选择像素点的位置。

  例12-26 通过函数bwselect()进行对象选择

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('text.png');%读取一张二值图像
c=[43, 185, 212];%选择对象的横坐标
r=[38, 68, 181];%选择对象的纵坐标
J=bwselect(I, c, r, 4);%对象选择
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示结果图像
title('选择对象图像');

基于Matlab的形态学图像处理学习笔记_第48张图片

可见,通过(43,38)、(185,68)、(212,181)三个坐标提取了三个对象

 12.3.5  二值图像的面积

面积是二值图像中像素值为1的像素的个数。在MATLAB软件中,采用函数bwarea( )计算二值图像的面积。函数bwarea( )的调用格式为:

total=bwarea(BW)该函数计算输入的二值图像BW的面积,返回值total为得到的面积值。在计算二值图像的面积时,不是简单的计算像素值为1的像素的个数,而是为每个像素设置一个权值,采用加权求和的方式得到面积。

 例12-27 通过函数bwarea()计算二值图像的面积

clear all; close all;%关闭所有窗口,清空变量,命令行
I=imread('circbw.tif');%读取一张二值图像
se=strel('disk', 3);%建立一个半径为3的盘状结构元素
J=imdilate(I, se);%对I进行膨胀
a1=bwarea(I)%计算原图像的面积
a2=bwarea(J)%计算膨胀后图像的面积
(a2-a1)/a1%面积增加的百分比
figure;
subplot(121);  imshow(I);%显示原图像
title('原图像');
subplot(122);  imshow(J);%显示膨胀后图像
title('膨胀后图像');

基于Matlab的形态学图像处理学习笔记_第49张图片

基于Matlab的形态学图像处理学习笔记_第50张图片基于Matlab的形态学图像处理学习笔记_第51张图片   基于Matlab的形态学图像处理学习笔记_第52张图片

 12.3.6  二值图像的欧拉数

在二值图像中,像素值为 1 的连通区域(对象)的个数减去孔数,所得的差值为这幅图像的欧拉数。欧拉数测量的是图像的拓扑结构。在 MATLAB 中,使用函数 bweuler ( ) 计算二值图像的欧拉数,该函数的调用格式为:
 
eul=bweuler(BW, n) 该函数计算输入的二值图像 BW 的欧拉数,参数 n 可以为 4 8 ,默认值为 8 ,即 8 连通。

 

 例12-28 通过函数bweuler()计算二值图像的欧拉数

clear all; close all; clc;%关闭所有窗口,清空变量,命令行
I=imread('circbw.tif');%读取一张图像
J=imread('circles.png');%读取一张图像
e1=bweuler(I, 8)%计算图像I的欧拉数
e2=bweuler(J, 8)%计算图像J的欧拉数
                                         基于Matlab的形态学图像处理学习笔记_第53张图片                                                 基于Matlab的形态学图像处理学习笔记_第54张图片
 

 12.4  本章小结

本章详细的介绍了利用形态学进行图像的处理和分析。首先详细的介绍了形态学的基本概念和基本运算,包括膨胀、腐蚀、开运算和闭运算等。然后详细介绍了利用形体学进行图像的处理,主要内容包括图像的填充、最大值和最小值的获取、图像的边界测定以及二值图像的形态学分析。最后介绍了形态学进行图像处理常用的操作,包括极限腐蚀、查表操作、图像的标记、对象的选取、图像的面积和欧拉数等。如有资料及技术问题请留言,也可联系扣扣1837393417,共同探讨,共同进步!!!

你可能感兴趣的:(Matlab,图像分割,视频教程,Matlab,形态学处理,图像处理)