Matlab fft2 异常(错误或愚蠢的用户错误?)

Matlab fft2 anomaly (bug or stupid user error?)

为了在 Matlab 中复制光学傅立叶变换,我做了以下操作:

我将这张 512x512 图像加载为 "dot512r":

然后做了:


     >> 谁是 dot512r
     名称大小字节 Class 属性

     dot512r 512x512x3 786432 uint8

     >> bwimg=rgb2gray(dot512r);
     >> 谁是 bwimg

      名称大小字节 Class 属性

      bwimg 512x512 262144 uint8

     >> ftimg=fft2(bwimg);
     >> 图
     >> imshow(日志(fftshift(ftimg))/10.0);

生成此图像的结果(到目前为止一切正常):

然后我做了逆fft并显示如下:


    >> iftimg=ifft2(ftimg);
    >> imshow(iftimg);

这导致了下图,其中我用红色箭头标记了异常。白条左上角和左下角的两个小像素"errors"我可以接受,但是图像左上角的大异常让我很困惑。同样的异常出现在我用 512x512 图像做的其他几个形状中。

我不明白我做错了什么。

好的,我相信我知道发生了什么。

我开始怀疑是不是JPEG压缩神器。 Jpeg 的 8x8 像素单元格的频率为 512/8 或 64。这大致就是异常出现的地方。

最初我在 Photoshop 中创建图像,然后使用 "save for web" 选项并将质量设置为 100%,所以我认为不会有 JPEG 压缩噪声。我没有注意到标有 "Optimized" 的小复选框,它已被选中。

我从头开始重新创建图像并确保所有内容都是纯黑白的并在未选中 "Optimized" 框的情况下保存它。

当我在新图像上重新运行正向和反向 fft2 时,大的异常消失了。只有角落里的小东西存在,这些可能是精度损失造成的。这是新的输出:

>>imshow(ifft2(fft2(rgb2gray(dot512f))));

尝试将 ifft 的输出除以 255,您将不再看到异常。

您输入的是uint8,默认显示为0=黑色,255=白色。

您的输出是双倍的,默认显示为 0 = 黑色,1 = 白色。

即大于1的都显示为纯白色。输入中您看不到的值 1 在输出中变为白色。

原则上,ifft(fft(x))-x在数值精度以内。但前提是 x 是双打。