实验6 形态学图像处理

1. 实验目的

①掌握数字图像处理中,形态学方法的基本思想;

②掌握膨胀、腐蚀、开运算、闭运算等形态学基本运算方法;

③能够利用形态学基本运算方法,编程实现图像去噪,边界提取等功能。

2. 实验内容

①调用Matlab / Python+OpenCV中的相关函数,实现图像的膨胀、腐蚀、

开、闭运算。

②调用Matlab / Python+OpenCV中的相关函数,使用形态学基本算法,实

现图像去噪,并改变结构元素的尺寸和形状,观察去噪效果。

③调用Matlab / Python+OpenCV中的相关函数,实现对二值图像的边界提

取。

④自行编写代码,实现图像细化。

3. 实验过程

3.1 形态学基本运算

调用Matlab / Python+OpenCV库中的函数,实现图像的膨胀、腐蚀、开、闭运算。

3.1.1 图像的膨胀与腐蚀

选择或设计合适的二值图像,使用相同的结构元素对图像分别进行3次膨胀和3次腐蚀操作,记录图像的变化过程与结果。
⑴ 主要调用的函数、功能及参数说明

函数名 函数功能 参数说明
imread(A) 读取图片 A:图片在文件夹的位置
imdilate(A,B) 膨胀函数 A:图片 B:膨胀的结构元素
imerode(A,B) 腐蚀函数 A:图片 B:腐蚀的结构元素
stel(A,n) 构建结构元素 A:结构类型 n:结构元素大小

**⑵ 源代码及实验结果(添加必要注释)**

matlab 复制代码
image=imread('lena.png');
A1=im2bw(image);
%imdilate膨胀
B=[0 1 0
   1 1 1
   0 1 0];
A2=imdilate(A1,B);%图像A1被结构元素B膨胀
A3=imdilate(A2,B);
A4=imdilate(A3,B);
%imerode腐蚀
%strel函数的功能是运用各种形状和大小构造结构元素
se1=strel('disk',1);%这里是创建一个半径为1的平坦型圆盘结构元素
B2=imerode(A1,se1);
B3=imerode(B2,se1);
B4=imerode(B3,se1);

figure;
subplot(221),imshow(A1);title('imdilate膨胀原始图像');
subplot(222),imshow(A2);title('使用B后1次膨胀后的图像');
subplot(223),imshow(A3);title('使用B后2次膨胀后的图像');
subplot(224),imshow(A4);title('使用B后3次膨胀后的图像');

figure;
subplot(221),imshow(A1);title('imerode腐蚀原始图像');
subplot(222),imshow(B2);title('使用结构原始disk(1)后1次腐蚀后的图像');
subplot(223),imshow(B3);title('使用结构原始disk(1)后2次腐蚀后的图像');
subplot(224),imshow(B4);title('使用结构原始disk(1)后3次腐蚀后的图像');


⑶ 总结

膨胀:将模板与以每个像素为中心的33矩阵做点乘,并求和结果矩阵,如果结果大于0,则表示矩阵范围内有1值,可膨胀。腐蚀:将模板与以每个像素为中心的33矩阵做点乘,并求和结果矩阵,则表示模板中所有的像素都为1值,不可腐蚀。

3.1.2 图像的开运算与闭运算

选择或设计合适的二值图像,分别对图像进行开操作、闭操作、先开后闭操作和先闭后开操作,并记录图像的变化过程与结果。
⑴ 主要调用的函数、功能及参数说明

函数名 函数功能 参数说明
imread(A) 读取图片 A:图片在文件夹的位置
imdilate(A,B) 膨胀函数 A:图片 B:膨胀的结构元素
imerode(A,B) 腐蚀函数 A:图片 B:腐蚀的结构元素
stel(A,n) 构建结构元素 A:结构类型 n:结构元素大小
imopen(A,B) 开运算函数 A:图片 B:开运算的结构元素
imclose(A,B) 闭运算函数 A:图片 B:闭运算的结构元素
im2bw(A) 二值转化 A:图片

⑵ 源代码及实验结果(添加必要注释)

matlab 复制代码
image=imread('lena.png');
A1=im2bw(image);
se=strel('disk',2);%圆盘型结构元素

