fullseye

vol_label_shape_stats — VOLCOLOR measure op

使い方

成分ごとの線形時間で出せる定量値(体積・重心・箱・主成分形状指標)。

:func:volops.vol_region_props の姉妹だが、目的が違う:

label voxel_count volume centroid bbox の 5 つは :func:volops.vol_region_props同一の定義・同一の値である (tests/test_volcolor.py::test_stats_agree_with_vol_region_props_exactly が 厳密一致で固定)。bbox(z0, z1, y0, y1, x0, x1) で上限は排他的。

加えて返すもの:

centroid_mm (z, y, x) 物理座標(spacing 無しなら voxel と同値)· extent bbox の物理寸法 (dz, dy, dx) · equivalent_diameter (6V/pi)**(1/3) · touches_border bbox がボリューム端に接するか · principal_extent 共分散固有値の平方根 (s1 >= s2 >= s3)(物理単位) · linearity (l1-l2)/l1 · planarity (l2-l3)/l1 · isotropy l3/l1 · elongation sqrt(l1/l2)

elongation は無限になりうる(契約):l1 > 0 かつ l2 == 0、 すなわち厚み 1 ボクセルの完全な直線の成分では inf を返す。0 で割った事故 ではなく「第 2 軸方向に広がりが無い」という事実であり、丸めると細長さの順位が 黙って入れ替わる。単一ボクセル(l1 == 0)は等方な点なので 1.0

spacing を渡し忘れると数字も結論も変わる。実測 ―― 半径 6 mm の球を spacing = (3.0, 1.0, 1.0) mm の異方格子(z だけ 3 倍粗い)で標本化すると 293 ボクセルになる。閉形式の真値は 4/3 pi 6**3 = 904.78 mm**3:

数値上の注意:2 次モーメントは E[x**2] - E[x]**2 で求めるので、座標が 大きく広がりが小さい成分では桁落ちが起きうる。上限 :data:MAX_COLOR_VOXELS (1 辺 ~2000 まで)では E[x**2] ~ 4e6 に対し float64 の相対精度 1e-16 = 絶対 1e-10 で、ボクセル単位の分散に対して 10 桁の余裕がある。それより大きい ボリュームは ROI を切ってから渡すこと(上限があるのはこのためでもある)。

shapeFalse にすると共分散(9 本のうち 6 本の bincount)を省き、 principal_extent 以下の 5 項目を返さない ―― 体積フィルタしか要らない ときに O(N) の一時配列を 1 本に減らせる。

Returns list[dict] in ascending label order (実在するラベルのみ ―― 番号に欠番があっても、labels.max() ぶんの空 dict は返さない)。

参考(サンプルデータ・文献)

実行できる例(この op を実際に呼ぶ検証済みサンプル)

型が繋がる次の op(table を入力に取れる)

同カテゴリ(measure)

vol_label_legend


Provenance: volcolor.py — VOLCOLOR operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。

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