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:结构元素大小 |
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:图片 |
⑵ 源代码及实验结果(添加必要注释)
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:图片 |
⑵ 源代码及实验结果(添加必要注释)
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:矩阵 |
⑵ 源代码及实验结果(添加必要注释)
%边缘代码一:
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. 实验小结
①为了更好的观察和对比不同形态学运算的效果,应如何设计或选择实验图像?
答:颜色特征、形状特征、纹理特征、空间关系特征,描述了图像或图像区域所对应的景物的表面性质。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好的捕捉图像中对象的局部特征。形状特征是统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗能力。
②使用同样的结构元素对同一副图像先膨胀后腐蚀,和先腐蚀后膨胀,得到的结果一样吗?增加膨胀和腐蚀的次数,会得到怎样的效果?
答:不同。
膨胀操作会扩大(粗化)图像中物体的轮廓,可以用来弥补(填充)物体间的孔洞,强化离散点,代价是导致物体的面积比原来的面积要大。腐蚀操作会收缩(细化)图像中物体的轮廓,可以用来断开(分离)物体间的连接,消除离散点,代价是导致物体的面积比原来的面积要小。
③应用形态学方法对图像去噪时,结构元素的形状和大小会怎样影响去噪结果?
答:结构元素在形态学中的作用类似于信号处理时的“滤波窗口”其形状和大小将直接影响形态滤波的输出结果
④查阅资料,并结合实验结果,简述形态学方法的主要应用,并思考其具备哪些优点、不足和局限性。
答:消除噪声、边界提取、区域填充、连通分量提取、凸壳、细化、粗化等;分割出独立的图像元素,或者图像中相邻的元素;求取图像中明显的极大值区域和极小值区域;求取图像梯度。