added fix for handling one or none unique liver segments
Browse files- livermask/utils/process.py +18 -15
livermask/utils/process.py
CHANGED
@@ -102,21 +102,24 @@ def liver_segmenter(params):
|
|
102 |
|
103 |
# 2) keep only largest connected component
|
104 |
labels = label(pred)
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
area_sizes
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
|
|
|
|
|
|
120 |
|
121 |
log.info("saving...")
|
122 |
pred = pred.astype(np.uint8)
|
|
|
102 |
|
103 |
# 2) keep only largest connected component
|
104 |
labels = label(pred)
|
105 |
+
nb_uniques = len(np.unique(labels)) # note: includes background 0
|
106 |
+
if nb_uniques > 2: # if only one, no filtering needed
|
107 |
+
regions = regionprops(labels)
|
108 |
+
area_sizes = []
|
109 |
+
for region in regions:
|
110 |
+
area_sizes.append([region.label, region.area])
|
111 |
+
area_sizes = np.array(area_sizes)
|
112 |
+
tmp = np.zeros_like(pred)
|
113 |
+
tmp[labels == area_sizes[np.argmax(area_sizes[:, 1]), 0]] = 1
|
114 |
+
pred = tmp.copy()
|
115 |
+
del tmp, labels, regions, area_sizes
|
116 |
+
|
117 |
+
if nb_uniques > 1: # if no segmentation, no post-processing needed
|
118 |
+
# 3) dilate
|
119 |
+
pred = binary_dilation(pred.astype(bool), ball(3))
|
120 |
+
|
121 |
+
# 4) remove small holes
|
122 |
+
pred = remove_small_holes(pred.astype(bool), area_threshold=0.001 * np.prod(pred.shape))
|
123 |
|
124 |
log.info("saving...")
|
125 |
pred = pred.astype(np.uint8)
|