我已经开始(一个小项目)来计算频域中图像的功率谱。

因此,到目前为止,我的工作是:

%// close all; clear all; %// not generally appreciated
img   = imread('ajw_pic.jpg','jpg'); % it is a color image
img = rgb2gray(img); %// change to gray
psd = 10*log10(abs(fftshift(fft2(img))).^2 );
figure(2); clf
mesh(psd)

到目前为止看起来不错;我得到的网格图类似于我在各种学术论文中看到的光谱。

但是,我要寻找的是此功率谱与频率的关系图,我不确定如何获得此频率向量。我可以例如:
N=400;        %// the image is 400 x 400
f=-N/2:N/2-1; %// possible frequencies?

但是我不认为这是完全正确的,因为这会导致出现负频率。

如果有人能指出正确的方向来绘制对数频率与功率谱,我将不胜感激。

最佳答案

fft将信号“ split ”为频率“bins”,其中可以观察到的最大频率是奈奎斯特频率或采样频率的一半。这意味着:

Y = fft(X,N); %  (1D case)
Y(1:N/2+1)中与fft值对应的频率为:
f = [fs/2*linspace(0,1,N/2+1)]; % where fs is your sampling frequency

Y的另一半只是镜像的,并且来自傅里叶变换的内在函数。如果您不想完全理解它,我想说的就是除了在维基百科上可以找到的东西之外,无需打扰它。但是出于好奇,您可以查看一个很好的直观的正负频率起源说明:https://dsp.stackexchange.com/questions/431/what-is-the-physical-significance-of-negative-frequencies/449#449

2D图像情况的一些主要区别:
  • 使用fftshift将0频率移至矩阵的中心,而不是像上面的1D示例中那样将其位于边缘。因此,您实际上会得到f = fs/2 * linspace(-1,1,N)(再次,不要介意负频率)
  • 下一个问题是获取采样频率。空间频率通常以[mm ^ -1]进行测量,因此要获得空间频率,您实际上需要知道像素中心之间的物理距离(像素间距)。但是您当然可以考虑以[pixels ^ -1]为单位的空间频率,在这种情况下,您就可以开始使用了。
  • 09-17 01:53