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).
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.
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.
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.
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 ...
Tags und Links matlab convex-hull