Skip to content

Commit

Permalink
Fix for BOT construction, add test
Browse files Browse the repository at this point in the history
  • Loading branch information
CPBridge committed Oct 21, 2024
1 parent edf89e6 commit 92780a3
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 1 deletion.
Binary file added data/test_files/sm_image_jpegls.dcm
Binary file not shown.
Binary file added data/test_files/sm_image_jpegls_nobot.dcm
Binary file not shown.
2 changes: 1 addition & 1 deletion src/highdicom/io.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ def _build_bot(fp: DicomFileLike, number_of_frames: int) -> List[int]:
f'Length of Frame item #{i} is zero.'
)

first_two_bytes = fp.read(2, True)
first_two_bytes = fp.read(2)
if not fp.is_little_endian:
first_two_bytes = first_two_bytes[::-1]
# In case of fragmentation, we only want to get the offsets to the
Expand Down
102 changes: 102 additions & 0 deletions tests/test_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,26 @@ def test_read_multi_frame_sm_image_native(self):
)
np.testing.assert_array_equal(frame, pixel_array[i, ...])

def test_read_multi_frame_sm_image_jpegls(self):
filename = str(self._test_dir.joinpath('sm_image_jpegls.dcm'))
dataset = dcmread(filename)
pixel_array = dataset.pixel_array
with ImageFileReader(filename) as reader:
assert reader.number_of_frames == 25
indices = list(range(reader.number_of_frames))
shuffle(indices)
for i in indices:
frame = reader.read_frame(i, correct_color=False)
assert isinstance(frame, np.ndarray)
assert frame.ndim == 3
assert frame.dtype == np.uint8
assert frame.shape == (
reader.metadata.Rows,
reader.metadata.Columns,
reader.metadata.SamplesPerPixel,
)
np.testing.assert_array_equal(frame, pixel_array[i, ...])

def test_read_multi_frame_sm_image_numbers_native(self):
filename = str(self._test_dir.joinpath('sm_image_numbers.dcm'))
dataset = dcmread(filename)
Expand Down Expand Up @@ -212,3 +232,85 @@ def test_read_single_frame_ct_image_dicom_file_like_opened(self):
reader.metadata.Columns,
)
np.testing.assert_array_equal(frame, pixel_array)

def test_read_single_frame_sm_image_jpegls_dicom_bytes_io(self):
filename = str(self._test_dir.joinpath("sm_image_jpegls.dcm"))
dcm = DicomBytesIO(open(filename, "rb").read())

dataset = dcmread(filename)
pixel_array = dataset.pixel_array
with ImageFileReader(dcm) as reader:
assert reader.number_of_frames == 25
for fno in range(reader.number_of_frames):
frame = reader.read_frame(fno)
assert isinstance(frame, np.ndarray)
assert frame.ndim == 3
assert frame.dtype == np.uint8
assert frame.shape == (
reader.metadata.Rows,
reader.metadata.Columns,
3,
)
np.testing.assert_array_equal(frame, pixel_array[fno])

def test_read_single_frame_sm_image_jpegls_nobot_dicom_bytes_io(self):
filename = str(self._test_dir.joinpath("sm_image_jpegls_nobot.dcm"))
dcm = DicomBytesIO(open(filename, "rb").read())

dataset = dcmread(filename)
pixel_array = dataset.pixel_array
with ImageFileReader(dcm) as reader:
assert reader.number_of_frames == 25
for fno in range(reader.number_of_frames):
frame = reader.read_frame(fno)
assert isinstance(frame, np.ndarray)
assert frame.ndim == 3
assert frame.dtype == np.uint8
assert frame.shape == (
reader.metadata.Rows,
reader.metadata.Columns,
3,
)
np.testing.assert_array_equal(frame, pixel_array[fno])

def test_read_single_frame_sm_image_jpegls_dicom_file_like_opened(self):
# Test reading frames from an opened DicomFileLike file
filename = self._test_dir.joinpath("sm_image_jpegls.dcm")
dcm = DicomFileLike(filename.open("rb"))

dataset = dcmread(filename)
pixel_array = dataset.pixel_array
with ImageFileReader(dcm) as reader:
assert reader.number_of_frames == 25
for fno in range(reader.number_of_frames):
frame = reader.read_frame(fno)
assert isinstance(frame, np.ndarray)
assert frame.ndim == 3
assert frame.dtype == np.uint8
assert frame.shape == (
reader.metadata.Rows,
reader.metadata.Columns,
3,
)
np.testing.assert_array_equal(frame, pixel_array[fno])

def test_read_single_frame_sm_image_jpegls_nobot_dicom_file_like_opened(self):
# Test reading frames from an opened DicomFileLike file
filename = self._test_dir.joinpath("sm_image_jpegls_nobot.dcm")
dcm = DicomFileLike(filename.open("rb"))

dataset = dcmread(filename)
pixel_array = dataset.pixel_array
with ImageFileReader(dcm) as reader:
assert reader.number_of_frames == 25
for fno in range(reader.number_of_frames):
frame = reader.read_frame(fno)
assert isinstance(frame, np.ndarray)
assert frame.ndim == 3
assert frame.dtype == np.uint8
assert frame.shape == (
reader.metadata.Rows,
reader.metadata.Columns,
3,
)
np.testing.assert_array_equal(frame, pixel_array[fno])

0 comments on commit 92780a3

Please sign in to comment.