在二维矩阵中找到脉冲峰值(狄拉克增量)的最佳方法是什么。
更具体地说,我想找到给定图像的谐波频率,因此我需要在图像绝对值 DFT 中找到脉冲峰值。
我想过使用 findpeaks 但没有 2d 版本。我还看到了有关使用 imdilate 和/或 imextendedmax 查找普通峰值的较早帖子,但那些在 2d 矩阵中找到所有峰值,而我只对脉冲峰值感兴趣。我相信 DSP 人对此有一个共同的秘诀......
请帮忙,
谢谢
在二维矩阵中找到脉冲峰值(狄拉克增量)的最佳方法是什么。
更具体地说,我想找到给定图像的谐波频率,因此我需要在图像绝对值 DFT 中找到脉冲峰值。
我想过使用 findpeaks 但没有 2d 版本。我还看到了有关使用 imdilate 和/或 imextendedmax 查找普通峰值的较早帖子,但那些在 2d 矩阵中找到所有峰值,而我只对脉冲峰值感兴趣。我相信 DSP 人对此有一个共同的秘诀......
请帮忙,
谢谢
您要做的是找到具有高对比度的峰。因此,您需要一种识别局部最大值的方法,以及一种测量峰值与周围值之间差异的方法。对这种差异进行阈值化将为您识别脉冲峰值。
假设您的输入信号被称为signal
%# dilate to find, for every pixel, the maximum of its neighbors
dilationMask = ones(3);
dilationMask(5) = 0;
dilSignal = imdilate(signal, dilationMask);
%# find all peaks
%# peaks = signal > dilSignal;
%# find large peaks peaks by thresholding, i.e. you accept a peak only
%# if it's more than 'threshold' higher than its neighbors
peaks = (signal - dilSignal) > threshold;
peaks
是一个有 1 的逻辑数组,只要有一个好的峰值。您可以使用它从信号中读取峰高signal(peaks)
,并使用 查找坐标find(peaks)
。
我写的这篇论文包含用于二维快速局部峰值检测的 Matlab 源代码。它的工作原理类似于imregionalmax()
Mathworks 图像处理工具箱,但允许您指定局部邻域半径:更大的半径 -> 更稀疏的峰值。
由于您期望稀疏脉冲,因此该nonmaxsupp_scanline()
功能可能适合您。
该findpeaks
算法非常简单;如果一个元素比它的两个邻居都大,那么它就是一个峰值。编写它的 2D 版本应该非常简单。