B1=imdilate(A1,se);%膨胀
C1=imerode(B1,se);%先膨胀再腐蚀 闭运算
B2=imerode(A1,se);%腐蚀
C2=imdilate(B2,se);%先腐蚀后膨胀 开运算

B3=imerode(C1,se);%腐蚀闭运算后图像
C3=imdilate(B3,se);%先腐蚀后膨胀 先闭后开
B4=imdilate(C2,se);%膨胀开运算后图像
C4=imerode(B4,se);%先膨胀再腐蚀 先开后闭

figure,
subplot(231),imshow(A1);title('原始图像');
subplot(232),imshow(C2);title('开运算');
subplot(233),imshow(C1);title('闭运算');
subplot(235),imshow(C4);title('先开后闭运算');
subplot(236),imshow(C3);title('先闭后开运算');


⑶ 总结

开运算消除图像毛刺以及椒盐噪声;闭运算可以填平轮廓内部缺失部分。

3.2 形态学图像去噪

选择或设计合适的二值图像,在Matlab / Python+OpenCV中,调用相关函数,综合使用形态学算法,实现图像去噪;尝试改变结构元素的大小和形状,观察去噪效果;使用不同的图像,观察去噪效果。
⑴ 主要调用的函数、功能及参数说明

函数名 函数功能 参数说明
imread(A) 读取图片 A:图片在文件夹的位置
imdilate(A,B) 膨胀函数 A:图片 B:膨胀的结构元素
imerode(A,B) 腐蚀函数 A:图片 B:腐蚀的结构元素
stel(A,n) 构建结构元素 A:结构类型 n:结构元素大小
im2bw(A) 二值转化 A:图片

⑵ 源代码及实验结果(添加必要注释)

matlab 复制代码
image=imread('lena.png');
Y1=imnoise(image,'salt & pepper',0.02);%椒盐
A1=im2bw(Y1);

se=strel('disk',1);%创建一个半径为1的平坦型圆盘结构元素
se1=strel('disk',2);%创建一个半径为2的平坦型圆盘结构元素
se2=strel('square',2);%创建2*2的正方形结构元素
se3=strel('square',3);%创建3*3的正方形结构元素

B1=imerode(A1,se);%腐蚀
C1=imdilate(B1,se);%先腐蚀后膨胀 开运算
B2=imerode(A1,se1);%腐蚀
C2=imdilate(B2,se1);%先腐蚀后膨胀 开运算
B3=imerode(A1,se2);%腐蚀
C3=imdilate(B3,se2);%先腐蚀后膨胀 开运算
B4=imerode(A1,se3);%腐蚀
C4=imdilate(B4,se3);%先腐蚀后膨胀 开运算

figure,
subplot(231),imshow(A1);title('二值化噪音原图');
subplot(232),imshow(C1);title('半径为1圆盘结构元素');
subplot(233),imshow(C2);title('半径为2圆盘结构元素');
subplot(235),imshow(C3);title('2*2的正方形结构元素');
subplot(236),imshow(C4);title('3*3的正方形结构元素');
3.3 形态学边界提取

选择或设计合适的二值图像,在Matlab / Python+OpenCV中,调用相关函数,综合使用形态学算法,实现对图像的边界提取。
⑴ 主要调用的函数、功能及参数说明

