MATLAB网格图中的峰值分析

时间:2015-02-11 16:39:45

标签: matlab image-processing 3d signal-processing gaussian

我正在对下面的图像进行曲率分析,并且需要能够测量峰值之间的距离。有人可以说明这是怎么做的吗?我只对图表的正部分感兴趣,如果每个峰值的高度也可以提取,它会很有用。

我尝试过使用findpeaks,但是它要求一个向量,我没有给它。

我正在使用在线Mathworks存储库中的surfature功能。出于这个问题的目的,'X'是我输入高斯滤波器的图像:

    G = fspecial('gaussian',[19 19],6);
    X = imfilter(X,G,'same');

    [XI YI]=meshgrid(1:size(X,2), 1:size(X,1)); % Just create the x and y
    [K, H, P1, P2, C, SI]=surfature(XI, YI, X);

    figure(2);

    mesh(surfature(XI, YI, X)); colormap gray;

我将非常感谢任何帮助。

curve_image1

1 个答案:

答案 0 :(得分:1)

1D数组/向量的findpeaks背后的逻辑是它查看本地3元素邻域并查看窗口的中心是否是最大元素。如果是,这可能是一个高峰。您还需要应用阈值以确保不会出现噪声低振幅峰值。在2D中它非常直接。查看一个3 x 3像素的邻域(或者它可以是您想要的任何大小),看看最终的最大值是否与每个邻域的中心位置相同。如果您的数据非常嘈杂,您可以增加邻域的大小来分析。增加邻域的大小会滤除更多噪声,但代价是可能会丢失彼此接近的有效强峰。不幸的是,您必须使用它才能使其适合您的应用程序。

因为您将此帖子标记为图像处理,我建议您在图像处理视点中查看此内容。具体来说,用imdilate来观察形态膨胀。膨胀相当于最大过滤器,所以你可以做的就是做这样的事情。我不确定您是使用KHP1还是P2,因此请相应修改:

thresh = 0.01;
sur = H; %// or K, P1, P2
sur(isnan(sur)) = 0; %// Set any NaN values to zero
N = 3;
se = strel('square', N);
out = imdilate(sur, se);

pks = out == sur & sur > thresh;

pks将是一个二维数组,其大小与H中存储的平均曲率相同。我们也只想查看正峰值,因此我们还需要检查是否H > threshthresh是一个阈值,以确保我们不会看到低振幅峰值。我不知道你想使用哪一个,所以我会把它留给你。获得峰值出现位置后,可以使用pks索引H或任何您想要确定实际峰值的内容:

pks_val = sur(pks);

如果您想要峰值的实际XYZ位置,您可以执行以下操作:

xvals = XI(pks);
yvals = YI(pks);
zvals = X(pks);

XIYI我假设是一些网格网格(通过变量名称),而X是一个图像,你可以在图像中找到峰值的位置也对应。

现在,关于峰之间距离的问题,这是非常模糊的,因为你有2个自由度。假设你有这个图像:

0 0 1 0 0
0 0 0 0 0
0 1 1 1 0
0 0 0 0 0
0 0 1 0 0

如果我们进行了峰值检测,则任何具有1的值都将被归类为峰值。如果你想找到峰之间的距离......好吧......在哪个方向?例如,查看最中心的位置,您将使用哪个单一距离值来指定任何其他峰值与中心之间的距离?你会用左边的那个吗?对?最佳?底部?你有两个自由度,并试图将某些东西量化为单个值,因此肯定存在歧义。

我的建议是重新考虑你试图对这些峰值进行的实际操作,并做一些其他事情,而不是测量峰值之间的距离。