如何从2D FFT计算功率谱

4

在完成实验任务时,我遇到了一个问题,不确定如何实现:

使用fft2对灰度图像进行傅里叶变换,然后计算功率谱。这是我目前的代码:

>> Pc = imread('pckint.jpg');
>> whos Pc;
  Name        Size             Bytes  Class    Attributes

  Pc        256x256            65536  uint8              

>> imshow(Pc);
>> result = fft2(Pc);

我的问题涉及到计算机的功率谱,如何计算呢?

2个回答

4
我猜你想找的是FFT的对数形式,因为这是表达傅里叶级数功率谱的更好方式之一。由于频谱的动态范围与显示器的8位相比非常大,因此中心亮值会主导结果,通过对数变换来解决这个问题。
以下是MATLAB的做法:
I = imread('cameraman.tif');
imshow(I)
F = fft2(I);
shF = fftshift(F);
Log = log2(1 + abs(shF));
imshow(Log, []);

在imshow表达式结束时使用空括号是必要的,以便在指定范围内显示图像,对于这种情况来说,指定范围是[min(I(:)) max(I(:))];也就是说,在I中的最小值显示为黑色,最大值显示为白色。


4

尝试:

psd=abs(fftshift(fft2(Pc))).^2;

以分贝计算:

psd=immultiply(log10(abs(fftshift(fft2(Pc)))), 20);

我对图像中的功率谱密度不太熟悉,但通常使用dB刻度需要乘以10。如果您需要平方项(再次强调,我对图像处理不太熟悉,无法确定是否必要),那么您可以乘以20并去掉平方。 - nispio
那个log 10是干什么用的? - user1452954
日志是用来以分贝表示 PSD 的。感谢 nispio 指出的因素。 - Cape Code
强度值的分贝数为20*log10(value)。 - Cameron Lowell Palmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接