数字图像处理Matlab-形态学图像处理(附代码)

1.Objectives:

1.利用 MATLAB 研究二值形态学图像处理常用算法;
2.掌握 MATLAB 形态学图像处理基本操作函数的使用方法;
3.了解形态学的基本应用。

2.Experiment Content:

1.编程实现二值图像的基本形态学处理(腐蚀、膨胀、开运算和闭运算) ;选择不同结构元素筛选图像目标。
2.用形态学运算实现灰度图像的噪声平滑和图像边缘提取。

3.Experiment Principle:

见书。

4.Experiment Steps Result and Conlusion:

1、二值图像的形态学变换

需要编写的二值图像形态学变换函数:

functionnewbuf=BwFilter(oldbuf,select) 该函数调用 MATLAB 关于膨胀、腐蚀和图像筛选算法的相关函数,对二值图像进行相应的处理,最后结果存放在 newbuf 数组中。 编程实现 BwFilter()函数的功能。结构元素也可以用 ones 函数和 zeros函数创建。
在这里插入图片描述

2、对输入图像进行形态学操作,即腐蚀、膨胀、开运算和闭运算,改变结构元素形状、大小,重做上述实验,比较实验结果,分析结构元素对运算的影响;

在这里插入图片描述
图1 膨胀 在这里插入图片描述图2 腐蚀 在这里插入图片描述图3 开运算 在这里插入图片描述图4 闭运算

Conv:相比较于原图像,因为腐蚀的结果要使得各像元比之前变得更小,所以适用于去除高峰噪声。而灰度值膨胀的结果会使得各像元比之前的变得更大,所以适用于去除低谷噪声。但是由于该实验中对原图像损失太大,使得膨胀后为较大颗粒,腐蚀后只剩较少颗粒。

开运算 = 先腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了) 。即分割出图像。

闭运算 = 先膨胀运算,再腐蚀运算(看上去将两个细微连接的图块封闭在一起) 。即让图像更加充实。

改变结构元素形状、大小后效果:

(1)膨胀
在这里插入图片描述
(2)腐蚀在这里插入图片描述 开运算在这里插入图片描述 闭运算在这里插入图片描述 Conv:改变结构元素的形状和大小,分别使用了’disk’、’square’、’ones’和自定义矩阵等类型,大小由参数决定。以膨胀为例,可以看到同类型下,增大结构元素大小,白点部分膨胀得更厉害,而不同类型下,膨胀的方向和程度有所不同。对于腐蚀则使图像被腐蚀,对于开运算图像细的部分连接被打断,结构参数大小越大,图像白色部分越少;对于闭运算,图像连接增多,白色部分变多并变模糊,同样大小增大,程度加深,不同类型效果不同。

3、以图FigP0936(bubbles_on_black_background).tif 为例完成分别以下功能:

(1)提取与图像边界融合的颗粒
(2)提取彼此交叠的颗粒
(3)提取不交叠的颗粒

提示:(1)可利用区域填充算法。如图所示为源图像,可将图像先转换为二值图像,然后对其进行取反,这样进行区域填充(闭运算)的结果将为与边界相连的颗粒,再与源图像进行比较,即可得出在源图像中与边界相连的颗粒图像。
(2)可利用图像的腐蚀与膨胀操作。先用模板对图像进行腐蚀操作,由于相交叠的颗粒面积必然比独立的颗粒大,因此腐蚀操作之后剩下的部分为交叠颗粒的部分,再对其进行膨胀,(开运算)将其与源图像进行比较操作,则可得出交叠的颗粒图像。
(3)得出交叠的颗粒之后,用源图像对其相减,则得出的为独立分布的颗粒图像
(1)在这里插入图片描述 (2)(3)
在这里插入图片描述
在这里插入图片描述Conv:(1)对原图进行填充,可明显观察到原先的白点变多,对原图实现了滤除噪声的效果。(2)对原图先腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了) 。是进行了开运算即分割出主要图像。(3)在进行相减,则为出去的小颗粒也就是分散的颗粒图。

【附录】实现代码

程序一

