分享

二维傅里叶变换和滤波(Two

 imelee 2017-10-18
function imt = fftcenter(ima) % 图像中心化转换函数
[xs,ys] = size(ima);
for i = 1:xs
for j = 1:ys
imt(i,j) = ima(i,j)*power((-1),(i+j)) ;%输入图像每个像素点乘以(-1)^x+y因子
end
end
return

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 2-D FFT 程序包
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function proj04();
ima = imread('Fig4.41(a).jpg');
imshow(ima);
title('原始图像');
ima_f = fft2(ima); % 对图像ima求二维快速傅里叶变换
mod_ima = abs(ima_f) % 要求幅度谱,需对傅里叶变换求模
mod_ima_log = uint8(log2((mod_ima))) % 要求幅度谱需对FFT后得到的模取对数
phase_ima = atan2(imag(ima_f),real(ima_f)); % 求相位谱,arctan必须使用一个四象限反正切来计算,调用MATLAB的atan2函数
figure,subplot(1,2,1),imshow(mod_ima_log,[]); % []的作用是将mod_ima_log的最大最小值分别作为纯白255和纯黑0,中间值映射到0到255之间
title('输入图像的二维傅里叶幅度谱');
subplot(1,2,2),imshow(phase_ima,[]);
title('输入图像的二维傅里叶相位谱');

threeD_mod_ima_log = log2(mod_ima)+1;
[x1,y1] = size(threeD_mod_ima_log);
[a1,b1]=meshgrid(1:x1,1:y1); % 使用函数mesh绘制三维傅立叶图需要先进行meshgrid
figure,subplot(1,2,1),mesh(a1,b1,threeD_mod_ima_log);
shading interp; % 在网格片内采用颜色插值处理,使得三维表面图显得光滑
title('输入图像的三维傅里叶幅度谱');

[x2,y2] = size(phase_ima);
[a2,b2] = meshgrid(1:x2,1:y2); % 使用函数mesh绘制三维傅立叶图需要先进行meshgrid
subplot(1,2,2),mesh(a2,b2,phase_ima);
shading interp;
title('输入图像的三维傅里叶相位谱');
%
s = fftshift(ima_f); % 调用fftcenter函数实现图像的中心化变换(为了对比fftcenter)
mod_s = abs(s) % 要求幅度谱,需对傅里叶变换求模
mod_s_log = uint8(log2(mod_s)) % 要求幅度谱需对FFT后得到的模取对数
phase_s = atan2(imag(s),real(s)); % 求相位谱,arctan必须使用一个四象限反正切来计算,调用MATLAB的atan2函数
figure,imshow(mod_s_log,[]); % []的作用是将mod_ima_log的最大最小值分别作为纯白255和纯黑0,中间值映射到0到255之间
title('fftshift函数的中心变换图的二维傅里叶幅度谱');

imt = fftcenter(ima); % 调用自编函数对图像进行中心化变换
imt_f = fft2(imt); % 对中心化变换后的图像求二维傅里叶变换
figure,imshow(imt_f,[]);
title('使用自编函数fftcenter()中心变换图的二维傅里叶图谱');

mod_imt = abs(imt_f); % 要求幅度谱,需对傅里叶变换求模
mod_imt_log = uint8(log2(mod_imt)); % 要求幅度谱需对FFT后得到的模取对数
phase_imt = atan2(imag(imt_f),real(imt_f)); % 求相位谱,arctan必须使用一个四象限反正切来计算,调用MATLAB的atan2函数
figure,subplot(1,2,1),imshow(mod_imt_log,[ ]);
title('中心变换图的二维傅里叶幅度谱');
subplot(1,2,2),imshow(phase_imt,[]),
title('中心变换图的二维傅里叶相位谱');
%
threeD_mod_imt_log = log10(mod_imt)+1;
[x3,y3] = size(threeD_mod_imt_log);
[a3,b3]=meshgrid(1:x3,1:y3); % 使用函数mesh绘制三维傅立叶图需要先进行meshgrid
figure,subplot(1,2,1),mesh(a3,b3,threeD_mod_imt_log);
shading interp;
%figure,plot3((1:x),(1:y),ak); shading interp;
title('中心变换图的三维傅里叶幅度谱');

[x4,y4] = size(phase_imt);
[a4,b4] = meshgrid(1:x4,1:y4); % 使用函数mesh绘制三维傅立叶图需要先进行meshgrid
subplot(1,2,2),mesh(a4,b4,phase_imt);
shading interp;
title('中心变换图的三维傅里叶相位谱');
%
imt_if = ifft2(imt_f);
imt_if_abs = abs(imt_if);
figure,subplot(1,2,1),imshow(imt_if_abs,[]);
title('中心化变化图像');
ima = imread('Fig4.41(a).jpg');
subplot(1,2,2),imshow(ima);
title('原始图像');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 设计一个高斯滤波器
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function im=Lowpassfiltering()
st = imread('Fig4.41(a).jpg');
[M,N] = size(st);
D0 = 20; % 设定截止频率D0
x = 2*M;
y = 2*N;
% 进行高斯滤波之前先对图像进行填充,填充后的图像尺寸为(2M*2N)
for i=1:x
for j=1:y
if((i<=M)&&(j<=N))
st(i,j)=st(i,j);
else
st(i,j)=0;
end
end
end
figure,imshow(st);
title('对输入图像进行填充');
imwrite(st,'K1.jpg');

figure(2);
st = fftshift(fft2(st)); % 自编函数中心化效果有问题,因此调用fftshift函数实现中心化
for i = 1:x
for j = 1:y
D(i,j) = sqrt((i-M)^2+(j-N)^2); % 中心点为(M,N)
h(i,j) = 1*exp(-1/2*(D(i,j)^2/D0^2)); % 系统函数H(u,v)
st(i,j) = h(i,j)*st(i,j); % 滤波过程
end
end
st = fftshift(ifft2(st)); % 进行傅里叶反变换时再进行一次中心化
st_abs = abs(st);

for i=1:M
for j=1:N
st_k(i,j)=st_abs(i,j); % 对图像进行裁剪,去除填充部分
end
end
imshow(st_k,[])
title('GLPF滤波后的输出图像(已裁剪)');

st_k1 = imread('Fig4.41(a).jpg');

for i=1:M
for j=1:N
st_k2(i,j) = st_k1(i,j) - ( st_k(i,j)); % 原始图像减去GLPF图像,得到锐化图像
end
end

figure,imshow(st_k2,[])
title('原始图像减去GLPF滤波图像后的锐化图像');

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多