Skip to content

Commit 3bf759d

Browse files
authored
Merge pull request #242 from ImagingDataCommons/bug/read_ybr_full_422
Correctly account for Cr and Cb subsampling for native YBR_FULL_422
2 parents 9eaf2bd + 01a4056 commit 3bf759d

2 files changed

Lines changed: 25 additions & 0 deletions

File tree

src/highdicom/io.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,12 @@ def _bytes_per_frame_uncompressed(self) -> int:
492492
# are packed into 12.5 -> 13 bytes
493493
return n_pixels // 8 + (n_pixels % 8 > 0)
494494
else:
495+
if self.metadata.PhotometricInterpretation == 'YBR_FULL_422':
496+
# Account for subsampling of CB and CR when calculating
497+
# expected number of samples
498+
# See https://dicom.nema.org/medical/dicom/current/output/chtml
499+
# /part03/sect_C.7.6.3.html#sect_C.7.6.3.1.2
500+
n_pixels = self.metadata.Rows * self.metadata.Columns * 2
495501
return n_pixels * bits_allocated // 8
496502

497503
def close(self) -> None:

tests/test_io.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,25 @@ def test_read_multi_frame_seg_image_sm_dots_bitpacked(self):
157157
)
158158
np.testing.assert_array_equal(frame, pixel_array[i, ...])
159159

160+
def test_read_ybr_422_native(self):
161+
# Reading a frame using YBR_422 photometric interpretation and no
162+
# compression
163+
filename = str(get_testdata_file('SC_ybr_full_422_uncompressed.dcm'))
164+
dataset = dcmread(filename)
165+
pixel_array = dataset.pixel_array
166+
with ImageFileReader(filename) as reader:
167+
assert reader.number_of_frames == 1
168+
frame = reader.read_frame(0, correct_color=False)
169+
assert isinstance(frame, np.ndarray)
170+
assert frame.ndim == 3
171+
assert frame.dtype == np.uint8
172+
assert frame.shape == (
173+
reader.metadata.Rows,
174+
reader.metadata.Columns,
175+
reader.metadata.SamplesPerPixel,
176+
)
177+
np.testing.assert_array_equal(frame, pixel_array)
178+
160179
def test_read_single_frame_ct_image_dicom_bytes_io(self):
161180
filename = str(self._test_dir.joinpath("ct_image.dcm"))
162181
dcm = DicomBytesIO(open(filename, "rb").read())

0 commit comments

Comments
 (0)