function newbuf=BwFilter(oldbuf,select) %子程序
if select==1                  %如果选择膨胀    
   A=strel('disk',5);        %构造结构元素    
   newbuf=imdilate(oldbuf,A);%进行膨胀处理
else
    if select==2              %如果选择腐蚀        
       B=strel('disk',5);        
       newbuf=imerode(oldbuf,B);
    else
        if select==3          %如果选择开运算           
          C=strel('square',3);           
          newbuf=imopen(oldbuf,C);
        else D=strel('square',3); %如果选择闭运算
            newbuf=imclose(oldbuf,D);        
        end
    end
end
end

程序二

clear all;clc;
addpath('E:\数字图像处理\程序与图像\dipum_toolbox_2.0.2(only run)');%添加相应的.p文件 
f=imread('lax.tif'); %读图像
m=input(''); %输入select种类,1代表膨胀,2代表腐蚀,3代表开运算,4代表闭运算

f1=im2bw(f);       %将图像转化为二值图像
f2=BwFilter(f1,m); %调用BwFilter子函数进行处理
subplot(121)       %显示原图(二值图像)
imshow(f1);
title('原图');
subplot(122)       %显示转化后图像imshow(f2);title('变换后图像');

程序三

clear all;clc;close all;                   %清空图像,释放变量
f=imread('FigP0936(bubbles_on_black_background).tif');%读图像
f1=im2bw(f);                               %转化为二值图像
f2=~f1;                                    %对图像取反
figure;imshow(f2);title('取反后图像');     %显示取反图像
f3=imfill(f2,'holes');                     %调用函数进行区域填充
figure;imshow(f3);title('区域填充后图像'); %显示区域填充后图像
g=f;                                       %使g等于f图像
[m,n]=size(g);        %取g图像的大小
for i=1:m             %将区域填充的结果与原图进行逐点比较,若该点在填充结果时为白,这点在g图像中便记为黑
    for j=1:n
        if f3(i,j)==1
            g(i,j)=0;
        end    
    end
end
figure;imshow(g);title('比较后图像');  %得到与边界相连的颗粒图像    

clear all;clc;
addpath('E:\数字图像处理\程序与图像\dipum_toolbox_2.0.2(only run)');%添加相应的.p文件 
f=imread('FigP0936(bubbles_on_black_background).tif');%读图像
mask1=strel(ones(15,15));  %用ones函数构造结构元素
mask1f2=imerode(f,mask1);       %对原图进行腐蚀处理
f3=filter2(fspecial('average',7),im2double(f2));%对腐蚀处理后结果进行滤波,滤波器形式由fspecial定义
f3=medfilt2(f3);           %进行中值滤波
f3=im2uint8(f3);           %将滤波后结果转化为无符号八位整型形式
figure;
imshow(f3);title('腐蚀并滤波后图像');%显示腐蚀并滤波后图像
mask2=strel('ball',12,12); %构造结构元素mask2
f4=imdilate(f3,mask2);     %再进行膨胀处理
figure;imshow(f4);title('膨胀后图像');%显示膨胀后图像
f5=f;                      %使f5等于f
[m,n]=size(f);             %得到原图的大小
for i=1:m                  %逐点比较处理后图像与原图,并做限幅处理,处理后图像中小于等于40的,一律省去,大于该值的取原图中的白点
    for j=1:n
        if f4(i,j)<=40
           f5(i,j)=0;
        else            f5(i,j)=f(i,j);        
        end    
    end
end

figure;imshow(f5);title('限幅比较后图像(交叠颗粒图像)');%显示交叠图像颗粒图
f6=f-f5;                   %将原图和交叠图像相减,得到独立分布颗粒图像
figure;imshow(f6);title('相减后图像(独立分布颗粒图像)');%显示独立分布颗粒图

附:本人对数学形态学的研究笔记

https://blog.csdn.net/weixin_42784535/article/details/105125411

发布了17 篇原创文章 · 获赞 12 · 访问量 1657

猜你喜欢

转载自blog.csdn.net/weixin_42784535/article/details/105125124