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 是双打。
为了在 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 是双打。