繁体   English   中英

Matlab中的二维离散傅里叶变换和逆DFT

[英]2D Discrete Fourier Transform and Inverse DFT in matlab

我目前在不使用内置库的情况下在matlab中实现图像的2D DFT和IDFT。 我在DFT之后成功输出了光谱图像,但在IDFT之后却无法恢复原始图像。 这是我的DFT代码

input = im2double(img_input);
[M, N] = size(input);
Wm = zeros(M, M);
Wn = zeros(N, N);

for x = 1:M-1
    for y = 1:N-1
        input(x, y) = input(x, y) * (-1)^(x + y);
    end
end

for u = 0:M-1
    for x = 0:M-1
        Wm(u+1, x+1) = exp(-li * pi * 2 * u * x/ M);
    end    
end

for v = 0:N-1
    for y = 0:N-1
        Wn(v+1, y+1) = exp(-li * pi * 2 * v * y / N);
    end    
end
F = Wm * input * Wn / 200;
output = im2uint8(log(1 + abs(F)));

IDFT:

[M, N] = size(input);
Wm = zeros(M, M);
Wn = zeros(N, N);

for x = 0:M-1
    for u = 0:M-1
        Wm(x+1, u+1) = exp(2 * pi * 1i * u * x/ M);
    end    
end

for y = 0:N-1
    for v = 0:N-1
        Wn(y+1, v+1) = exp(2 * pi * 1i * v * y / N);
    end
end

f = Wm * input * Wn;

for x = 1:M-1
    for y = 1:N-1
        f(x, y) = f(x, y) * (-1)^(x + y);
    end
end

output = im2uint8(abs(f));

我将输入乘以(-1)^(x + y)以便移动坐标原点。 我不知道为什么在DFTed图像上执行IDFT后为什么不能找回原始图像。

原始图片

DFT后的图片

IDFT之后的图片

您的代码工作正常。 为了使第二个函数的output与第一个函数的img_input相同,我必须进行以下更改:

第一个功能:

F = Wm * input * Wn;                % Don't divide by 200 here.
output = im2uint8(log(1 + abs(F))); % Skip this line altogether

第二个功能:确保此处使用第一个功能的F作为input

f = Wm * input * Wn / N / M;        % Divide by N*M, proper normalization

请注意,规范化通常放在IDFT中,但是如果您愿意,也可以将其放在DFT中。 但是用200进行归一化是不正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM