博客
关于我
基于Matlab的形态学图像处理学习笔记
阅读量:685 次
发布时间:2019-03-17

本文共 14637 字,大约阅读时间需要 48 分钟。

第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称为结构元素。结构元素通常是个圆盘,但它其实可以是任何形状。

   

   

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度

 

注: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列的元素赋值为1se=strel('square', 5)%创立5*5的矩形结构元素bw2=imerode(bw, se)%图像bw进行腐蚀操作figure;subplot(121);  imshow(bw);%显示原图title('输入原图像');subplot(122);  imshow(bw2);%显示腐蚀后的图像title('腐蚀后图像');

      

      

相当于输入图像每个像素进行遍历,以当前像素为中心构成输入图像的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列的元素赋值为1se=strel('square', 3)%创立3*3的矩形结构元素bw2=imdilate(bw, se)%图像bw进行膨胀操作figure;subplot(121);  imshow(bw);%显示原图title('输入原图像');subplot(122);  imshow(bw2);%显示膨胀后的图像title('膨胀后图像');

                                

              

相当于输入图像每个像素进行遍历,以当前像素为中心构成输入图像的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('膨胀后图像');

   

相当于输入图像每个像素进行遍历,以当前像素为中心构成输入图像的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('膨胀后图像');

   

例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('腐蚀后图像');

    

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

clear all; close all;%关闭所有窗口,清空变量se=strel('rectangle', [40, 30]);%%创建一个40*30的矩形结构元素,值都为1bw1=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('膨胀后图像');

   

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

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('闭运算后图像');

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

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('图像增强后图像');

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

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

clear all; close all;%关闭所有窗口,清空变量,命令行I=imread('pout.tif');%读取一张灰度图像se=strel('disk', 3);%建立一个半径为3的盘状结构元素J=imtophat(I, se);%对图像I进行高帽滤波得到JK=imbothat(I, se);%对图像I进行低帽滤波得到KL=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);%显示增强图像Ltitle('增强后图像');

可见,通过形态学处理后,增强了图像的对比度(最左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转换为二值图像JK=imfill(J, 'holes');%对二值图像J进行填充figure;subplot(121);  imshow(J);%显示二值图像Jtitle('二值图像');subplot(122);  imshow(K);%显示填充后图像Ktitle('填充后图像');

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

例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('填充后图像');

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列对应的数都赋值为13I(4:5, 7:8)=18;%矩阵的4-5行,7-8列对应的数都赋值为18I(2,8)=15%矩阵第2行,第八列对应的数赋值为15bw=imregionalmax(I)%获取局部最大值

在程序中,建立了矩阵,通过 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列对应的数都赋值为13I(4:5, 7:8)=18;%矩阵的4-5行,7-8列对应的数都赋值为18I(2,8)=15%矩阵第2行,第八列对应的数赋值为15bw=imextendedmax(I, 3)%[输入像素值-周围值(10)]>3(设定阈值)时,二值图像中此处为1

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('带阈值局部极大值结果图像');

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

阈值设定为150时:

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

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

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('边缘结果图像');

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

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

 

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('二值图像的细化');

 例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('骨架化后图像');

 例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('移除内部像素点后图像');

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('极限腐蚀后图像');

 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('查表后图像');

 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列对应的数都赋值为1BW(2, 5)=1;%矩阵第2行,第5列对应的数赋值为1BW(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列对应的数都赋值为1BW(2, 5)=1;%矩阵第2行,第5列对应的数赋值为1BW(3, 7)=1%矩阵第3行,第7列对应的数赋值为1[L, num]=bwlabel(BW, 8)%二值图像的标记

  

可见,连通区域(非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标记图像');

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

 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('选择对象图像');

可见,通过(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('膨胀后图像');

   

 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的欧拉数
                                        
                                                
 

 12.4  本章小结

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

转载地址:http://ufuhz.baihongyu.com/

你可能感兴趣的文章
mysql 中索引的问题
查看>>
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>
mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
查看>>
mysql 主从关系切换
查看>>
MYSQL 主从同步文档的大坑
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 事务知识点与优化建议
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>