数字图像处理上机报告.docx
《数字图像处理上机报告.docx》由会员分享,可在线阅读,更多相关《数字图像处理上机报告.docx(15页珍藏版)》请在冰豆网上搜索。
数字图像处理上机报告
数字图像处理报告
第二次上机报告
学院:
机电学院
班级:
071113-20
学号:
20111003341
姓名:
曾志鹏
2-1、计算图象的频谱函数
设计图象f4(x,y)为3*30*30/256*256,水平排列;
分析:
首先生成一个256*256的零矩阵,再按要求将其中某些部分赋值为一,即可得到图像。
程序如下:
A=zeros(256);%生成一个256*256的零矩阵
fori=110:
140%设置行
forj=30:
60
forp=100:
130
forq=170:
200%设置列
A(i,j)=1;
A(i,p)=1;
A(i,q)=1;%将对应行列赋值为1,
end
end
end
end
subplot(1,2,1);
imshow(A);%显示得到图像
title('原图像');
A1=fft2(A);%对图像进行傅里叶变换
A2=abs(A1);
subplot(1,2,2);
imshow(fftshift(log(A2)));
title('傅里叶变换后图像');
运行结果如下:
2-2、根据计算证明傅立叶变换的性质
空域平移性:
设f1(x,y)为30*30/256*256,左移得到f2(x,y),求F2(u,v);上移得到f3(x,y),求F3(u,v);证明F1(u,v)、F2(u,v)和F3(u,v)的绝对值相等。
分析:
按照上题方法,设计图像并对图像进行傅里叶变换,再将设计好的图像的行与列的值分别改变,即可得到平移后的图像。
将得到的平移后的图像在进行傅里叶变换,即可得到相应的频谱。
设置变量a,当三个图的频谱相等时,a值为1,否则为0,观察a的值,即可判断呢所得结果。
程序如下:
A=zeros(256);
fori=100:
130
forj=100:
130
A(i,j)=1;
end
end%设置图像A
A1=fft2(A);
A2=abs(A1);
subplot(2,3,1);imshow(A);title('原图像');
subplot(2,3,4);imshow(fftshift(log(A2)));title('傅里叶变换后图像');
B=zeros(256);
fori=100:
130
forj=50:
80
B(i,j)=1;
end
end%设置图像B
B1=fft2(B);
B2=abs(B1);
subplot(2,3,2);imshow(B);title('左移后图像');
subplot(2,3,5);imshow(fftshift(log(B2)));title('左移后傅里叶变换图像');
C=zeros(256);
fori=50:
80
forj=100:
130
C(i,j)=1;
end
end%设置图像C
C1=fft2(C);
C2=abs(C1);
subplot(2,3,3);imshow(C);title('右移后图像');
subplot(2,3,6);imshow(fftshift(log(C2)));title('右移后傅里叶变换图像');
[mn]=size(A2);
fori=1:
m
forj=1:
n
ifA2(i,j)==B2(i,j)&&A2(i,j)==C2(i,j)%判断频率绝对值是否相等
a=1;
elsea=0;
end
end
end
结果如下:
由上图得知a值为1,即表明平移后的图像的频谱的绝对值相等,与题目意思符合。
2-3、图象变换比较
自行设计f(x,y),
(1)调用Matlab函数直接调用实现其离散傅立叶变换、离散余弦变换;
(2)自行编程对f(x,y)实施Walsh变换和Hadamard变换,比较四种变换所得到的频谱。
分析:
设计图像,将图像进行傅里叶变换和离散余弦变换。
将得到的结果显示出来,由沃尔什变换
和哈达玛变换
,编写程序将算法正确的表达出来。
程序如下:
N=16;
n=log2(N);
f=zeros(16);
fori=4:
8
forj=4:
8
f(i,j)=1;
end
end
subplot(2,3,1);
imshow(f);
title('原图像');
f=double(f);
F2=fft2(f);%将图像f进行傅里叶变换
F2=fftshift(F2);%将零频率点移到频谱图中心
F2=log(abs(F2));%采用对数,更好的表示高频
subplot(2,3,2);
imshow(F2);
title('傅里叶变换频谱');
yuxian=dct2(f);%将图像f进行离散余弦变换
yuxian=log(abs(yuxian));
subplot(2,3,3);
imshow(yuxian);
title('离散余弦变换频谱');
foru=0:
N-1
forv=0:
N-1
A=0;
forx=0:
N-1
fory=0:
N-1
zs=0;
fori=0:
n-1
zs=zs+bitget(x,i+1)*bitget(u,n-i)+bitget(y,i+1)*bitget(v,n-i);
end%由于bitget函数没有第0位,因此都应该加1
zs=(-1)^zs;
A=f(x+1,y+1)*zs+A;
end
end
walsh(u+1,v+1)=A/N;
end
end%算法核心部分
subplot(2,3,4);
imshow(walsh);
title('Walsh变换频谱');
foru=0:
N-1
forv=0:
N-1
A=0;
forx=0:
N-1
fory=0:
N-1
zs=0;
fori=0:
n-1
zs=zs+bitget(x,i+1)*bitget(u,i+1)+bitget(y,i+1)*bitget(v,i+1);
end
zs=(-1)^zs;
A=f(x+1,y+1)*zs+A;
end
end
Hadamard(u+1,v+1)=A/N;
end
end%算法核心部分
subplot(2,3,5);
imshow(Hadamard);
title('Hadamard变换频谱');
结果如下:
2-4、图象的频域滤波
根据频率采样法设计一个带阻滤波器,对两图象(f1(x,y)为90*30/256*256的图象;f2(x,y)30*90/256*256图象)进行带阻滤波,观察分析滤波前后空域图象和频谱分布的变化。
分析:
按要求设计图像,将图像进行傅里叶变换,再将得到的频率进过带阻滤波器滤波,将滤波后的结果显示出来,观察并对比滤波前后图像的变化。
程序如下:
f1=zeros(256);
f1([30:
120],[110:
140])=1;%90*30的图像
g1=fft2(f1);
g1=fftshift(g1);%零频率部分移到数组中间
subplot(2,2,1),imshow(f1);
title('f1原图像');
subplot(2,2,2),imshow(log(abs(g1)),[-110]);
title('傅里叶变换');
[M,N]=size(g1);
D0=50;%截止频率
D1=90;
m=fix(M/2);
n=fix(N/2);%中心化频谱图像中心
fori=1:
M
forj=1:
N
D=sqrt((i-m)^2+(j-n)^2);%频谱平面原点到(u,v)点的距离
if(D<=D0)
h=1;%带阻滤波核心部分
elseif(D<=D1&&D>=D0)
h=0;
elseh=1;
end
end
Q(i,j)=h*g1(i,j);
end
end
subplot(2,2,3),imshow(Q);
title('理想带阻滤波器');
Q=ifftshift(Q);
J1=ifft2(Q);
J2=uint8(real(J1));
subplot(2,2,4),imshow(J2);
title('复原图');
结果如下:
对图像f2同理可得程序如下:
f1=zeros(256);
f1([110:
140],[30:
120])=1;%30*90的图像
g1=fft2(f1);
g1=fftshift(g1);%零频率部分移到数组中间
subplot(2,2,1),imshow(f1);
title('f1原图像');
subplot(2,2,2),imshow(log(abs(g1)),[-110]);
title('傅里叶变换');
[M,N]=size(g1);
D0=50;%截止频率
D1=90;
m=fix(M/2);
n=fix(N/2);%中心化频谱图像中心
fori=1:
M
forj=1:
N
D=sqrt((i-m)^2+(j-n)^2);%频谱平面原点到(u,v)点的距离
if(D<=D0)
h=1;%带阻滤波核心部分
elseif(D<=D1&&D>=D0)
h=0;
elseh=1;
end
end
Q(i,j)=h*g1(i,j);
end
end
subplot(2,2,3),imshow(Q);
title('理想带阻滤波器');
Q=ifftshift(Q);
J1=ifft2(Q);
J2=uint8(real(J1));
subplot(2,2,4),imshow(J2);
title('复原图');
结果如下:
1-5几何变换
题目:
图象旋转的计算流程
(1)图象尺寸不变
(2)图象尺寸变化
1.图象尺寸不变程序如下:
A=imread('p08.tif');
A1=imrotate(A,45,'crop');
A2=imrotate(A,90,'crop');
subplot(1,3,1);imshow(A);title('原图像');
subplot(1,3,2);imshow(A1);title('逆时针旋转45度');
subplot(1,3,3);imshow(A2);title('逆时针旋转90度');
分析:
imrotate函数实现图像逆时针旋转,45,90为其旋转的度数。
参数corp使旋转时图像底板大小保持不变,图像大小也保持不变。
所以旋转后,图像的边角部分会被切掉。
如下图所示:
结果如下:
由上图可知,图像A,A1,A2大小一样,即旋转后图像大小未变
2.图象尺寸变化程序如下:
A=imread('p08.tif');
A1=imrotate(A,45);
A2=imrotate(A,135);
subplot(1,3,1);imshow(A);title('原图像');
subplot(1,3,2);imshow(A1);title('旋转45度底板变大');
subplot(1,3,3);imshow(A2);title('旋转135度底板变大');
分析:
当imrotate函数后面不写参数corp,那么旋转后的图像大小不变,而图像的底板会变大,如下图所示。
结果如下:
由上图可知,图像A,与A1,A2大小不一样,即旋转后图像大小该变。
总结:
与第一次相比,这次感觉比之前好很多,虽然比较棘手,但至少对题目方向感,知道如何去编写程序,对软件的使用操作等更加熟悉顺手。
同时也能自己编程而尽量少的调用软件提供的函数。
同时,通过编程,我们对课本知识的了解也更加深刻,学的也更多。