【问题标题】:Why isn't this inverse Fourier transform giving the correct results?为什么这个傅里叶逆变换没有给出正确的结果?
【发布时间】:2010-09-16 17:40:38
【问题描述】:

我想在 MATLAB 中反转图像的傅里叶变换,但结果不是原始图像(应该是)。显然有一些我不知道导致问题的实现细节。代码如下:

img = imread('img.jpg');
fft = fft2(img);
inv = ifft2(fft);
imshow(inv);

【问题讨论】:

    标签: matlab image-processing fft


    【解决方案1】:

    由于fft2ifft2 都以doublesingle 精度执行计算,因此您的image data(可能是uint8 类型)在处理之前首先转换为double 类型通过fft2。因此,您必须使用函数 uint8 将输出图像 inv 转换回无符号 8 位整数以恢复原始图像:

    >> img = imread('peppers.png');  % Load a sample image
    >> fft = fft2(img);   % Get the Fourier transform
    >> inv = ifft2(fft);  % Get the inverse Fourier transform
    >> inv = uint8(inv);  % Convert to uint8
    >> imshow(inv);       % Show the image
    >> isequal(img, inv)  % Test if inv matches the original image img
    
    ans =
    
         1                % It does!
    

    注意:作为附加提示,我会避免将变量命名为 fftinv,因为具有这些名称的函数已经存在于 MATLAB 中。

    【讨论】:

      【解决方案2】:

      此外,如果您尝试对彩色(24 位)图像进行 FFT - 请注意 imread() 将返回 M x N x 3 数组。所以应该对每个 R/G/B 通道分别进行 FFT。

      See this 了解详情。

      【讨论】:

      • 实际上,FFT2 似乎为您处理了这个问题。如果您在命令行窗口中键入type fft2,您可以看到一个 3-D 输入 x 导致操作 fft(fft(x,[],2),[],1),它在第二维和第一维上执行 FFT,而二维输入 @987654326 @(如果您分别传递每个颜色平面)会导致调用 FFTN。比较每种方法,结果之间的最大绝对像素差异约为 5.6e-10,可能是由于操作顺序的差异。简而言之,两者几乎是等价的。
      猜你喜欢
      • 2014-06-10
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2019-10-22
      相关资源
      最近更新 更多