Mam zespół wokseli, który reprezentuje kamień w 3D. Jest to binaryzowana tablica 3D, w której 1 jest przypisana do wokseli, które tworzą mój kamień i 0 gdzie indziej. Chcę:
- utwórz jego siatkową powierzchnię
- obliczyć powierzchnię na nim.
Ale jak?
Odpowiedzi:
2 dla odpowiedzi № 1Rozwiązałem mój problem, jeśli może być użyteczny. Algorytm Marching Cubes jest dobry, ale nie działa dobrze na tablicach binarizowanych. 1) Filtr gaussowski zastosowany do tablicy 3D (scipy.filters) 2) Algorytmy marszowe kostek do ich zazębienia (narzędzie scikit-image) 3) Podsumuj obszary trójkątów (narzędzie obrazu scikit)
1 dla odpowiedzi nr 2
Widzę kilka opcji w zależności od zastosowania: 3D wypukły kadłub lub maszerujące kostki.
3D wypukły kadłub
Najpierw musisz uzyskać tablicę wszystkich współrzędnych 3D woksela, gdzie twoja tablica jest równa 1
Później możesz użyć scipy.spatial.ConvexHull
. Scipy
metody są zasadniczo opakowaniem dla qhull
biblioteka. Podczas używania qhull
, jedna z opcji wyjściowych (FA
) to obliczenie całkowitej powierzchni i objętości.
Tutaj znajdziesz więcej informacji: http://scipy.github.io/devdocs/generated/scipy.spatial.ConvexHull.html http://www.qhull.org/html/qconvex.htm
Marszowe kostki
Jeśli chcesz zachować wklęsłości, to poprzednia opcja nie wystarczy. Marszowe kostki będą dobrą alternatywą. Istnieje już implementacja Pythona w obrazie scikit.
http://scikit-image.org/docs/dev/auto_examples/plot_marching_cubes.html
Ponownie musisz zdobyć wszystkie punkty, tak jak w poprzednim przypadku. Obliczasz czasowniki / twarze za pomocą:
http://scikit-image.org/docs/dev/api/skimage.measure.html#marching-cubes
A możesz obliczyć obszar za pomocą:
http://scikit-image.org/docs/dev/api/skimage.measure.html#mesh-surface-area