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

时间:2017-12-22 19:48:33

标签: matlab fft ifft

在尝试在Matlab中复制光学傅立叶变换时,我做了以下几点:

我将这张512x512图片加载为“dot512r”:

enter image description here

然后做了:


     >> whos dot512r
     Name           Size                Bytes  Class    Attributes

     dot512r      512x512x3            786432  uint8              

     >> bwimg=rgb2gray(dot512r);
     >> whos bwimg

      Name         Size              Bytes  Class    Attributes

      bwimg      512x512            262144  uint8              

     >> ftimg=fft2(bwimg);
     >> figure
     >> imshow(log(fftshift(ftimg))/10.0);

这导致了这张图片(到目前为止一切都很好): enter image description here

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


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

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

我不知道我做错了什么。

enter image description here

2 个答案:

答案 0 :(得分:0)

好的,我相信我弄清楚发生了什么。

我开始怀疑它是否是JPEG压缩工件。 Jpeg的8x8像素单元的频率为512/8或64.这大致是异常出现的地方。

最初我在Photoshop中创建了图像,然后使用质量设置为100%的“save for web”选项,所以我认为没有JPEG压缩噪音。我没有注意到标有“优化”的小复选框,并且已经过检查。

我从头开始重新创建图像并确保一切都是纯黑色和&白色并保存,未检查“优化”框。

当我重新拍摄新图像上的前向和反向fft2时,大的异常消失了。只存在拐角处的小孩,这些可能来自精确损失。这是新的输出:

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

enter image description here

答案 1 :(得分:0)

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

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

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

也就是说,1以上的所有内容都显示为纯白色。输入中的值1(您无法看到)在输出中变为白色。

原则上,ifft(fft(x))-x在数值精度范围内。但是,只有当x开始时才是双倍的。