1.利用 MATLAB 研究二值形态学图像处理常用算法;
2.掌握 MATLAB 形态学图像处理基本操作函数的使用方法;
3.了解形态学的基本应用。
1.编程实现二值图像的基本形态学处理(腐蚀、膨胀、开运算和闭运算) ;选择不同结构元素筛选图像目标。
2.用形态学运算实现灰度图像的噪声平滑和图像边缘提取。
见书《数字图像处理》
(冈萨雷斯著作,电子工业出版社于2009年12月1日出版)
需要编写的二值图像形态学变换函数:
functionnewbuf=BwFilter(oldbuf,select) 该函数调用 MATLAB 关于膨胀、腐蚀和图像筛选算法的相关函数,对二值图像进行相应的处理,最后结果存放在 newbuf 数组中。 编程实现 BwFilter()函数的功能。结构元素也可以用 ones 函数和 zeros函数创建。
Conv:相比较于原图像,因为腐蚀的结果要使得各像元比之前变得更小,所以适用于去除高峰噪声。而灰度值膨胀的结果会使得各像元比之前的变得更大,所以适用于去除低谷噪声。但是由于该实验中对原图像损失太大,使得膨胀后为较大颗粒,腐蚀后只剩较少颗粒。
开运算 = 先腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了) 。即分割出图像。
闭运算 = 先膨胀运算,再腐蚀运算(看上去将两个细微连接的图块封闭在一起) 。即让图像更加充实。
改变结构元素形状、大小后效果:
(1)膨胀
(2)腐蚀 开运算 闭运算 Conv:改变结构元素的形状和大小,分别使用了’disk’、’square’、’ones’和自定义矩阵等类型,大小由参数决定。以膨胀为例,可以看到同类型下,增大结构元素大小,白点部分膨胀得更厉害,而不同类型下,膨胀的方向和程度有所不同。对于腐蚀则使图像被腐蚀,对于开运算图像细的部分连接被打断,结构参数大小越大,图像白色部分越少;对于闭运算,图像连接增多,白色部分变多并变模糊,同样大小增大,程度加深,不同类型效果不同。
(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