资源描述
数字图像处理实验报告
姓名:杨彪
学号:20111003311
指导老师:傅华明
实验地点:信息楼
实验一
实验内容
图像旋转,尺寸不变
图像旋转,尺寸变换
解:图像的旋转要用到旋转因子,对尺寸不变而言,只需将旋转之后不在原图像范围内的部分截掉。对于尺寸变换,则需先用旋转因子算出旋转之后的各点坐标,再算出能将旋转之后的图像完全包围进去的新的图像的尺寸,然后把旋转后的图像放进去。
①、程序代码
图像旋转,尺寸不变
img=imread(C:\Documents and Settings\账户2\桌面\赵琛\数字图像处理\DIP-11级上机1-空域增强\p08.TIF');
subplot(1,3,1),imshow(img), title('原始图像');
[M,N]=size(img);
g=zeros(M,N);
img=double(img);
g=double(g);
a=3.14*15/180;
for i=1:M,
for j=1:N,
m=round(i*cos(a)+j*sin(a));
n=round(-i*sin(a)+j*cos(a));
if m>0.5&&m<256&&n>0.5&&n<256
g(i,j)=img(m,n);
else g(i,j)=250;
end
end
end
g=uint8(g);
subplot(1,3,2),imshow(g), title('尺寸不变');
图像旋转,尺度变换
im1=imread('C:\Documents and Settings\账户2\桌面\赵琛\数字图像处理\DIP-11级上机1- 空域增强\p08.tif');
angle=30;
pai=3.14;
subplot(121);
imshow(im1);
title('原始图像');
roteang=angle/180*pi;
[im1X,im1Y]=size(im1);
%计算旋转矩阵
rotmatrix=[cos(roteang),-sin(roteang);sin(roteang),cos(roteang)];
%计算反旋转矩阵
rrotmatrix=[cos(-roteang),-sin(-roteang);sin(-roteang),cos(-roteang)];
%计算新图像大小,以及新图像的1,1精确定位点
im2XY1=[im1X,im1Y]*rotmatrix;
im2XY2=[im1X,1]*rotmatrix;
im2XY3=[1,1]*rotmatrix;
im2XY4=[1,im1Y]*rotmatrix;
im2p11=[min([im2XY1(1),im2XY2(1),im2XY3(1),im2XY4(1)]),min([im2XY1(2),im2XY2(2),im2XY3(2),im2XY4(2)])];
im2X=round(max([im2XY1(1),im2XY2(1),im2XY3(1),im2XY4(1)])-im2p11(1));
im2Y=round(max([im2XY1(2),im2XY2(2),im2XY3(2),im2XY4(2)])-im2p11(2));
%建立新图像
im2=uint8(zeros(im2X,im2Y)+255);
%对于每个像素点,进行上文所述的计算。
for i=1:im2X
for j=1:im2Y
pij=round([i+im2p11(1)-1,j+im2p11(2)-1]*rrotmatrix);
if (pij(1)>=1)&&(pij(2)>=1)&&(pij(1)<=im1X)&&(pij(2)<=im1Y)
im2(i,j)=im1(pij(1),pij(2));
end
end
end;
%绘制新图
subplot(122);
imshow(im2);
title('尺寸变换');
②、程序运行结果及对比分析
1.
2.
分析:在旋转的图像操作中,主要要理解旋转因子的具体意义,得到旋转后图像的尺寸后,要用逆旋转因子,因为原图像经过运算后并没有发生旋转,只是通过运算过程求出来旋转后的尺寸,这是要理解的地方。
实验二
实验内容
设计图象f5(x,y)为3*30*30/256*256,垂直排列;
解:设计一个零矩阵,将其中取三个小矩阵让它的像素值为1,即满足题目要求。再通过函数调用,绘制图像的频域图
①、程序代码
f=zeros(256,256);
f([30:60],[113:143])=1;
f([90:120],[113:143])=1;
f([150:180],[113:143])=1;
subplot(221);imshow(f);
F=fft2(f);
subplot(223);mesh(fftshift(abs(F)));
subplot(222);imshow(fftshift(log(abs(F))));
②、程序运行结果及对比分析
分析:通过图像的频域图可以看出,三个小正方形的频域图中低频部分比一个的多(此处未附上一个的频域图),低频部分为原图像中的黑白交接处。符合由题目直接得出的结论。
实验三
实验内容
频域平移性
自行设计f3(x,y),求得F3(u,v),将F3(u,v)右移后反变换求f 2(x,y);将F3(u,v)下移后反变换,求f 1(x,y);证明f1(x,y)、f 2(x,y)、f 3(x,y)的绝对值相等。
对图象p07实施对数变换(公式4.1.7)
解:设计一个图像f3,将其进行傅里叶变换之后得到其频域图,将频域图分别向右和向下移动128个单位,移出部分补到空白处,再用逆变换求得f2和f3,f1,f2,f3分别求其像素和,通过所得值判断是否相等。
①、程序代码
f3=zeros(256,256);
f3(41:71,113:143)=1;
f3(112:142,113:143)=1;
f3(183:213,113:143)=1;
F3=fft2(f3);
f3=ifft2(F3);
subplot(321);
imshow(f3);title('图像f3');
subplot(322);
imshow(F3);title('f3的傅立叶变换F3');
[M,N]=size(F3);
F2=zeros(M,N);
P=fix(M/2);
Q=fix(N/2);
F2(:,Q+1:N)=F3(:,1:Q);
F2(:,1:Q)=F3(:,Q+1:N);
f2=ifft2(F2);
subplot(323);
imshow(f2);title('图像f2');
subplot(324);
imshow(F2);title('F3右移图F2');
F1(Q+1:N,:)=F3(1:Q,:);
F1(1:Q,:)=F3(Q+1:N,:);
f1=ifft2(F1);
subplot(325);
imshow(f1);title('图像f1');
subplot(326);
imshow(F1);title('F3上移图F1');
g1=sum(sum(abs(f1)))
g2=sum(sum(abs(f2)))
g3=sum(sum(abs(f3)))
g4=sum(sum(abs(F1)))
g5=sum(sum(abs(F2)))
g6=sum(sum(abs(F3)))
②、程序运行结果及对比分析
实验四
实验内容
自行设计f(x,y),(1)调用Matlab函数直接调用实现其离散傅立叶变换、离散余弦变换;(2)自行编程对f(x,y)实施Walsh变换和Hadamard变换,比较四种变换所得到的频谱。
解:写出子程序Walsh变换和Hadamard变换,子程序中为了方便起见,均将二维变换分为两个一维变换,用for循环和bitget函数实现题目要求。
①、程序代码
img=zeros(256,256);
img(1:10,1:10)=1;
img(246:256,246:256)=1;
img_temp=double(img);
[M N]=size(img_temp);
img_fft=fftshift(log(1+abs(fft2(img))));
img_dct=log(abs(dct2(img)));
img_walsh=(walsh(N)*img_temp*walsh(M));
img_hadamard=(hadamard(N)*img_temp*hadamard(M));
imshow(img);
title('原图像');
subplot(2,2,1);
imshow(img_fft,[]);
title('傅里叶');
subplot(2,2,2);
imshow(img_dct);
title('余弦');
subplot(2,2,3);
imshow(img_walsh,[]);
title('walsh');
subplot(2,2,4);
imshow(img_hadamard,[]);
title('hadamard ');
其中调用的walsh函数代码详列如下:
function g=walsh(N)
n=log2(N);
for x=0:N-1
for u=0:N-1
temp=1;
for i=0:n-1
temp=temp*((-1)^(bitget(x,i+1)*bitget(u,n-i)));
end
g(x+1,u+1)=temp/N;
end
end
其中调用的hadamard函数代码详列如下:
function g=hadamard(N)
n=log2(N);
for x=0:N-1
for u=0:N-1
temp=0;
for i=0:n-1
temp=temp+bitget(x,i+1)*bitget(u,i+1);
end
temp=(-1)^temp;
g(x+1,u+1)=temp/N;
end
end
②、程序运行结果及对比分析
分析:由实验结果可知,经过余弦变换后的图像的能量都集中在左上方(看的 不太清晰)。Walsh变换和hadamard变换都可用于图像压缩,但两者运 算后的结果不同。
实验五
实验内容
根据窗函数法设计一个低通滤波器,对两图象(f1(x,y)为90*30/256*256的图象;f2(x,y) 30*90/256*256图象)进行低通滤波,观察分析滤波前后空域图象和频谱分布的变化。
解:先设定低通滤波器的截止频率,对图像进行预处理(先进行傅里叶变换,再将低频部分移到图像中央),然后计算各点到中心点的距离,距离越远,频率越高。将频率低于设定频率的部分保留。
①、程序代码
f=zeros(256,256);
f(80:173,113:143)=1;
B=double(f);
g=fft2(f);
g=fftshift(g);
subplot(2,2,1),imshow(f);title('f');
subplot(2,2,2),imshow(log(abs(g)),[-1 5]);title('傅里叶变换');
[M,N]=size(g);
D0=100; %截止频率
m=fix(M/2);
n=fix(N/2);
for i=1:M
for j=1:N
D=sqrt((i-m)^2+(j-n)^2);
if(D<=D0)
h=1;
else h=0;
end
I(i,j)=h*g(i,j);
end
end
subplot(2,2,3),imshow(I);title('理想低通滤波器');
J1=ifft2(I);
J1=ifftshift(J1);
J2=uint8(real(J1));
subplot(2,2,4),imshow(J1); title('复原图');
f=zeros(256,256);
f(113:143,80:173)=1;
B=double(f);
g=fft2(f);
g=fftshift(g);
subplot(2,2,1),imshow(f);title('f');
subplot(2,2,2),imshow(log(abs(g)),[-1 5]);title('傅里叶变换');
[M,N]=size(g);
D0=100; %截止频率
m=fix(M/2);
n=fix(N/2);
for i=1:M
for j=1:N
D=sqrt((i-m)^2+(j-n)^2);
if(D<=D0)
h=1;
else h=0;
end
I(i,j)=h*g(i,j);
end
end
subplot(2,2,3),imshow(I);title('理想低通滤波器');
J1=ifft2(I);
J1=ifftshift(J1);
J2=uint8(real(J1));
subplot(2,2,4),imshow(J1); title('复原图');
②、程序运行结果及对比分析
分析:进行低通滤波之后,低频部分被保留。由于理想滤波器没有过渡的区域,因此在处理之后图像会变得模糊。同时可以看到,两幅图像的傅里叶变换是一样的,进过理想低通滤波器后的图像以及复原图也是一样的(方向有所不同)。
展开阅读全文