2017-07-14 122 views
2

现在,我有一个三维散点图,其中包含我需要查找体积的峰值。我的数据来自图像,因此x值和y值表示xy平面上的像素位置,z值是每个像素的像素值。在matlab中查找3d峰的体积

这里是我的散点图:

scatter3(x,y,z,20,z,'filled') 

enter image description here

我试图找到该数据的峰值的 “音量”,如绘制如下:

enter image description here

我试过findpeaks(),但它给了我很多当地最大值,但没有找到两个突出的峰值。另外,由于我的数据来自散点图,所以我非常在意如何建立峰值的“基数”。我也试着凸包和线性曲面拟合,并获得这样的: enter image description here enter image description here

但我仍然停留在如何使用这些命令来建立一个自动化峰“基地”和音量。请让我知道,如果你有任何想法或代码段来帮助我,因为我很难过,并且在堆栈溢出中找不到任何东西。对不起,如果这真的不清楚!非常感谢!

+0

是什么让这些山峰变得特别。我们没有您的数据,通过查看图片并不容易掌握您的想法和数据集中发生的事情。 – Masoud

+0

峰值表示高像素值,我的问题的一部分是想知道如何建立一个自动化的“基准”/阈值,高于该阈值数据被视为“峰值”。我的数据是每个像素一个图像的一个点,所以它非常分散,所以我难以确定如何建立一个良好的基面来建立峰值。 – Anonymous

+0

这些数据是描述整个图像,还是只是它的一部分? – KjMag

回答

0

已经有一个网格,也许你可以使用https://se.mathworks.com/matlabcentral/answers/277512-how-to-find-peaks-in-3d-mesh中描述的过程。 如果没有,在(x,z)或(y,z)平面上进行线性回归可以为您找到峰值奠定基础。

在大量噪声数据的经验之外,如果您有一小组数据进行分析,手动选择峰值通常会更快。只需在findpeaks()中绘制每个峰值的数字并选择与您相关的峰值。对更平滑的数据进行插值可以帮助解决长期的问题(但自身会产生问题)。

其他选项将搜索(x,z)和(y,z)平面中的峰值,然后使(x)[或(y)]区间中的每个峰值的幅度以及从那里开始整合每个地区。

1

以下是处理这个问题的一个建议:

  1. 定义的Z高度的阈值,或其中从散射点的任何其他方式定义是相关的(在下面的最左边的图中的黑色平面) 。
  2. 在结果点内,在X-Y平面上查找聚类,以定义要计算的不同区域。你将不得不手动定义你想要的群集数量。
  3. 对于每个群集,执行Delaunay三角测量以估计其体积。

peaks demo

这里是所有的示例代码:

[x,y,z] = peaks(30); % some data 
subplot 131 
scatter3(x(:),y(:),z(:),[],z(:),'filled') 
title('The original data') 
th = 2.5; % set a threshold for z values 
hold on 
surf([-3 -3 3 3],[-4 4 -4 4],ones(4)*th,'FaceColor','k',... 
    'FaceAlpha',0.5) 
hold off 
ind = z>th; % get an index of all values of interest 
X = x(ind); 
Y = y(ind); 
Z = z(ind); 
clustNum = 3; % the number of clusters should be define manually 
T = clusterdata([X Y],clustNum); 
subplot 132 
gscatter(X,Y,T) 
title('A look from above') 
subplot 133 
hold on 
c = ['rgb']; 
for k = 1:max(T) 
    valid = T==k; 
    % claculate a triangulation of the data: 
    DT = delaunayTriangulation([X(valid) Y(valid) Z(valid)]); 
    [K,v] = convexHull(DT); % get the convex hull indices 
    % plot the volume: 
    ts = trisurf(K,DT.Points(:,1),DT.Points(:,2),DT.Points(:,3),... 
     'FaceColor',c(k)); 
    text(mean(X(valid)),mean(Y(valid)),max(Z(valid))*1.3,... 
     num2str(v),'FontSize',12) 
end 
hold off 
view([-45 40]) 
title('The volumes') 

注:这个代码从几个工具箱使用不同的功能。在任何情况下,一些不起作用的,首先确保你有相关的工具箱,有大部分的替代品。