数字图像处理实验报告全答案.docx
《数字图像处理实验报告全答案.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验报告全答案.docx(26页珍藏版)》请在冰豆网上搜索。
![数字图像处理实验报告全答案.docx](https://file1.bdocx.com/fileroot1/2022-12/13/19f0e45d-9617-4995-8007-2424e90f5549/19f0e45d-9617-4995-8007-2424e90f55491.gif)
数字图像处理实验报告全答案
实验一常用MATLAB图像处理命令
一、实验目的
1、熟悉并掌握MATLAB工具的使用;
2、实现图像的读取、显示、代数运算和简单变换。
二、实验环境
MATLAB以上版本、WINXP或WIN2000计算机
三、常用函数
●读写图像文件
1imread
imread函数用于读入各种图像文件,如:
a=imread('e:
\')
2imwrite
imwrite函数用于写入图像文件,如:
imwrite(a,'e:
\',’tif’)
3imfinfo
imfinfo函数用于读取图像文件的有关信息,如:
imfinfo('e:
\')
●图像的显示
1image
image函数是MATLAB提供的最原始的图像显示函数,如:
a=[1,2,3,4;4,5,6,7;8,9,10,11,12];
image(a);
2imshow
imshow函数用于图像文件的显示,如:
i=imread('e:
\');
imshow(i);
title(‘原图像’)%加上图像标题
3colorbar
colorbar函数用显示图像的颜色条,如:
i=imread('e:
\');
imshow(i);
colorbar;
4figure
figure函数用于设定图像显示窗口,如:
figure
(1);/figure
(2);
5subplot
把图形窗口分成多个矩形部分,每个部分可以分别用来进行显示。
Subplot(m,n,p)分成m*n个小窗口,在第p个窗口中创建坐标轴为当前坐标轴,用于显示图形。
6plot
绘制二维图形
plot(y)
Plot(x,y)xy可以是向量、矩阵。
●图像类型转换
1rgb2gray
N须是0,4,6,8.当N大于0时,圆盘形结构元素由一组N(或N+2)个周期线结构元素来近似。
当N等于0时,不使用近似,即结构元素的所有像素是由到中心像素距离小于等于R的像素组成。
N可以被忽略,此时缺省值是4。
注:
形态学操作在N>0情况下要快于N=0的情形。
如:
se1=strel('square',11)%11乘以11的正方形
4imerode
腐蚀图像
用法:
IM2=imerode(IM,SE)
腐蚀灰度、二进制或压缩二进制图像IM,返回腐蚀图像IM2。
参数SE是函数strel返回的一个结构元素体或是结构元素体阵列。
如:
使用一个盘状结构元素腐蚀一幅二进制图像。
originalBW=imread('');
se=strel('disk',11);
erodedBW=imerode(originalBW,se);
imshow(originalBW),figure,imshow(erodedBW)
5imdilate
膨胀图像
用法:
IM2=imdilate(IM,SE)
膨胀灰度图像、二值图像、或者打包的二值图像IM,返回膨胀图像M2。
变量SE是一个结构元素或者一个结构元素的数组,其是通过strel函数返回的。
如:
利用一个运行结构元素膨胀灰度图像。
I=imread('');
se=strel('ball',5,5);
I2=imdilate(I,se);
imshow(I),title('Original')
figure,imshow(I2),title('Dilated')
三、实验步骤
1、产生运动模糊图像,运用维纳滤波进行图像恢复,显示结果。
i=imread('f:
\')
I=rgb2gray(s)
I=im2double(I);
%模拟运动模糊
LEN=21;
THETA=11;
PSF=fspecial('motion',LEN,THETA);
blurred=imfilter(I,PSF,'conv','circular');
%恢复图像
wnr2=deconvwnr(blurred,PSF);
subplot(1,2,1);imshow(blurred);title('运动模糊图像')
subplot(1,2,2);imshow(wnr2);title('恢复图像')
2、采用三种不同算子检测图像边缘,显示结果。
i=imread('f:
\')
BW1=edge(I,'prewitt');
BW2=edge(I,'zerocross');
BW3=edge(I,'canny');
subplot(2,2,1);imshow(i);title('原图像')
subplot(2,2,2);imshow(BW1);title('prewitt边缘图')
subplot(2,2,3);imshow(BW2);title('zerocross边缘图')
subplot(2,2,4);imshow(BW3);title('canny边缘图')
3、对二值图像分别进行方形模板3*3和5*5的膨胀和腐蚀操作,显示结果。
a=imread('f:
\')
i=rgb2gray(a)
I=im2bw(a,
se3=strel('disk',3);
erodedBW1=imerode(I,se3);
se4=strel('disk',5);
erodedBW2=imerode(I,se4);
se1=strel('ball',3,3);
I1=imdilate(a,se1);
se2=strel('ball',5,5);
I2=imdilate(a,se2);
subplot(2,2,1);imshow(I1);title('3*3膨胀图像')
subplot(2,2,2);imshow(I2);title('5*5膨胀图像')
subplot(2,2,3);imshow(erodedBW1);title('3*3腐蚀图像')
subplot(2,2,4);imshow(erodedBW2);title('5*5腐蚀图像')
实验六图像处理实际应用
一、实验目的
1、熟悉并掌握MATLAB图像处理工具箱的使用;
2、理解并掌握常用的图像处理技术。
二、实验环境
MATLAB以上版本、WINXP或WIN2000计算机
三、实验内容
调试运行下列程序,分析程序,对每条语句给出注释,并显示最终执行结果。
总结算法思想及优缺点.
I=imread('');
[y,x,z]=size(I);
myI=double(I);
%%%%%%%%%%%RGBtoHSI%%%%%%%%
tic
%%%%%%%%Y方向%%%%%%%%%%
Blue_y=zeros(y,1);
fori=1:
y
forj=1:
x
if((myI(i,j,1)<=30)&&((myI(i,j,2)<=62)&&(myI(i,j,2)>=51))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=119)))%蓝色RGB的灰度范围
Blue_y(i,1)=Blue_y(i,1)+1;
end
end
end
[tempMaxY]=max(Blue_y);%Y方向车牌区域确定
PY1=MaxY;
while((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while((Blue_y(PY2,1)>=5)&&(PY2PY2=PY2+1;
end
IY=I(PY1:
PY2,:
:
);
%%%%%%%%X方向%%%%%%%%%%
Blue_x=zeros(1,x);
forj=1:
x
fori=PY1:
PY2
if((myI(i,j,1)<=30)&&((myI(i,j,2)<=62)&&(myI(i,j,2)>=51))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=119)))
Blue_x(1,j)=Blue_x(1,j)+1;
end
end
end
PX1=1;
while((Blue_x(1,PX1)<3)&&(PX1PX1=PX1+1;
end
PX2=x;
while((Blue_x(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
PX1=PX1-2;%对车牌区域的修正
PX2=PX2+2;
Plate=I(PY1:
PY2,PX1-2:
PX2,:
);
t=toc%读取计时
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure,imshow(I);
figure,plot(Blue_y);grid
figure,plot(Blue_x);grid
figure,imshow(IY);
添加注释和改正后的程序:
I=imread('f:
\');%读取图片
[y,x,z]=size(I);%给定图片大小
myI=double(I);%返回双精度值
%%%%%%%%%%%RGBtoHSI%%%%%%%%
tic%计时开始
%%%%%%%%Y方向%%%%%%%%%%
Blue_y=zeros(y,1);%一列全零矩阵
fori=1:
y%给定i的范围
forj=1:
x%给定j的范围
if((myI(i,j,1)<=30)&&((myI(i,j,2)<=62)&&(myI(i,j,2)>=51))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=119)))%蓝色RGB的灰度范围
Blue_y(i,1)=Blue_y(i,1)+1;%y矩阵加一
end
end
end
[tempMaxY]=max(Blue_y);%Y方向车牌区域确定
PY1=MaxY;%y矩阵的最大元素
while((Blue_y(PY1,1)>=5)&&(PY1>1))%确定蓝色RGBBlue_y所在位置
PY1=PY1-1;%对车牌区域的修正,向上调整
end
PY2=MaxY;%y矩阵的最大元素
while((Blue_y(PY2,1)>=5)&&(PY2PY2=PY2+1;%对车牌区域的修正向下调整
end
IY=I(PY1:
PY2,:
:
);%行的范围
%%%%%%%%X方向%%%%%%%%%%
Blue_x=zeros(1,x);%一行全一矩阵
forj=1:
x%给定j的取值范围
fori=PY1:
PY2%给定i的取值范围
if((myI(i,j,1)<=30)&&((myI(i,j,2)<=62)&&(myI(i,j,2)>=51))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=119)))%调整I中的范围
Blue_x(1,j)=Blue_x(1,j)+1;%Blue_x的矩阵加一
end
end
end
PX1=1;%当PX1等于1时
while((Blue_x(1,PX1)<3)&&(PX1PX1=PX1+1;%对车牌区域的修正向下调整
end
PX2=x;%当PX2等于x时
while((Blue_x(1,PX2)<3)&&(PX2>PX1))%确定蓝色RGBBlue_x的位置
PX2=PX2-1;%对车牌区域的修正向下调整
end
PX1=PX1-2;%对车牌区域的修正
PX2=PX2+2;%对车牌区域的修正
Plate=I(PY1:
PY2,PX1-2:
PX2,:
);%矩阵行列的范围
t=toc%读取计时
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure,imshow(I);%创建图像窗口,显示图像I
figure,plot(Blue_y);grid%创建图像窗口,绘制Blue_y图像,画出网格线
figure,plot(Blue_x);grid%创建图像窗口,绘制Blue_x图像,画出网格线
figure,imshow(Plate);%创建图像窗口,显示图像Plate
t=
实验二图像基本操作
一、实验目的
1、熟悉及掌握图像的采样原理,实现图像的采样过程,进行图像的灰度转换。
2、理解直方图的概念及应用,实现图像直方图的显示,及通过直方图均衡和直方图规定化方法对图像进行修正。
二、实验环境
MATLAB以上版本、WINXP或WIN2000计算机
三、相关函数
●图像的增强
1、直方图
imhist函数用于数字图像的直方图计算或显示,
imhist(I, n)计算和显示图像I的直方图,n为指定的灰度级数目,默认为256。
如果I是二值图像,那么n仅有两个值。
[counts,x] = imhist(...)返回直方图数据向量counts,相应的色彩值向量x。
如:
i=imread('e:
\');
imhist(i);
2、直方图均衡化
histeq函数用于数字图像的直方图均衡化,
J=histeq(I,n) 均衡化后的级数n,缺省值为64。
J=histeq(I,hgram)"直方图规定化",即将原是图象I的直方图变换成用户指定的向量hgram(即指定另一幅图像的直方图数据向量)。
如:
i=imread('e:
\');
j=histeq(i,N);对图像i执行均衡化,得到具有N个灰度级的灰度图像j,N缺省值为64
3、灰度调整
imadjust函数用于数字图像的灰度或颜色调整,
J=imadjust(I)将灰度图像I中的亮度值映射到J中的新值并使1%的数据是在低高强度和饱和,这增加了输出图像J的对比度值。
J=imadjust(I,[low_in;high_in],[low_out;high_out])
将图像I中的亮度值映射到J中的新值,即将low_in至high_in之间的值映射到low_out至high_out之间的值。
low_in以下与high_in以上的值被剪切掉了,也就是说,low_in以下的值映射到low_out,high_in以上的值映射到high_out。
它们都可以使用空的矩阵[],默认值是[01]。
如:
i=imread('e:
\');
j=imadjust(i,[,],[]);将图像i转换为j,使灰度值从~与缺省值0~1相匹配
●运算函数
1、Zeros生成全0数组或矩阵
如B=zeros(m,n)orB=zeros([mn])返回一个m*n全0矩阵
2、取整函数
floor最小取整函数
round四舍五入取整函数
ceil最大取整函数
如a=[,,,,,+]
I=round(a)
I=[-203672+4i]
四、实验内容
1、对一幅图像进行2倍、4倍、8倍和16倍减采样,显示结果。
a=imread('f:
/');
b=rgb2gray(a);
form=1:
4
figure
[width,height]=size(b);
quartimage=zeros(floor(width/(m)),floor(height/(2*m)));
k=1;
n=1;
fori=1:
(m):
width
forj=1:
(2*m):
height
quartimage(k,n)=b(i,j);
n=n+1;
end
k=k+1;
n=1;
end
imshow(uint8(quartimage));
End
2、显示一幅灰度图像a,改变图像亮度使其整体变暗得到图像b,显示两幅图像的直方图。
a=imread('f:
\')
c=rgb2gray(a)
b=c-46
subplot(2,1,1);imhist(c);title('原图像')
subplot(2,1,2);imhist(b);title('变暗后的图像')
3、对图像b进行直方图均衡化,显示结果图像和对应直方图。
b=imread('f:
\')
c=rgb2gray(b)
j=histeq(c)
subplot(2,2,1),imshow(c)
subplot(2,2,2),imshow(j)
subplot(2,2,3),imhist(c)%显示原始图像直方图
subplot(2,2,4),imhist(j)%显示均衡化后图像的直方图
4、读入图像c,执行直方图规定化,使图像a的灰度分布与c大致相同,显示变换后图像及对应直方图。
I=imread('f:
\');
>>J=histeq(I,64);%均衡化成32个灰度级的直方图
>>[counts,x]=imhist(J);%返回直方图图像向量counts
b=imread('f:
\')
Q=rgb2gray(b)
>>M=histeq(Q,counts);%将原始图像Q的直方图变成指定向量counts
>>figure,
>>subplot(3,2,1),imshow(I);
>>subplot(3,2,2),imshow(Q);
>>subplot(3,2,3),imhist(I);
>>subplot(3,2,4),imhist(Q)
>>subplot(3,2,5),imhist(J);
>>subplot(3,2,6),imhist(M);
实验三图像变换
一、实验目的
1、熟悉及掌握图像的变换原理及性质,实现图像的傅里叶变换。
二、实验环境
MATLAB以上版本、WINXP或WIN2000计算机
三、相关函数
●图像的变换
1fft2
fft2函数用于数字图像的二维傅立叶变换,如:
i=imread('e:
\');
j=fft2(i);
由于MATLAB无法显示复数图像,因此变换后的结果还需进行求模运算,即调用abs函数。
之后常常还进行对数变换,即调用log函数,以减缓傅里叶谱的快速衰减,更好地显示高频信息。
2ifft2
ifft2函数用于数字图像的二维傅立叶反变换,如:
i=imread('e:
\');
j=fft2(i);
k=ifft2(j);
3fftshift
用于将变换后图像频谱中心从矩阵的原点移动到矩阵的中心
B=fftshift(i)
4利用fft2计算二维卷积
利用fft2函数可以计算二维卷积,如:
a=[8,1,6;3,5,7;4,9,2];
b=[1,1,1;1,1,1;1,1,1];
a(8,8)=0;
b(8,8)=0;
c=ifft2(fft2(a).*fft2(b));
c=c(1:
5,1:
5);
利用conv2(二维卷积函数)校验,如:
a=[8,1,6;3,5,7;4,9,2];
b=[1,1,1;1,1,1;1,1,1];
c=conv2(a,b);
四、实验内容
1、对一幅图像进行平移,显示原始图像与处理后图像,分别对其进行傅里叶变换,显示变换后结果,分析原图的傅里叶谱与平移后傅里叶频谱的对应关系。
s=imread('f:
\');%读入原图像
i=rgb2gray(s)
i=double(i)
j=fft2(i);%傅里叶变换
k=fftshift(j);%直流分量移到频谱中心
l=log(abs(k));%对数变换
m=fftshift(j);%直流分量移到频谱中心
RR=real(m);%取傅里叶变换的实部
II=imag(m);%取傅里叶变换的虚部
A=sqrt(RR.^2+II.^2);%计算频谱府幅值
A=(A-min(min(A)))/(max(max(A)))*255;%归一化
b=circshift(s,[800450]);%对图像矩阵im中的数据进行移位操作
b=rgb2gray(b)
b=double(b)
c=fft2(b);%傅里叶变换
e=fftshift(c);%直流分量移到频谱中心
l=log(abs(e));%对数变换
f=fftshift(c);%直流分量移到频谱中心
WW=real(f);%取傅里叶变换的实部B
ZZ=imag(f);%取傅里叶变换的虚部
B=sqrt(WW.^2+ZZ.^2);%计算频谱府幅值
B=(B-min(min(B)))/(max(max(B)))*255;%归一化
subplot(2,2,1);imshow(s);title('原图像')
subplot(2,2,2);imshow(uint8(b));;title('平移图像')
subplot(2,2,3);imshow(A);title('离散傅里叶频谱');
subplot(2,2,4);imshow(B);title('平移图像离散傅里叶频谱')
2、对一幅图像进行旋转,显示原始图像与处理后图像,分别对其进行傅里叶变换,显示变换后结果,分析原图的傅里叶谱与旋转后傅里叶频谱的对应关系。
s=imread('f:
\');%读入原图像
i=rgb2gray(s)
i=double(i)
j=fft2(i);%傅里叶变换
k=fftshift(j);%直流分量移到频谱中心
l=log(abs(k));%对数变换
m=fftshift(j);%直流分量移到频谱中心
RR=real(m);%取傅里叶变换的实部
II=imag(m);%取傅里叶变换的虚部
A=sqrt(RR.^2+II.^2);%计算频谱府幅值
A=(A-min(min(A)))/(max(max(A)))*255;%归一化
b=imrotate(s,-90);%对图像矩阵im中的数据进行移位操作
b=rgb2gray(b)
b=double(b)
c=fft2(b);%傅里叶变换
e=fftshift(c);%直流分量移到频谱中心
l=log(abs(e));%对数变换
f=fftshift(c);%直流分量移到频谱中心
WW=real(f);%取傅里叶变换的实部B
ZZ=imag(f);%取傅里叶变换的虚部
B=sqrt(WW.^2+ZZ.^2);%计算频谱府幅值
B=(B-min(min(B)))/(max(max(B)))*255;%归一化
subplot(2,2,1);imshow(s);title('原图像')
subplot(2,2,2);imshow(uint8(b));;title('平移图像')
subplot(2,2,3);imshow(A);title('离散傅里叶频谱');
subplot(2,2,4);ims