函数
1.二维离散傅里叶变换的实现:F=fft2(f)
填充时:F=fft2(f,P,Q)
傅里叶谱|F|:S=abs(F)
例子1:
>> f=imread('Fig0303(a).tif');
>> F=fft2(f);
>> S=abs(F);
>> imshow(f) , title('原图');
>>figure, imshow(S,[]), title('频谱图');
>> S2=log(1+abs(Fc));
>> imshow(S2,[]),title('对数变换后的频谱图')
MATLAB中,频率中心坐标 : (floor(M/2)+1,floor(N/2)+1)
2.把原点移动到频率矩阵的中心:Fc=fftshift(F)
例子2:接着例子1
>> Fc=fftshift(F);
>> imshow(abs(Fc),[])
3.ifftshift函数将居中结果反转
>> F=ifftshift(Fc)
4.实现傅里叶反变换:f=ifft2(F)
注 fft2(f)直接把图f无缩放变换成double型.再ifft2变回f时是数值与原f一样类型是double的结果,这样有可能由于截断造成问题,故先把f用tofloat转成single型,再fft2,ifft2,再转换成原f的类型.避开类型造成的截断问题.
理论上ifft2后应该是实数,但是由于计算误差,会带有虚部,故提取反变换的实数部分即可.f=real(ifft2(F));
5.Paddedsize函数:填充函数
例子3:有和没有填充的滤波效果
无填充
f=imread('Fig0305(a).tif');
[M,N]=size(f);
[f,revertclass]=tofloat(f);
F=fft2(f);
sig=10;
H=lpfilter('gaussian',M,N,sig);
G=H.*F;
g=ifft2(G);
g=revertclass(g);
figure,imshow(f);figure,imshow(g);
有填充:
f=imread('Fig0305(a).tif');
[f,revertclass]=tofloat(f);
PQ=paddedsize(size(f)); %计算填充的大小
Fp=fft2(f,PQ(1),PQ(2));
sig=10;
Hp=lpfilter('gaussian',PQ(1),PQ(2),2*sig);
Gp=Hp.*Fp;
gp=ifft2(Gp);
gpc=gp(1:size(f,1),1:size(f,2));
gpc=revertclass(gpc);
imshow(gp)figure,imshow(gpc)
6.DFT滤波的基本步骤
1.转换图像为浮点图像 tofloat
2.用paddedsize获得填充参数
3.得到有填充参数的傅里叶变换
4.用频率域中一大小为的滤波传递函数(非居中格式,若为居中,则先移动ifftshift)
5.用滤波传递函数✖️第3步的傅里叶变换
6.逆傅里叶变换
7.取6结果左上部(大小与原图像未填充前一致)
8. 若有需要,将7的到结果转换成原输入图像的类型
7.dftfilt函数:将DFT滤波的基本步骤封装在这个函数里
function g = dftfilt(f, H, classout)
[f, revertClass] = tofloat(f);
F = fft2(f, size(H, 1), size(H, 2));
g = ifft2(H.*F);
g = g(1:size(f, 1), 1:size(f, 2));
if nargin == 2 || strcmp(classout, 'original')
g = revertClass(g);
elseif strcmp(classout, 'fltpoint') % g is floating point already.
return
else
error('Undefined class for the output image.')
end
8.dftuv(M,N)函数:创建用于实现频率域滤波器的网格数组
function [U,V]=dftuv(M,N)
u=single(0:(M-1));
v=single(0:(N-1));
idx=find(u>M/2);
u(idx)=u(idx)-M;
idy=find(v>N/2);
v(idy)=v(idy)-N;
[V,U]=meshgrid(v,u);
9.理想低通滤波器
例子:
结果显示:
10、巴特沃斯低通滤波器
例子:
结果显示:
11、高斯低通滤波器
例子:
结果显示:
12、lpfilter函数:生成低通滤波器的传递函数,即封装三种滤波器的代码
pe类型---'ideal' 、'btw' 、'gaussian'
大小----M*N
D0-----截止频率
n------巴特沃斯滤波器所带参数
13、高通(锐化)频率域滤波器
若给定低通滤波器的传递函数为 则相应高通滤波器的传递函数为
function H = hpfilter(type, M, N, D0, n)
%生成高通滤波传递函数H
%type—'ideal', 'btw', 'gaussian'
if nargin == 4
n = 1; % n的默认值.
end
Hlp = lpfilter(type, M, N, D0, n);%低通滤波器
H = 1 - Hlp;
例子:
结果显示:
14、高频强调滤波
例子:
结果显示: