我已经开始(一个小项目)来计算频域中图像的功率谱。
所以,到目前为止我所拥有的是:
%// 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?
但我不相信这是完全正确的,因为这会产生负频率。
如果有人能指出我正确的方向来绘制对数频率和功率谱,我真的很感激。
答案 0 :(得分:2)
fft
将信号“分成”频率“频段”,您可以观察到的最大频率是奈奎斯特频率或采样频率的一半。这意味着:
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]为单位测量,因此为了获得它,您实际上需要知道像素中心之间的物理距离(像素间距)。但你当然可以考虑以[像素^ -1]为单位的空间频率,在这种情况下你准备好了。
答案 1 :(得分:1)
要绘制功率谱与图像频率的关系,可以使用称为“径向平均”的过程。这计算距离图像中心一定径向距离的像素的平均值。将其应用于功率谱密度矩阵会得到功率与频率的线图。
有关详细信息和示例MATLAB代码:http://www.mathworks.com/matlabcentral/fileexchange/46468-radialavg-zip/content/radialavg.m
答案 2 :(得分:0)
如果空间间隔为1像素,则可以使用fs = 1。然后您的频率范围为(-N/2:N/2-1)/N
,其中N是图像的大小(x或y方向的像素数)。请注意,频率间隔为1 / N,小于1/2像素,如果N> 2,则可以在图像处理中避免混叠。