Erhalten der Punkte, die zur konvexen Hülle gehören

8

Ich habe ein Binärbild eines Granulats in Matlab. Ich kann die konvexe Hülle des Granulats mit der folgenden Funktion finden:

%Vor%

Wie kann ich alle Pixel finden, die zur konvexen Hülle gehören, aber nicht zum Körnchen im Originalbild gehören? Ich meine, ich würde gerne so etwas machen:

%Vor%

Es funktioniert nicht, weil K die Größe x durch 3 hat, wobei x die Anzahl der Dreiecke in der konvexen Hülle ist.

Bearbeiten: Gemäß der Dokumentation sollte die konvexe Hülle eine Anordnung mit den Indexen von Punkten sein, die die konvexe Hülle in jeder Reihe bilden. Also wie finde ich alle Punkte, die innerhalb des durch diese Punkte bestimmten Volumens liegen.

Edit2: Lass es mich in anderen Worten sagen: Ich habe ein Bild, das ein 3D-Array von Punkten ist. Es ist keine Kugel und es gibt einige Vertiefungen (die konvexe Hülle liegt also nicht auf der Oberfläche meines Bildes).

Ich möchte die konvexe Hülle finden und danach alle Punkte finden, die innerhalb der konvexen Hülle sind, aber außerhalb der Körnchen sind. Hier ist, wie es in 2D aussehen würde (Ich möchte die roten Pixel finden ):

Edit3: NicolaSysnet, Ihr Algorithmus sollte alle Pixel (ihre Indizes) zurückgeben, die in meinem Bild rot sind (das Bild ist in 2D, weil es einfacher zu zeichnen war).

    
user2738748 05.10.2015, 21:45
quelle

4 Antworten

3
%Vor%

K sind die Zeilennummern Ihrer Punkte, die den Punkten auf der konvexen Hülle entsprechen, V ist nur das Volumen, das von dieser konvexen Hülle überspannt wird. Daher können Sie diesen Zeilenindex verwenden, um Ihre Zero-Indizes in granule zu finden.

Verwenden Sie das folgende Beispiel:

%Vor%

ergibt sum(tmp2)=11 , also gibt es in diesem Fall 11 Punkte, die auf der konvexen Hülle liegen und beide Indizes unter 0,1 haben (ich konnte ==0 nicht verwenden, da es in meinem Array keine Nullen gibt).

>

Sie können die Bedingung für tmp2 basierend auf dem, was Sie tatsächlich wollen, ändern.

Es überrascht nicht, dass mehr Leute damit zu kämpfen haben und tatsächlich einen Code dafür geschrieben haben, siehe MathWorks Central , Code von John D'Errico.

    
Adriaan 13.10.2015 21:32
quelle
3

Das sollte funktionieren:

%Vor%

Dieser Code überprüft für jedes Gesicht, dass jeder Punkt in einem rechteckigen Netz auf der gleichen Seite dieser Seite der konvexen Hülle liegt.

Um die Berechnungen zu beschleunigen, wird das rechteckige Netz nur für die Koordinaten gemacht, die die Körnchenprojektion auf den drei Koordinatenebenen berühren, auf diese Weise, wenn das Körnchen die 5% der Fläche einnimmt kann 90-95% der zu überprüfenden Punkte ohne Berechnung schneiden.

    
NicolaSysnet 19.10.2015 13:53
quelle
1

Was Sie tun müssen, ist Convhull, um die wasserdichte Oberfläche Ihres Rumpfes zu erzeugen, und dann sehe ich zwei Optionen:

  • Überprüfe für jeden Punkt in deinem 1024 ^ 3 Gitter, ob es sich innerhalb oder außerhalb des Rumpfes befindet - vielleicht mit einem 'in Polyherdron Test' (zB dies )

  • Alternativ könnten Sie, statt auf jedem Voxel (3d-Pixel) zu testen, Ihre konvexe Hülle voxelisieren (dh rasterisieren) - das verwandelt diese wasserdichte Oberfläche in eine Menge Voxel. Eine Option dafür ist hier verfügbar.

Sobald Sie wissen, welche Punkte innerhalb der konvexen Hülle liegen, können Sie die Punkte leicht aus dem Körnchen entfernen.

    
gregswiss 14.10.2015 23:09
quelle
0

Da ich gerade an einer ähnlichen Frage arbeite, habe ich auf der Matlab Exchange-Plattform eine Funktion namens inhull , die feststellt, ob einige Testpunkte innerhalb oder außerhalb einer gegebenen konvexen Hülle liegen.

Es funktioniert gut, aber die Zeitverarbeitung kann ziemlich lang sein, wenn die Anzahl der zu testenden Punkte groß ist ...

    
Eskapp 11.10.2016 16:12
quelle

Tags und Links