我正在对下面的图像进行曲率分析,并且需要能够测量峰值之间的距离。有人可以说明这是怎么做的吗?我只对图表的正部分感兴趣,如果每个峰值的高度也可以提取,它会很有用。
我尝试过使用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;
我将非常感谢任何帮助。
答案 0 :(得分:1)
1D数组/向量的findpeaks
背后的逻辑是它查看本地3元素邻域并查看窗口的中心是否是最大元素。如果是,这可能是一个高峰。您还需要应用阈值以确保不会出现噪声低振幅峰值。在2D中它非常直接。查看一个3 x 3像素的邻域(或者它可以是您想要的任何大小),看看最终的最大值是否与每个邻域的中心位置相同。如果您的数据非常嘈杂,您可以增加邻域的大小来分析。增加邻域的大小会滤除更多噪声,但代价是可能会丢失彼此接近的有效强峰。不幸的是,您必须使用它才能使其适合您的应用程序。
因为您将此帖子标记为图像处理,我建议您在图像处理视点中查看此内容。具体来说,用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
的值都将被归类为峰值。如果你想找到峰之间的距离......好吧......在哪个方向?例如,查看最中心的位置,您将使用哪个单一距离值来指定任何其他峰值与中心之间的距离?你会用左边的那个吗?对?最佳?底部?你有两个自由度,并试图将某些东西量化为单个值,因此肯定存在歧义。
我的建议是重新考虑你试图对这些峰值进行的实际操作,并做一些其他事情,而不是测量峰值之间的距离。