MATLAB数字影像处理试验--影像基本上演算
一、试验目地
1.认知影像点演算、拓扑演算、欧几里得演算的基本上表述和常用方式;
2.掌控在MTLAB中对影像展开点演算、拓扑演算、欧几里得演算的方式;
3.掌控在MATLAB中展开对数的方式
4.利用MATLAB词汇展开影像的对数翻转和对数转动
5.更进一步熟识介绍MATLAB语言的应用领域。
二、试验电子设备与应用软件
1.PC计算机系统系统
2.MATLAB应用软件,主要包括影像处理widget(Image Processing Toolbox)
3.试验图片
三、试验文本及结论预测
3.1影像的点演算
优先选择pout.tif做为试验影像,试验基本原理及文本参考《MATLAB影像处理及程式设计应用领域》6、7段落。
程序代码:
I=imread(pout.tif);
figure;
subplot(1,3,1);
imshow(I);
title(图稿);
J=imadjust(I,[0.3;0.6],[0.1;0.9]);
subplot(1,3,2);
imshow(J);
title(非线性扩充);
I1=double(I);
I2=I1/255;
C=2;
K=C*log(1+I2);
subplot(1,3,3);
imshow(K);
title(非线性扩充);
M=255-I;
figure;
subplot(1,3,1);
imshow(M);
title(位图倒转);
N1=im2bw(I,0.4);
N2=im2bw(I,0.7);
subplot(1,3,2);
imshow(N1);
title(二值化阈值0.4);
subplot(1,3,3);
imshow(N2);
title(二值化阈值0.7);
执行结论:
3.2影像的拓扑演算
优先选择两幅影像,一幅是原影像,一幅为背景影像,采用正确的影像拓扑演算方式,分别实现影像叠加、混合影像的分离和影像的局部显示效果。
(1)选取两幅大小一样的图像1.jpg和2.jpg,将两幅影像展开加法演算。
程序代码:
clc;
clear;
I1=imread(1.jpg);
I2=imread(2.jpg);
I1=im2double(I1);
I2=im2double(I2);
K=0.5*I1+0.5*I2;
subplot(1,3,1);imshow(I1);title(原影像);
subplot(1,3,2);imshow(I2);title(背景影像);
subplot(1,3,3);imshow(K);title(相加后的影像);
imwrite(K,1_2.jpg);
执行结论:
结论预测:
两个矩阵相加,执行点对点演算,两边操作数的矩阵必须是同型的。
若K=I1+0.5*I2,则影像结论溢出,修改程序结论如上。多个影像相加不产生溢出的条件是所有图像叠加不能超过数据类型所支持的最大值(各系数之和不大于1)。如果把I1=im2double(I1)改成I1=double(I1)则程序执行结论是“原影像”和“相加后的影像”都溢出。
(2)优先选择(1)中得到的混合影像12.jpg,将混合影像与背景影像2.jpg做减法演算,得到源影像。
程序代码:
clc;
clear;
I3=imread(1_2.jpg);
I4=imread(2.jpg);
I3=im2double(I3);
I4=im2double(I4);
C=(I3-0.5*I4)*2;
subplot(1,3,1);imshow(I3);title(混合影像);
subplot(1,3,2);imshow(I4);title(背景影像);
subplot(1,3,3);imshow(C);title(分离后的影像);
执行结论:
(3)程序实现一幅尺寸为MXN像素的影像做为掩模模板(M、N的大小与源影像一致),对于需要留下来的区域,掩模影像的像素值置为1,而在需要被抑制掉的区域,掩模影像的像素值置为0(可以使用影像3.jpg)
程序代码:
clc;
clear;
I5=imread(3.jpg);
I5=im2double(I5);
I=zeros(264,352,3);
I(32:232,26:326,:)=1;
D=I5.*I;
subplot(1,3,1);imshow(I5);title(原影像);
subplot(1,3,2);imshow(I);title(模板影像);
subplot(1,3,3);imshow(D);title(局部影像);
执行结论:
3.3影像的翻转
对一幅影像实现按比例缩小和不按比例任意缩小的效果,以及影像的成倍放大和不按比例放大效果。选取一幅影像3.jpg,分别将影像比例放大1.5倍,比例缩小0.7倍,非比例放大到620×380像素,非比例缩小到80×180像素。
程序代码:
clc;
clear;
I1=imread(3.jpg);
I2=imresize(I1,1.5);
I3=imresize(I1,0.7);
I4=imresize(I1,[620,380]);
I5=imresize(I1,[80,180]);
figure;
imshow(I1);title(原影像);
figure;
subplot(2,2,1);imshow(I2);title(比例放大1.5倍图);
subplot(2,2,2);imshow(I3);title(比例放大0.7倍图);
subplot(2,2,3);imshow(I4);title(非比例放大图);
subplot(2,2,4);imshow(I5);title(非比例缩小图);
执行结论:
3.4影像的转动
将影像lena.tiff分别转动45度和90度,与原影像相比,观察它们的区别。
读取影像lena.tiff,设置转动角度分别45度和90度,采用影像转动函数imrotate对影像展开转动。
程序代码:
clc;
clear;
I=imread(lena.tiff);
J=imrotate(I,45);
K=imrotate(I,90);
subplot(1,3,1);imshow(I);title(原影像);
subplot(1,3,2);imshow(J);title(转动45度影像);
subplot(1,3,3);imshow(K);title(转动90度影像);
执行结论:
3.5.试验要求设计一个程序完成下列要求。(影像可以自选,如lena.tiff)
(1)给一幅影像加入密度为 0.06椒盐噪声后并与前一张图显示在同一影像对话框中;
程序代码:
clc;
clear;
I=imread(lena.tiff);
J=imnoise(I,salt & pepper,0.06);
subplot(1,2,1),imshow(I),title(原影像);
subplot(1,2,2),imshow(J),title(加椒盐噪声);
执行结论:
(2)给一幅影像加入均值为0,方差为0.01的高斯噪声后并与前一张图显示在同一影像对话框中;
程序代码:
clc;
clear;
I=imread(lena.tiff);
J=imnoise(I,gaussian,0,0.01);
subplot(1,2,1),imshow(I),title(原影像);
subplot(1,2,2),imshow(J),title(加高斯噪声);
执行结论:
(3)利用for循环,将100幅加有噪声的影像展开相加并求其平均值,显示求平均后影像。比较均值去噪方式对零均值高斯和椒盐两张噪声的去噪效果。
程序代码:
clc;
clear;
I=imread(lena.tiff);
K1=zeros(512,512);
K2=zeros(512,512);
fori=1:100
J1=imnoise(I,gaussian,0,0.01);
J2=imnoise(I,salt & pepper,0.01);
J1=im2double(J1);
J2=im2double(J2);
K1=K1+J1;
K2=K2+J2;
end
K1=K1/100;
K2=K2/100;
subplot(1,2,1),imshow(K1),title(高斯噪声相加求平均后的影像);
subplot(1,2,2),imshow(K2),title(椒盐噪声相加求平均后的影像);
执行结论:
(4)观察影像pout.tif的直方图;
程序代码:
clc;
clear;
I=imread(pout.tif);
subplot(1,2,1),imshow(I),title(原影像);
subplot(1,2,2),imhist(I),title(影像的直方图);
执行结论:
(5)利用matlab的imadjust函数实现的影像pout.tif对比度增强。
计算机系统程序:
clc;
clear;
I=imread(pout.tif);
J=imadjust(I,[0.3 0.7],[]);
subplot(1,2,1),imshow(I),title(原影像);
subplot(1,2,2),imshow(J),title(对比度增强后的影像);
执行结论:
4.思考题
(1)为什么用I = imread(‘lena.bmp’) 命令得到的影像I 不可以展开算术演算?
答:不同类型的影像其存储的结构也是不同的,影像演算只能对同种类型的影像矩阵展开演算。
(2)常用的欧几里得变换有哪些?
答:影像的平移,转动、镜像和翻转等。
(3)多幅影像平均的降噪方式对哪种噪声类型比较有效?
答:对高斯噪声的降噪效果比较好。
(4)在一个非线性拉伸变换中,当a,b取何值时,可以将位图值分别从23和155变换为16和240?
答:由公式S=ar+b;
得:16=23a+b; 240=155a+b;
解得:a=1.7; b=-23;
5.附加题(选作)
试着自选一幅人像和一幅背景影像,综合利用影像基本上演算方式给人像加上矩形背景相框,相框上下的宽度为100像素,以内的宽度为50像素,或者根据所选影像的分辨率自行设置相框各方向的宽度。
程序代码:
clc;
clear;
I=imread(lena.jpg);
I=im2double(I);
A=zeros(512,512,3);
A(12:500,12:500,:)=1;%相框上下、以内均为12像素
J=A.*I;
imshow(J);
执行结论:
四、试验中遇到问题及解决方式
试验中遇到的问题:在实现影像点演算时,没有注意彩色影像和位图影像是不能直接演算的,要保证两边操作数的矩阵必须是同型的。解决方式:将两边影像转化为三通道的彩色影像展开相演算,或者通过rgb2gray()函数将两边影像转化为灰色影像,然后展开演算。
五、试验笔记
通过此次试验,我学会了利用MATLAB实现影像的点演算、拓扑演算、欧几里得演算,介绍了其试验基本原理;还掌控了在MATLAB中展开对数的方式并利用MATLAB词汇展开影像的对数翻转和对数转动。通过解决了试验中遇到的一些问题,更进一步熟识介绍MATLAB语言。
六、源程序清单(加上必要的注释,注释“%”开头)
%%
%1.影像的点演算
I=imread(pout.tif);
figure;
subplot(1,3,1);
imshow(I);
title(图稿);
J=imadjust(I,[0.3;0.6],[0.1;0.9]);
subplot(1,3,2);
imshow(J);
title(非线性扩充);
I1=double(I);
I2=I1/255;
C=2;
K=C*log(1+I2);
subplot(1,3,3);
imshow(K);
title(非线性扩充);
M=255-I;
figure;
subplot(1,3,1);
imshow(M);
title(位图倒转);
N1=im2bw(I,0.4);
N2=im2bw(I,0.7);
subplot(1,3,2);
imshow(N1);
title(二值化阈值0.4);
subplot(1,3,3);
imshow(N2);
title(二值化阈值0.7);
%%
%2.影像的拓扑演算(1)
clc;
clear;
I1=imread(1.jpg);
I2=imread(2.jpg);
I1=im2double(I1);
I2=im2double(I2);
K=0.5*I1+0.5*I2;
subplot(1,3,1);imshow(I1);title(原影像);
subplot(1,3,2);imshow(I2);title(背景影像);
subplot(1,3,3);imshow(K);title(相加后的影像);
imwrite(K,1_2.jpg);
%%
%2.影像的拓扑演算(2)
clc;
clear;
I3=imread(1_2.jpg);
I4=imread(2.jpg);
I3=im2double(I3);
I4=im2double(I4);
C=(I3-0.5*I4)*2;
subplot(1,3,1);imshow(I3);title(混合影像);
subplot(1,3,2);imshow(I4);title(背景影像);
subplot(1,3,3);imshow(C);title(分离后的影像);
%%
%2.影像的拓扑演算(3)
clc;
clear;
I5=imread(3.jpg);
I5=im2double(I5);
I=zeros(264,352,3);
I(32:232,26:326,:)=1;
D=I5.*I;
subplot(1,3,1);imshow(I5);title(原影像);
subplot(1,3,2);imshow(I);title(模板影像);
subplot(1,3,3);imshow(D);title(局部影像);
%%
%3.影像的翻转
clc;
clear;
I1=imread(3.jpg);
I2=imresize(I1,1.5);
I3=imresize(I1,0.7);
I4=imresize(I1,[620,380]);
I5=imresize(I1,[80,180]);
figure;
imshow(I1);title(原影像);
figure;
subplot(2,2,1);imshow(I2);title(比例放大1.5倍图);
subplot(2,2,2);imshow(I3);title(比例放大0.7倍图);
subplot(2,2,3);imshow(I4);title(非比例放大图);
subplot(2,2,4);imshow(I5);title(非比例缩小图);
%%
%4.影像的转动
clc;
clear;
I=imread(lena.tiff);
J=imrotate(I,45);
K=imrotate(I,90);
subplot(1,3,1);imshow(I);title(原影像);
subplot(1,3,2);imshow(J);title(转动45度影像);
subplot(1,3,3);imshow(K);title(转动90度影像);
%%
%5(1)
clc;
clear;
I=imread(lena.tiff);
J=imnoise(I,salt & pepper,0.06);
subplot(1,2,1),imshow(I),title(原影像);
subplot(1,2,2),imshow(J),title(加椒盐噪声);
%%
%5(2)
clc;
clear;
I=imread(lena.tiff);
J=imnoise(I,gaussian,0,0.01);
subplot(1,2,1),imshow(I),title(原影像);
subplot(1,2,2),imshow(J),title(加高斯噪声);
%%
%5(3)
clc;
clear;
I=imread(lena.tiff);
K1=zeros(512,512);%初始化影像累加器,矩阵大小要与I一致
K2=zeros(512,512);
fori=1:100
J1=imnoise(I,gaussian,0,0.01); %零均值高斯噪声
J2=imnoise(I,salt & pepper,0.01);%椒盐噪声
J1=im2double(J1);
J2=im2double(J2);
K1=K1+J1;
K2=K2+J2;
end
K1=K1/100;%求影像的平均
K2=K2/100;
subplot(1,2,1),imshow(K1),title(高斯噪声相加求平均后的影像);
subplot(1,2,2),imshow(K2),title(椒盐噪声相加求平均后的影像);
%%
%5(4)
clc;
clear;
I=imread(pout.tif);
subplot(1,2,1),imshow(I),title(原影像);
subplot(1,2,2),imhist(I),title(影像的直方图);
%%
%5(5)
clc;
clear;
I=imread(pout.tif);
J=imadjust(I,[0.3 0.7],[]);
subplot(1,2,1),imshow(I),title(原影像);
subplot(1,2,2),imshow(J),title(对比度增强后的影像);
%%
%附加题
clc;
clear;
I=imread(lena.jpg);
I=im2double(I);
A=zeros(512,512,3);
A(12:500,12:500,:)=1;%相框上下、以内均为12像素
J=A.*I;
imshow(J);
还木有评论哦,快来抢沙发吧~