在尝试在Matlab中复制光学傅立叶变换时,我做了以下几点:
我将这张512x512图片加载为“dot512r”:
然后做了:
>> 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);
然后我做了反向fft并显示如下:
>> iftimg=ifft2(ftimg); >> imshow(iftimg);
这导致了下面的图像,其中我用红色箭头标记了异常。我可以接受白条左上角和左下角的两个小像素“错误”,但是图像左上角的大异常让我感到困惑。同样的异常出现在我使用512x512图像的其他几种形状中。
我不知道我做错了什么。
答案 0 :(得分:0)
好的,我相信我弄清楚发生了什么。
我开始怀疑它是否是JPEG压缩工件。 Jpeg的8x8像素单元的频率为512/8或64.这大致是异常出现的地方。
最初我在Photoshop中创建了图像,然后使用质量设置为100%的“save for web”选项,所以我认为没有JPEG压缩噪音。我没有注意到标有“优化”的小复选框,并且已经过检查。
我从头开始重新创建图像并确保一切都是纯黑色和&白色并保存,未检查“优化”框。
当我重新拍摄新图像上的前向和反向fft2时,大的异常消失了。只存在拐角处的小孩,这些可能来自精确损失。这是新的输出:
>>imshow(ifft2(fft2(rgb2gray(dot512f))));
答案 1 :(得分:0)
尝试将ifft
的输出除以255,您将不会再看到异常。
您输入的是uint8,默认显示为0 =黑色,255 =白色。
您的输出是双倍的,默认显示为0 =黑色,1 =白色。
也就是说,1以上的所有内容都显示为纯白色。输入中的值1(您无法看到)在输出中变为白色。
原则上,ifft(fft(x))-x
在数值精度范围内。但是,只有当x开始时才是双倍的。