【发布时间】:2014-10-12 18:02:07
【问题描述】:
假设我有一个矩阵 M 我对其应用 DFT 并将其移至中心
img_fft = fft2(double(M));
img_spec = abs(img_fft);
img_shift = fftshift(img_spec);
然后根据我的问题,我怎样才能找到光谱的峰值,即(u,v) 的峰值? 非常感谢!
【问题讨论】:
假设我有一个矩阵 M 我对其应用 DFT 并将其移至中心
img_fft = fft2(double(M));
img_spec = abs(img_fft);
img_shift = fftshift(img_spec);
然后根据我的问题,我怎样才能找到光谱的峰值,即(u,v) 的峰值? 非常感谢!
【问题讨论】:
使用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 来确定@987654334@ 和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的第二个参数。这意味着只返回一个结果。
【讨论】:
r 和theta 对中的任何一个,它会给你正确的结果。因此,r(1) 和 theta(1) 将是一个答案,r(2) 和 theta(2) 是另一个答案。