在2d矩阵中找到脉冲峰(dirac delta)的最佳方法是什么。
更具体地说,我想找到给定图像的谐波频率,因此我需要在图像绝对值DFT中找到脉冲峰值。
我想过使用findpeaks,但没有2d版本。我还看到了有关使用imdilate和/或imextendedmax查找普通峰值的早期帖子,但是那些找到了2d矩阵中的所有峰值,而我只对脉冲峰值感兴趣。我相信DSP人员有一个共同的方法......
请帮助,
由于
答案 0 :(得分:6)
您要做的是找到高对比度的峰。因此,您需要一种方法来识别局部最大值,以及一种测量峰值和周围值之间差异的方法。对这种差异进行阈值处理将为您确定冲动峰值。
假设您的输入信号被称为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)
查找坐标。
答案 1 :(得分:2)
This paper I wrote包含用于2D中快速局部峰值检测的Matlab源代码。它与Mathworks图像处理工具箱中的imregionalmax()
类似,但允许您指定局部邻域半径:更大的半径 - >稀疏的山峰。
由于您期望稀疏冲动,nonmaxsupp_scanline()
函数可能适合您。
答案 2 :(得分:0)
findpeaks
算法非常简单;如果一个元素大于它的两个邻居,那么它就是一个峰值。编写2D版本应该非常简单。