Skip to content

Commit bad6184

Browse files
committed
feat: add per_segment/mean segment volume and surface area
1 parent 0299fd0 commit bad6184

3 files changed

Lines changed: 16 additions & 0 deletions

File tree

tests/test_features.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ def test_radius_stats_passthrough(
199199
"std_diameter": 1.0,
200200
"min_diameter": 4.0,
201201
"max_diameter": 10.0,
202+
"mean_segment_volume": 0.0,
203+
"mean_surface_area": 0.0,
202204
}
203205
features = extract_vessel_features(
204206
simple_cross,

vesskel/features.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ def per_segment_radii(
198198
std_r = np.full(n, np.nan, dtype=np.float64)
199199
min_r = np.full(n, np.nan, dtype=np.float64)
200200
max_r = np.full(n, np.nan, dtype=np.float64)
201+
volume = np.full(n, np.nan, dtype=np.float64)
202+
surface_area = np.full(n, np.nan, dtype=np.float64)
201203

202204
for i in range(n):
203205
coords = graph.path_coordinates(i)
@@ -208,6 +210,8 @@ def per_segment_radii(
208210
std_r[i] = np.std(radii)
209211
min_r[i] = np.min(radii)
210212
max_r[i] = np.max(radii)
213+
volume[i] = np.pi * float(np.sum(radii**2))
214+
surface_area[i] = 2.0 * np.pi * float(np.sum(radii))
211215

212216
return {
213217
"mean_radius": mean_r,
@@ -218,6 +222,8 @@ def per_segment_radii(
218222
"std_diameter": 2.0 * std_r,
219223
"min_diameter": 2.0 * min_r,
220224
"max_diameter": 2.0 * max_r,
225+
"volume": volume,
226+
"surface_area": surface_area,
221227
}
222228

223229

@@ -254,6 +260,8 @@ def build_vessel_graph(skeleton: np.ndarray) -> Skeleton:
254260
"max_diameter": 0.0,
255261
"vessel_area": 0.0,
256262
"vessel_area_fraction": 0.0,
263+
"mean_segment_volume": 0.0,
264+
"mean_surface_area": 0.0,
257265
}
258266

259267

@@ -367,6 +375,8 @@ def extract_vessel_features(
367375
"std_diameter": 0.0,
368376
"min_diameter": 0.0,
369377
"max_diameter": 0.0,
378+
"mean_segment_volume": 0.0,
379+
"mean_surface_area": 0.0,
370380
}
371381

372382
return {

vesskel/pipeline.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ def analyze_binary_image(
117117
for key, arr in per_seg.items():
118118
branch_data[key] = arr
119119

120+
if radius_stats is not None:
121+
radius_stats["mean_segment_volume"] = float(np.nanmean(branch_data["volume"]))
122+
radius_stats["mean_surface_area"] = float(np.nanmean(branch_data["surface_area"]))
123+
120124
if not branch_data.empty:
121125
euclidean = branch_data["euclidean-distance"].to_numpy(dtype=float)
122126
branch_dist = branch_data["branch-distance"].to_numpy(dtype=float)

0 commit comments

Comments
 (0)