2017-07-14 3 views
2

maintenant j'ai un nuage de points 3d avec des pics dont j'ai besoin pour trouver les volumes. Mes données proviennent d'une image, donc les valeurs x et y indiquent les positions des pixels sur le plan xy, et la valeur z est la valeur du pixel pour chaque pixel.Trouver le volume de pics 3d dans matlab

Voici mon diagramme de dispersion:

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

enter image description here

Je suis en train de trouver le "volume" des pics des données, comme dessiné ci-dessous:

enter image description here

J'ai essayé findpeaks() mais il me donne beaucoup de maxima locaux sans les deux pics proéminents que je cherche. De plus, je suis vraiment bloqué sur la façon d'établir la "base" de mes pics, car mes données proviennent d'un nuage de points. J'ai aussi essayé la coque convexe et une forme de surface linéaire, et obtenir ceci: enter image description here enter image description here

Mais je suis toujours bloqué sur la façon d'utiliser l'une de ces commandes pour établir une « base » pic automatisé et le volume . Veuillez me faire savoir si vous avez des idées ou des segments de code pour m'aider, car je suis perplexe et je ne trouve rien sur Stack Overflow. Désolé d'avance si c'est vraiment flou! Merci beaucoup!

+0

Ce qui rend ces pics spéciaux. Nous n'avons pas vos données et en regardant les images, il n'est pas facile de comprendre ce qui se passe dans votre esprit et dans votre jeu de données. – Masoud

+0

Les pics indiquent des valeurs de pixels élevées, et une partie de ma question se demande comment je peux établir une "base"/seuil automatisée au-dessus de laquelle les données comptent comme un "pic". Mes données sont un point par pixel d'une image, donc c'est très dispersé, donc je suis perplexe sur la façon dont je peux établir une bonne surface de base pour établir les pics. – Anonymous

+0

Est-ce que ces données décrivent l'image entière ou en font-elles partie? – KjMag

Répondre

0

Ayant déjà un maillage, vous pourriez peut-être utiliser le processus décrit dans https://se.mathworks.com/matlabcentral/answers/277512-how-to-find-peaks-in-3d-mesh. Si ce n'est pas le cas, faire une régression linéaire sur le plan (x, z) ou (y, z) pourrait vous servir de base pour trouver les pics. Par manque d'expérience dans les données avec beaucoup de bruit, la sélection manuelle des pics est souvent plus rapide si vous avez un petit ensemble de données pour effectuer l'analyse. Tracez simplement chaque pic avec son numéro de findpeaks() et sélectionnez ceux qui vous intéressent. Une interpolation à des données plus fluides peut aider à résoudre le problème à long terme (mais crée un problème par lui-même). L'autre option recherchera des pics dans les plans (x, z) et (y, z), puis aura l'amplitude de chaque pic dans un intervalle (x) [ou (y)] et à partir de là fera un intégration pour tous les domaines.

1

Voici une suggestion pour faire face à ce problème:

  1. définir un seuil de hauteur z, ou définie par tout autre moyen qui pointe à partir de la dispersion sont pertinentes (plan noir le plus à gauche figure ci-dessous) .
  2. Dans les points obtenus, trouvez des groupes sur le plan X-Y, pour définir les différentes régions à calculer. Vous devrez définir manuellement combien de clusters vous voulez.
  3. pour chaque cluster, effectuer une triangulation Delaunay pour estimer son volume.

peaks demo

Voici un exemple de code pour tout ce que:

[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') 

Note: ce code utilise différentes fonctions de plusieurs boîtes à outils. Dans tous les cas, si quelque chose ne fonctionne pas, assurez-vous d'abord que vous avez la boîte à outils appropriée, il existe des alternatives à la plupart d'entre eux.