2017-07-14 97 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') 

注:這個代碼從幾個工具箱使用不同的功能。在任何情況下,一些不起作用的,首先確保你有相關的工具箱,有大部分的替代品。