Matlab:二维离散傅里叶变换和逆变换

标签 matlab fft fourier-descriptors

我正在尝试在 matlab 中运行一个程序来获取灰度图像的直接和逆 DFT,但应用逆后无法恢复原始图像。我得到复数作为我的逆输出。就像我正在丢失信息一样。对此有什么想法吗?这是我的代码:

%2D discrete Fourier transform
%Image Dimension

M=3;
N=3;
f=zeros(M,N);
f(2,1:3)=1;
f(3,1:3)=0.5;
f(1,2)=0.5;
f(3,2)=1;
f(2,2)=0;

figure;imshow(f,[0 1],'InitialMagnification','fit')


%Direct transform


for u=0:1:M-1
   for v=0:1:N-1
       for x=1:1:M
           for y=1:1:N

             F(u+1,v+1)=f(x,y)*exp(-2*pi*(1i)*((u*(x-1)/M)+(v*(y-1)/N)));


            end
        end
    end
end


Fab=abs(F);

figure;imshow(Fab,[0 1],'InitialMagnification','fit')



%Inverse Transform

for x=0:1:M-1
    for y=0:1:N-1
       for u=1:1:M
            for v=1:1:N

                z(x+1,y+1)=(1/M*N)*F(u,v)*exp(2*pi*(1i)*(((u-1)*x/M)+((v-1)*y/N)));


            end
        end
    end
end

figure;imshow(real(z),[0 1],'InitialMagnification','fit')

最佳答案

您的代码存在几个问题:

  1. 您没有正确应用 DFT(或 IDFT)的定义:您需要对原始变量进行求和以获得变换。参见公式here ;注意总和。

  2. 在 IDFT 中,归一化常数应为 1/(M*N)(而不是 1/M*N)。

    <

还请注意,通过矢量化可以使代码更加紧凑,从而避免循环;或者只是使用 fft2ifft2功能。我假设您想手动计算它并“低级”来验证结果。

经过两次更正的代码如下。修改已标有注释。

M=3;
N=3;
f=zeros(M,N);
f(2,1:3)=1;
f(3,1:3)=0.5;
f(1,2)=0.5;
f(3,2)=1;
f(2,2)=0;

figure;imshow(f,[0 1],'InitialMagnification','fit')

%Direct transform

F = zeros(M,N); % initiallize to 0
for u=0:1:M-1
   for v=0:1:N-1
       for x=1:1:M
           for y=1:1:N
               F(u+1,v+1) = F(u+1,v+1) + ...
                   f(x,y)*exp(-2*pi*(1i)*((u*(x-1)/M)+(v*(y-1)/N))); % add term
            end
        end
    end
end

Fab=abs(F);
figure;imshow(Fab,[0 1],'InitialMagnification','fit')

%Inverse Transform

z = zeros(M,N);
for x=0:1:M-1
    for y=0:1:N-1
       for u=1:1:M
            for v=1:1:N
                z(x+1,y+1) = z(x+1,y+1) + (1/(M*N)) * ... % corrected scale factor
                    F(u,v)*exp(2*pi*(1i)*(((u-1)*x/M)+((v-1)*y/N))); % add term
            end
        end
    end
end

figure;imshow(real(z),[0 1],'InitialMagnification','fit')

现在原始图像和恢复图像仅相差非常小的值,大约为 eps ,由于通常的浮点不准确:

>> f-z
ans =
   1.0e-15 *
  Columns 1 through 2
  0.180411241501588 + 0.666133814775094i -0.111022302462516 - 0.027755575615629i
  0.000000000000000 + 0.027755575615629i  0.277555756156289 + 0.212603775716506i
  0.000000000000000 - 0.194289029309402i  0.000000000000000 + 0.027755575615629i
  Column 3
 -0.194289029309402 - 0.027755575615629i
 -0.222044604925031 - 0.055511151231258i
  0.111022302462516 - 0.111022302462516i  

关于Matlab:二维离散傅里叶变换和逆变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442918/

相关文章:

matlab - 避免在 Matlab 中保存图形

image - 对图像进行机器学习时减少特征数量的方法

java - 如何从 fft 结果中获取频率?

filtering - DSP - 通过 FFT 在频域中进行滤波

algorithm - 如何归一化椭圆傅里叶系数?

MATLAB:使用列表访问多维数组的元素

MATLAB - 绘制奈奎斯特图的一半

matlab - 如何在音频信号处理中创建汉明窗口

r - 解释每周和每年季节性的先知输出