2017-07-14 6 views
2

今私はボリュームを見つけるために必要なピークを持つ3d散布図を持っています。私のデータは画像からのものなので、x値とy値はxy平面上のピクセル位置を示し、z値は各ピクセルのピクセル値です。matlabの3dピークのボリュームを見つけよう

ここに私の散布図です:

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

enter image description here

の下に描かれたように、私は、データのピークの "音量" を見つけようとしています:

enter image description here

私はfindpeaks()を試しましたが、それは私が探している2つの顕著なピークなしに私に多くのローカル最大値を与えます。さらに、私のデータは散布図からのものなので、私は自分のピークの "基底"を確立する方法に本当に固執しています。私はまた、凸包とリニア表面フィットを試みたが、これを取得しました: enter image description here enter image description here

をしかし、私はまだ自動化されたピーク「ベース」とボリュームを確立するために、これらのコマンドのいずれかを使用する方法にこだわって。スタックオーバーフローで何かを見つけることができないので、あなたにアイデアやコードセグメントがあれば教えてください。これは本当に不明な場合は事前に申し訳ありません!どうもありがとうございます!

+0

これらのピークを特別なものにする理由は何ですか?私たちはあなたのデータを持っておらず、写真を見ることであなたの心とあなたのデータセットで何が起こっているのかを把握するのは簡単ではありません。 – Masoud

+0

ピークは高いピクセル値を示し、私の疑問の一部は、データが「ピーク」としてカウントされる自動「ベース」/スレッシュホールドをどのように確立できるのだろうと思っています。私のデータは画像の1ピクセルあたり1ポイントなので、非常に散らばっているので、ピークを確立するための良いベースサーフェスをどのように確立できるかについて私は困惑しています。 – 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') 

注:このコードはいくつかのツールボックスとは異なる関数を使用します。いずれにしても機能しない場合は、まず関連ツールボックスがあることを確認してください。

関連する問題