MATLAB 网格图中的峰值分析
Analysis of peaks in MATLAB mesh plot
我正在对下图进行曲率分析,需要能够测量峰之间的距离。请有人可以阐明这是如何完成的?我只对图表的正部分感兴趣,如果也可以提取每个峰的高度,它会很有用。
我试过使用 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;
如有任何帮助,我将不胜感激。
一维数组/向量 findpeaks
背后的逻辑是它查看局部 3 元素邻域并查看 window 的中心是否是最大元素。如果是,这可能是一个峰值。您还需要应用一个阈值以确保您不会得到嘈杂的低振幅峰值。在 2D 中,它非常简单。查看一个 3 x 3 像素的邻域(或者它可以是您想要的任何大小)并查看生成的最大值是否与每个邻域的中心位置相同。如果您有非常嘈杂的数据,您将增加邻域的大小以进行分析。增加邻域的大小会过滤掉更多的噪声,但代价是可能会丢失彼此靠近的有效强峰。不幸的是,为了使它适合您的应用程序,您将不得不使用它。
因为您将这个 post 标记为图像处理,所以我建议您从图像处理的角度来看这个。具体来说,看看 imdilate
的形态膨胀。膨胀相当于最大过滤器,所以你可以做这样的事情。我不确定您使用的是 K
、H
、P1
还是 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 > thresh
。 thresh
是一个阈值,以确保我们不会查看低振幅峰值。我不知道你想用哪一个,所以我会把它留给你。一旦你有了峰值发生的位置,你可以使用 pks
索引到 H
或任何你想确定实际峰值是什么的东西:
pks_val = sur(pks);
如果您想要峰值的实际 X
、Y
和 Z
位置,您可以执行以下操作:
xvals = XI(pks);
yvals = YI(pks);
zvals = X(pks);
XI
和 YI
我假设是一些点的网格(根据你的变量名),而 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
的值都将被归类为峰值。如果你想找到峰之间的距离......好吧......在哪个方向?例如,查看最中心的位置,您将使用哪个单个距离值将任何其他峰之间的距离分配给中心?你会用左边那个吗?正确的?最佳?底部?你有两个自由度,并且试图将某些东西量化为一个值,所以肯定会有歧义。
我的建议是重新考虑您实际尝试对这些峰做什么,并做一些除了测量峰之间的距离之外的其他事情。
我正在对下图进行曲率分析,需要能够测量峰之间的距离。请有人可以阐明这是如何完成的?我只对图表的正部分感兴趣,如果也可以提取每个峰的高度,它会很有用。
我试过使用 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;
如有任何帮助,我将不胜感激。
一维数组/向量 findpeaks
背后的逻辑是它查看局部 3 元素邻域并查看 window 的中心是否是最大元素。如果是,这可能是一个峰值。您还需要应用一个阈值以确保您不会得到嘈杂的低振幅峰值。在 2D 中,它非常简单。查看一个 3 x 3 像素的邻域(或者它可以是您想要的任何大小)并查看生成的最大值是否与每个邻域的中心位置相同。如果您有非常嘈杂的数据,您将增加邻域的大小以进行分析。增加邻域的大小会过滤掉更多的噪声,但代价是可能会丢失彼此靠近的有效强峰。不幸的是,为了使它适合您的应用程序,您将不得不使用它。
因为您将这个 post 标记为图像处理,所以我建议您从图像处理的角度来看这个。具体来说,看看 imdilate
的形态膨胀。膨胀相当于最大过滤器,所以你可以做这样的事情。我不确定您使用的是 K
、H
、P1
还是 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 > thresh
。 thresh
是一个阈值,以确保我们不会查看低振幅峰值。我不知道你想用哪一个,所以我会把它留给你。一旦你有了峰值发生的位置,你可以使用 pks
索引到 H
或任何你想确定实际峰值是什么的东西:
pks_val = sur(pks);
如果您想要峰值的实际 X
、Y
和 Z
位置,您可以执行以下操作:
xvals = XI(pks);
yvals = YI(pks);
zvals = X(pks);
XI
和 YI
我假设是一些点的网格(根据你的变量名),而 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
的值都将被归类为峰值。如果你想找到峰之间的距离......好吧......在哪个方向?例如,查看最中心的位置,您将使用哪个单个距离值将任何其他峰之间的距离分配给中心?你会用左边那个吗?正确的?最佳?底部?你有两个自由度,并且试图将某些东西量化为一个值,所以肯定会有歧义。
我的建议是重新考虑您实际尝试对这些峰做什么,并做一些除了测量峰之间的距离之外的其他事情。