Skip to content

Commit 4b13338

Browse files
authored
Merge pull request #181 from herrmannlab/empty_seg_error_message
Add warning when empty segmentation is passed with omit_empty_frames
2 parents 9026587 + 2c7a629 commit 4b13338

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/highdicom/seg/sop.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,13 @@ def __init__(
584584
segmentation_type
585585
)
586586
self.SegmentsOverlap = segments_overlap.value
587+
if omit_empty_frames and pixel_array.sum() == 0:
588+
omit_empty_frames = False
589+
logger.warning(
590+
'Encoding an empty segmentation with "omit_empty_frames" '
591+
'set to True. Reverting to encoding all frames since omitting '
592+
'all frames is not possible.'
593+
)
587594

588595
if has_ref_frame_uid:
589596
if plane_positions is None:

tests/test_seg.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,6 +1870,51 @@ def test_construction_empty_source_image(self):
18701870
device_serial_number=self._device_serial_number
18711871
)
18721872

1873+
def test_construction_empty_source_seg_sparse(self):
1874+
# Can encoding an empty segmentation with omit_empty_frames=True issues
1875+
# a warning and encodes the full segmentation
1876+
empty_pixel_array = np.zeros_like(self._ct_pixel_array)
1877+
seg = Segmentation(
1878+
source_images=[self._ct_image],
1879+
pixel_array=empty_pixel_array,
1880+
segmentation_type=SegmentationTypeValues.FRACTIONAL.value,
1881+
segment_descriptions=(
1882+
self._segment_descriptions
1883+
),
1884+
series_instance_uid=self._series_instance_uid,
1885+
series_number=self._series_number,
1886+
sop_instance_uid=self._sop_instance_uid,
1887+
instance_number=self._instance_number,
1888+
manufacturer=self._manufacturer,
1889+
manufacturer_model_name=self._manufacturer_model_name,
1890+
software_versions=self._software_versions,
1891+
device_serial_number=self._device_serial_number,
1892+
omit_empty_frames=True,
1893+
)
1894+
1895+
assert seg.pixel_array.shape == empty_pixel_array.shape
1896+
1897+
def test_construction_empty_seg_image(self):
1898+
# Can encode an empty segmentation with omit_empty_frames=False
1899+
empty_pixel_array = np.zeros_like(self._ct_pixel_array)
1900+
Segmentation(
1901+
source_images=[self._ct_image],
1902+
pixel_array=empty_pixel_array,
1903+
segmentation_type=SegmentationTypeValues.FRACTIONAL.value,
1904+
segment_descriptions=(
1905+
self._segment_descriptions
1906+
),
1907+
series_instance_uid=self._series_instance_uid,
1908+
series_number=self._series_number,
1909+
sop_instance_uid=self._sop_instance_uid,
1910+
instance_number=self._instance_number,
1911+
manufacturer=self._manufacturer,
1912+
manufacturer_model_name=self._manufacturer_model_name,
1913+
software_versions=self._software_versions,
1914+
device_serial_number=self._device_serial_number,
1915+
omit_empty_frames=False,
1916+
)
1917+
18731918
def test_construction_invalid_content_label(self):
18741919
with pytest.raises(ValueError):
18751920
Segmentation(

0 commit comments

Comments
 (0)