2D离散傅里叶变换及逆变换的matlab实现

积分线性变换可以将信号或图像在更适合的域内表达,并且使得解决相关问题更容易,在图像分析中最常用的积分显示变换是傅里叶变换、离散余弦变换与小波变换。

1d傅里叶变换由傅里叶(Fourier)提出,1d傅里叶变换将函数f(x)变换到频率域F(t)表达。F称作频谱,可以显示不同频率的相对成分。用i(根号下-1)表示虚数单位,1d连续傅里叶变换表达为:

逆变换为

相应地,对于下标从0开始的离散变量f(x),1d离散傅里叶变换和逆变换分别为:

2D离散傅里叶变换及逆变换的matlab实现_第1张图片

离散傅里叶变换(DFT)的时间复杂度为O(n2),使用快速傅里叶变换(FFT)会降低为 O(nlogn)

从1d傅里叶变换可容易推广到2d,对于连续空间f,2d连续傅里叶变换和逆变换如下:

2D离散傅里叶变换及逆变换的matlab实现_第2张图片

(x,y)表示图像坐标,(i,j)表示空间频率。

离散傅里叶变换和逆变换如下:

2D离散傅里叶变换及逆变换的matlab实现_第3张图片

在matlab中,可使用fft2进行2d快速变换(1d使用fft),如果用基本公式实现,复杂度为O(n4)。为了验证效果一下裁剪了局部:

I=imread('lena.jpg');
I=I(1:50,1:50);
[m,n]=size(I);
F=zeros(m,n);
%% FT
for u=1:m
    for v=1:n
        for x=1:m
            for y=1:n
                F(u,v)=F(u,v)+double(I(x,y))*exp(-2*pi*i*(u*x/m+v*y/n));
            end
        end
    end
end
I2=zeros(m,n);
for x=1:m
    for y=1:n
        for u=1:m
            for v=1:n
                I2(x,y)=I2(x,y)+double(F(u,v))*exp(2*pi*i*(u*x/m+v*y/n))/(m*n);
            end
        end
    end
end
I2=uint8(I2);
subplot(121),imshow(I);
subplot(122),imshow(I2);
F2=fft2(I);%直接调用
figure,
F=abs(F);
F2=abs(F2);
subplot(121),imshow(F,[]);
subplot(122),imshow(F2,[]);
F=fftshift(F);
F2=fftshift(F2);
F=log(F+1);
F2=log(F2+1);
figure,
subplot(221),imshow(F,[]);
subplot(222),imshow(F2,[]);
subplot(223),mesh(F);
subplot(224),mesh(F2);

其中,I为原图像,F为I的频谱,F2为直接fft2的频率,I2为F的逆变换结果(也可通过ifft2得到),i为系统默认设置的常数跟下-1。直接运算或fft得到的F(如figure2)的频率高点都分布在四个角,直接使用fftshift可以把四个角的高频信息移动到最中间(imshow(I,[])在显示图像时会自动调整归一化,让图像正确显示,或者手动归一化实现后inshow(I))。之后abs将负实数和虚数部分调整为正实数,由于高频低频差距过大,所以用log(F+1)缓和高低。运行结果分别如下:

2D离散傅里叶变换及逆变换的matlab实现_第4张图片

2D离散傅里叶变换及逆变换的matlab实现_第5张图片

2D离散傅里叶变换及逆变换的matlab实现_第6张图片

 figure1为裁剪后的图像与进行变换和逆变换后的图像,figure2为通过代码实现和直接调用库得到的未调整前的频谱(左图和右图角度不同,但内容一样),figure3为调整后的频谱以及他们的mesh面。

将图像由空间域转为频率域在图像压缩以及去噪等方面有很好的应用。

之后文章:DCT WT

 

你可能感兴趣的:(计算机视觉与图像处理)