在MATLAB中找到2d脉冲峰值

时间:2010-11-21 23:00:50

标签: matlab image-processing signal-processing dft

在2d矩阵中找到脉冲峰(dirac delta)的最佳方法是什么。

更具体地说,我想找到给定图像的谐波频率,因此我需要在图像绝对值DFT中找到脉冲峰值。

我想过使用findpeaks,但没有2d版本。我还看到了有关使用imdilate和/或imextendedmax查找普通峰值的早期帖子,但是那些找到了2d矩阵中的所有峰值,而我只对脉冲峰值感兴趣。我相信DSP人员有一个共同的方法......

请帮助,

由于

3 个答案:

答案 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版本应该非常简单。