假设我有一个矩阵M. 我对它应用DFT并将其转移到中心
img_fft = fft2(double(M));
img_spec = abs(img_fft);
img_shift = fftshift(img_spec);
然后根据我的问题,我怎么能找到光谱的峰值,即。 (u,v)的峰值? 非常感谢!
答案 0 :(得分:0)
使用find
确定图像中最大值出现的位置。然而,问题是忽略DC值,这很可能是目前为止你频谱中最大的组成部分。因此,您应该做的是找到最大值,该值应该是当前的DC值,并将其设置为NaN
。完成此操作后,下一个最大值就是您要搜索的问题。
因此,首先要这样做:
idx = find(img_shift == max(img_shift(:)));
img_shift(idx) = NaN;
如果您将此处的最大值设置为NaN
,则下次调用find
时,它会忽略此位置并在搜索最大值时跳过此位置。现在,再次致电find
:
[u,v] = find(img_shift == max(img_shift(:)));
此处,u
将是您图片的水平位置,而v
则是垂直位置。现在应该正确返回不是DC值的最大峰值。但是,当您移动图像时,这不是关于中心的,所以一旦您完成上述操作,您需要执行以下操作:
[rows, cols] = size(img_fft);
u = u - floor(rows/2);
v = v - floor(cols/2);
现在将原点移动到图像的中心,这样就可以找到最大峰值相对于图像中心的位置。
现在,您可以根据自己的问题使用u
和v
来确定r
和theta
。换句话说:
r = sqrt(u^2 + v^2);
theta = atan2(v, u);
根据您的评论,一个小注释是您遇到两个共享最大值的值。这是因为频谱是对称的。完成find
后,您将得到两个答案。因此,任何一个答案都会给你正确的结果。您可以选择r,theta
对中的任何一对,也可以修改find
语句,使其仅返回一个答案。换句话说,这样做:
[u,v] = find(img_shift == max(img_shift(:)), 1);
注意最后1
的第二个参数。这意味着只返回一个结果。