vol_label_shape_stats — VOLCOLOR measure op

• Datenarten: labels → table

• Aufruf: import fullseye as fs; fs.ledger.vol_label_shape_stats(labels, spacing=None, shape: 'bool' = True) (die Implementierung direkt: import volcolor; volcolor.vol_label_shape_stats(labels, spacing=None, shape: 'bool' = True); aus dem Register: opsvolcolor.get("vol_label_shape_stats"))

• GPU: nein (nur CPU-Referenzimplementierung)

Verwendung

Größen pro Komponente, die sich in linearer Zeit bestimmen lassen (Volumen, Schwerpunkt, Box, PCA-Formindizes).

Schwester von volops.vol_region_props, aber mit einem anderen Zweck:

• Es gibt „surface_area“ und Wadell „sphericity“ aus. Zu diesem Zweck Da die Marschwürfel für jede Komponente ausgeführt werden, ist die Python-Schleife proportional zur Anzahl der Komponenten. Drehen (wird schnell schwer bei pathologischer Eingabe von 1 Voxel 1 Label).

• Dies ist auf den Betrag beschränkt, der nur die gewichtete Summe von „np.bincount“ erfordert. 1 Etikettenarray 10 „Bincount“ (Stückzahl 1, Koordinatensumme 3, Kovarianz 6) = O(N + n). Tatsächliche Messung („Konnektivität=26“, Schachbrettmuster von 1 Voxel 1 Etikett = pathologische Eingabe):

163 = 4096 Voxel / 512 Komponenten = 0,0037 s, 323 = 32768 / 4096 =

0,0350 s, 643 = 262144 / 32768 = 0,2556 s, 1283 = 2097152 / 262144 =

2,3122 s. 9,5 / 7,3 / 9,0-mal für alle 8 Voxel (64-mal für quadratisch),

Ungefähr 1,1 Mikrosekunden/Voxel über die gesamte Fläche. Die gleiche 1283-Färbung beträgt 0,0357 s.

(Zur Referenz: „volops.vol_region_props(surface="faces") ist dasselbe 163

0,0121 s – 3,5-mal länger aufgrund der Python-Schleife für jede Komponente. marschierende Würfel

Die Standardeinstellung „surface="auto" ist noch umfangreicher. )

label voxel_count volume centroid bbox volops.vol_region_props gleiche Definition und gleicher Wert (tests/test_volcolor.py::test_stats_agree_with_vol_region_props_exactly ist (mit exakter Übereinstimmung behoben). „bbox“ ist „(z0, z1, y0, y1, x0, x1)“ und die Obergrenze ist exklusiv.

Was wir auch zurückgeben:

„centroid_mm“ „(z, y, x)“ Physische Koordinaten (wie Voxel ohne Abstand)

„Ausdehnung“ Physikalische Abmessungen der Bbox „(dz, dy, dx)“ · „äquivalenter_Durchmesser“.

„(6V/pi)(1/3)“ · „touches_border“ Berührt bbox den Volumenrand? ·

„principal_extent“ Quadratwurzel des Kovarianz-Eigenwerts „(s1 >= s2 >= s3)“ (physikalische Einheit) ·

„Linearität“ „(l1-l2)/l1“ · „Planarität“ „(l2-l3)/l1“ · „Isotropie“.

„l3/l1“ · „Dehnung“ „sqrt(l1/l2)“.

Dehnung kann unendlich sein (Kontraktion): l1 > 0 und l2 == 0, Mit anderen Worten: Eine perfekt gerade Linienkomponente mit einer Dicke von 1 Voxel gibt „inf“ zurück. Unfall geteilt durch 0 Vielmehr liegt es daran, dass es in Richtung der zweiten Achse keine Spreizung gibt und sich beim Runden die Reihenfolge der Schlankheit ändert. Sie tauschen lautlos die Plätze. Ein einzelnes Voxel („l1 == 0“) ist ein isotroper Punkt, also „1,0“.

Wenn Sie vergessen, den Abstand zu übergeben, ändern sich die Zahlen und Schlussfolgerungen. Tatsächliche Messung: Eine Kugel mit einem Radius von 6 mm „Abstand = (3,0, 1,0, 1,0)“ Bei der Abtastung mit einem anisotropen Gitter von mm (dreimal gröber in z), Es werden 293 Voxel. Der wahre Wert in geschlossener Form ist „4/3 pi 63 = 904,78 mm3“:

• Mit „Abstand“ = 879,0 mm3 (Fehler -2,85 %), „Isotropie“ = 0,7349 (ungefähr isotrop = richtig).

• Kein „Abstand“ = 293,0 (in Voxeleinheiten. Fehler -67,62 % beim Lesen als mm3), „Isotropie“ = 0,0817 – Die Kugel sieht aus wie ein „Brett“. Anisotropie ignorieren Der Formindex ist fehlerhaft, gibt jedoch einen endlichen und vernünftigen Wert zurück.

*Äquivalenter Durchmesser unterscheidet sich ebenfalls um den Faktor 1,44, 11,8849 mm vs. 8,2406.

Numerischer Hinweis: Das zweite Moment wird als „E[x2] – E[x]2“ berechnet, also die Koordinaten Bei Bauteilen mit großen und kleinen Streuungen kann es zu Präzisionsverlusten kommen. Obergrenze MAX_COLOR_VOXELS (bis zu ~2000 auf einer Seite), die relative Genauigkeit von float64 für „E[x2] ~ 4e6“ beträgt 1e-16 = Absolut 1e-10, mit einem Spielraum von 10 Größenordnungen für die voxelweise Varianz. größer als das Das Volumen sollte nach dem Schneiden des ROI übergeben werden (dies ist auch der Grund für die Obergrenze).

Wenn Sie *shape* auf „False“ setzen, wird die Kovarianz (Bincount von 6 von 10) weggelassen. „principal_extent“ Geben Sie die folgenden 5 Elemente nicht zurück – es sind nur volumetrische Filter erforderlich Manchmal kann ein temporäres O(N)-Array auf eins reduziert werden.

Gibt „list[dict]“ in aufsteigender Label-Reihenfolge zurück (nur tatsächliche Labels) --- „labels.max()“ gibt kein leeres Diktat zurück, selbst wenn Lücken in der Zahl vorhanden sind.

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• poc_cold_chain_excursion — py -3.11 examples/poc_cold_chain_excursion.py

• voxel_labels_color — py -3.11 examples/voxel_labels_color.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

—

Gleiche Kategorie (measure)

vol_label_legend


*Provenance: volcolor.py — VOLCOLOR Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.