函数名 函数功能 参数说明
imread(A) 读取图片 A:图片在文件夹的位置
rgb2gray(A) 灰度转化 A:图片
graythresh(A) 最大类间方差法找阈值 A:灰度图片
bwperim (A) 查找二值图像的边缘 A:图片
entropyfilt (A) 创建纹理图像 A:图片
mat2gray((A) 矩阵转灰度图像 A:图片
im2bw(A) 二值转化 A:图片
bwareaopen(A) 提取区域纹理 A:提取条件
rangefilt(A,B) rangefilt滤波 A:图片 B:矩阵

⑵ 源代码及实验结果(添加必要注释)

matlab 复制代码
%边缘代码一:
image=imread('lena.png');

A=rgb2gray(image);
B=graythresh(A);%使用最大类间方差法找到图片的一个合适的阈值
B1=im2bw(A,B);%将输入图像中亮度大于B的所有像素替换为值1(白色),将所有其他像素替换为值0(黑色)
C=bwperim(B1);%查找二值图像的边缘

subplot(1,2,1),imshow(A),title('原图像');
subplot(1,2,2),imshow(C),title('边缘提取后的图像');

%边缘代码二:
% image=imread('D:\picture\1.jpg');
% img=rgb2gray(image);
% 
% img_1 = entropyfilt(img);  %创建纹理图像
% img_2 = mat2gray(img_1);  %转化为灰度图像
% img_3 = im2bw(img_2,0.7);  %转化为二值图像
% img_4 = bwareaopen((1-img_3),3000,8); %提取区域纹理
% img_5= rangefilt (img,ones(7));  %rangefilt滤波
% 
% subplot(2,3,1),imshow(img),title('原图像');
% subplot(2,3,2),imshow(img_2),title('纹理图像');
% subplot(2,3,3),imshow(img_3),title('二值图像');
% subplot(2,3,4),imshow(img_4),title('不同区域纹理图像');
% subplot(2,3,5),imshow(img_5),title('滤波后图像');


⑶ 总结

MATLAB工具中提供了用于边缘提取的bwperim( )函数,由bwperim( )函数可以实现各算子对图像边缘的提取。

4. 实验小结

①为了更好的观察和对比不同形态学运算的效果,应如何设计或选择实验图像?

答:颜色特征、形状特征、纹理特征、空间关系特征,描述了图像或图像区域所对应的景物的表面性质。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好的捕捉图像中对象的局部特征。形状特征是统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗能力。

②使用同样的结构元素对同一副图像先膨胀后腐蚀,和先腐蚀后膨胀,得到的结果一样吗?增加膨胀和腐蚀的次数,会得到怎样的效果?

答:不同。

膨胀操作会扩大(粗化)图像中物体的轮廓,可以用来弥补(填充)物体间的孔洞,强化离散点,代价是导致物体的面积比原来的面积要大。腐蚀操作会收缩(细化)图像中物体的轮廓,可以用来断开(分离)物体间的连接,消除离散点,代价是导致物体的面积比原来的面积要小。

③应用形态学方法对图像去噪时,结构元素的形状和大小会怎样影响去噪结果?

答:结构元素在形态学中的作用类似于信号处理时的"滤波窗口"其形状和大小将直接影响形态滤波的输出结果

④查阅资料,并结合实验结果,简述形态学方法的主要应用,并思考其具备哪些优点、不足和局限性。

答:消除噪声、边界提取、区域填充、连通分量提取、凸壳、细化、粗化等;分割出独立的图像元素,或者图像中相邻的元素;求取图像中明显的极大值区域和极小值区域;求取图像梯度。

相关推荐
XD7429716367 分钟前
用Hugging Face Transformers,高效部署:多显卡量化感知训练并转换为ONNX格式的多标签分类模型
人工智能·pytorch·分类
酒酿小圆子~7 分钟前
PyTorch之nn.Module、nn.Sequential、nn.ModuleList使用详解
人工智能·pytorch·python
集星引擎+UP2020J26 分钟前
短视频矩阵系统:打造品牌影响力的新方式
大数据·数据库·人工智能·线性代数·矩阵
大数据AI人工智能培训专家培训讲师叶梓29 分钟前
智能旅行规划的未来:大模型与形式化验证的融合
人工智能·深度学习·算法·语言模型·自然语言处理·推理·旅行规划
哥廷根数学学派30 分钟前
一维信号短时傅里叶变换域邻域降噪方法(MATLAB)
开发语言·人工智能·算法·机器学习·matlab·语音识别
半度、31 分钟前
torchaudio.load() 和 librosa.load() 的返回值区别
人工智能
只是有点小怂42 分钟前
【PYG】pytorch中size和shape有什么不同
人工智能·pytorch·深度学习
reept42 分钟前
Pytorch(5)-----梯度计算
人工智能·pytorch·python·机器学习
托比-马奎尔43 分钟前
6.26.3 基于Transformer的深度神经网络在数字乳腺断层合成图像上的乳腺癌分类
人工智能·神经网络·dnn
联蔚盘云1 小时前
深度学习赋能数据分析,联蔚盘云引领业务革新
人工智能·深度学习·数据分析