一、实验目的
1、了解形态学的基本理论和方法。
2、掌握对图像进行开、闭、膨胀、腐蚀的方法。
二、实验环境
Matlab 2020B
三、实验内容
题目
任选一种结构算子实现对图像或目标的开、闭、腐蚀和膨胀运算。
2、采用形态学处理方法实现图像去噪。
3、对图像分割实验(实验四)得到的分割结果进行形态学处理,对肺部区域的空洞进行填充。
*4、请用形态学算法生成只包含边界接触的圆形。(选做题)
相关知识
图像的形态学描述与处理都基于填放结构元素的概念。结构元素的选择与从图像中抽取何种信息有密切关系。图像的形态学基本操作有腐蚀(Erosion)、膨胀(Dilation)、开(Opening)、闭(Closing)四种。利用这几种形态学操作,可以完成图像分割、特征抽取、边缘检测、图像增强等工作。
腐蚀操作是形态学最基本的操作之一。宏观上看,腐蚀运算可以使被处理的图像缩小,消除图像的边界,消除图像中小于结构元素大小的部分。如果图像中两部分存在细小的连通“桥”,则腐蚀运算可以将这一连通消除。腐蚀运算的算法如下:用结构元素,扫描图像中的每一个像素。用结构元素与其覆盖的二值图像做与运算。若结构元素的与元素都为1,则图像的该像素值置为1,否则值置为0。
膨胀操作与腐蚀操作相反,是腐蚀操作的逆运算。膨胀操作可以使被处理的图像增大,扩充图像边界的凹陷部分,填充图像中比结构元素小的空洞。对于多个不同的连通域,若存在缝隙,则填满该缝隙。膨胀运算的算法如下:用结构元素扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算。如果都为0,结果图像该像素为0,否则为1。
形态学的开操作是先用结构元素进行腐蚀操作,而后再用腐蚀的结果再次进行膨胀操作。开操作能使得对象的轮廓变得光滑,断开狭窄的间断、消除细的突出物。
形态学的闭操作就是用结构元素对原图像先进行膨胀操作,后进行腐蚀操作,使得轮廓变得光华,但与开操作相反,用于消除狭窄的间断和鸿沟,消除小的空洞,填补轮廓线中的断裂。
对于灰度图像,也可以进行形态学操作。灰度图像的形态学操作对应了本次实验课的第二题。
设形态学操作的结构元素为b(s,t),原图像为f(x,y)。
在腐蚀操作中,对于腐蚀后图像的每个像素点,其灰度值被更新为f与b重合区域的最小灰度值。即:
在膨胀操作中,对于膨胀后图像的每个像素点,其灰度值被更新为f与b的补集的重合区域的最大灰度值。即:
本次实验的第四题是利用形态学操作进行一些简单的应用。
为了识别出图像各个圆形的边界,需要进行边界提取。由结构元素对原图像先进行腐蚀,再用原图像减去腐蚀后的图像,就能得到图像的边界。根据图像的边界,可以根据图像边界的周长判断哪些圆是独立的,哪些圆是与另外的圆互相连通的。利用这一种办法,提取出了图像中所有的连通分量。
在提取完连通分量,分离出与其他圆互相连通的圆后,就需要进行区域填充。为了自动地区分出哪些黑色像素点是圆内部的空洞、哪些黑色像素点是圆外部的背景,可以迭代的利用膨胀操作进行填充,直到图像不再发生任何变化。
核心代码
I=imread("lab5_1.tif"); se = strel('line',10,10); subplot(1,2,1);imshow(I); I=imerode(I,se); subplot(1,2,2);imshow(I);
随意地选取了一个线性的结构元素,对图像进行腐蚀操作。
I=imread("lab5_1.tif"); se = strel('line',5,5); subplot(1,2,1);imshow(I); I=imdilate(I,se); subplot(1,2,2);imshow(I);
随意选取了一个线性结构元素,对图像进行膨胀操作。
I=imread("lab5_1.tif"); se = strel('line',10,10); subplot(1,2,1);imshow(I); I=imopen(I,se); subplot(1,2,2);imshow(I);
随意选取了一个线性结构元素,对图像进行开操作。
I=imread("lab5_1.tif"); se = strel('disk',6,6); subplot(1,2,1);imshow(I); I=imclose(I,se); subplot(1,2,2);imshow(I);
随意选取了一个线性结构元素,对图像进行闭操作。
I=imread("lab5_2.bmp"); %subplot(2,3,1);imshow(I); J1=imerode(I,strel('disk',3)); %subplot(2,3,2);imshow(J1); J2=imdilate(J1,strel('disk',1)); %subplot(2,3,3);imshow(J2); J3=imcomplement(J2); %subplot(2,3,4);imshow(J3); J4=imclose(J3,strel('square',2)); %subplot(2,3,5);imshow(J4); J5=imcomplement(J4); %subplot(2,3,6);imshow(J5); subplot(1,2,1);imshow(I); subplot(1,2,2);imshow(J5);
对于题目2中的图像,首先去除黑噪点。灰度图像的形态学处理已在上文介绍。首先,利用腐蚀操作与膨胀操作,先去除黑噪点。为了去除白噪点,还需要将图像的灰度级翻转,并再次利用相反的方法处理白噪点。利用闭操作,即先膨胀,再腐蚀,将白噪点消除。最后,将图像的灰度级再次翻转。最后输出的图像就是处理掉了黑色噪点与白色噪点的图像。
I=imread("lab4_out.jpg"); se = strel('disk',3); J=imclose(I,se); subplot(2,2,1);imshow(I);title('原图'); subplot(2,2,2);imshow(J);title('disk半径3'); J=imclose(I,strel('disk',10)); subplot(2,2,3);imshow(J);title('disk半径10'); J=imclose(I,strel('disk',7)); subplot(2,2,4);imshow(J);title('disk半径7');
对于实验4中的肺部图像,需要经过多次试验找到最合适disk圆盘形状的结构元素。在结果展示章节,会体现:结构元素半径过小不合适,结构元素半径过大也不合适。
I=imread("lab5_3.tif"); %subplot(2,2,1);imshow(I); [h,w]=size(I); A=I; B=imerode(I,strel('disk',1)); C=A-B; %subplot(2,2,2);imshow(C); L=bwlabel(C,8); s=regionprops(L,'Perimeter'); J2=ismember(L,find([s.Perimeter]>=200)); %subplot(2,2,3);imshow(J2); Jc=imcomplement(J2); marker=zeros(h,w); marker(1,:)=1; marker(h,:)=1; marker(:,1)=1; marker(:,w)=1; while 1 marker_pre=marker; dilation=imdilate(marker,strel('disk',1)); marker=dilation.*Jc; if marker_pre==marker J3=marker; break; end end J3=imcomplement(J3); %subplot(2,2,4);imshow(J3) subplot(1,2,1);imshow(I); subplot(1,2,2);imshow(J3)
对于题目4,首先需要像进行图像的边界提取。在边界提取的过程中也进行了腐蚀操作,腐蚀操作能够将肉眼看上去互相接触但实际上却没有接触的不同圆形也分离。之后,根据图像边界的周长,判断哪些圆是互相接触的,哪些圆没有互相接触。在本实验中,可以认为周长大于等于200的连通域是有互相接触的圆,而周长小于等于200的连通域没有互相接触的圆。在判断圆是否互相接触后,对这些圆内部的空洞进行填充,即边界提取的反向操作。最后,利用形态学操作得到了只包含边界接触的圆形。
实验结果
利用线性结构元素对图像进行腐蚀操作,可以看到连接线被明显地消除了。图像中心的圆角矩形边界也减小了一圈,图像周围的各个连通域也缩小了一圈。
利用线性结构元素对图像进行膨胀操作,可以看到连接线被明显地加粗了。图像中心的圆角矩形边界也扩大了一圈,图像周围的各个连通域也扩大了一圈。
利用线性结构元素对图像进行开操作,可以看到细小的连接线被消除了。但图像中心的圆角矩形边界保持不变,没有扩大没有缩小。图像周围的各个连通域也没有扩大没有缩小。
利用线性结构元素对图像进行闭操作,可以看到输出图像与原图像并无较大区别。但是,在图像中心的圆角矩形和直线间存在一部分狭小的空隙,这一部分空隙却被填充了。图像周围的部分与直线之间也存在空隙,而这些空隙也被填充了。
首先,使用腐蚀和膨胀操作消除图像黑色背景区域中的灰黑色噪声像素点。将图像的灰度值翻转,利用闭操作再消除图像出现的白色噪声像素点。最后,将消除了噪声的图像再次翻转,得到了背景为黑色且消除了噪声点的输出图像。输出图像与原图的对比如图9所示。可以看到,在去噪的同时也丢失了部分细节。但背景区域的大量噪点都被去除了。
为了对肺部图像进行填充,需要尝试不同的半径的结构元素作为参数。当半径过小时(半径为3),肺部仍然有一些部分不能得到填充。当半径过大时(半径为10),两个肺部区域被错误地连通了。只有当半径为7时,不仅能够正确地填充肺部内部区域,而且不同的肺部区域不会被连通。
利用形态学算法提取出只包含边界接触的圆时,先提取出这些圆的边界信息,利用边界的周长信息判断哪些连通域属于不同的圆连通在了一起,并认为周长大于等于200的连通域属于不同的圆连通在了一起。如图11.3所示,只保留这些周长大于等于200的连通域。最后,对这些连通域边界,对其内部的空洞重新进行填充,如图11.4所示。如图12,为实验题目4的整体效果。