Handling of compressed pixel data

How to get compressed pixel data

Prerequisites

To be able to decompress compressed DICOM pixel data, you need to install one or more packages that are able to handle the format the data is encoded in.

The following packages can be used with pydicom and NumPy to decompress compressed Pixel Data:

  • pylibjpeg with the pylibjpeg-libjpeg, pylibjpeg-openjpeg and pylibjpeg-rle plugins. Supports the most commonly used transfer syntaxes.

  • jpeg_ls supports JPEG-LS transfer syntaxes.

  • GDCM supports the most commonly used transfer syntaxes.

  • Pillow, ideally with the jpeg and jpeg2000 plugins. However we don’t recommend using Pillow as it performs a number of undesirable operations on the decoded images which are not always reversible.

Caution

We rely on the data handling capacity of the mentioned packages and cannot guarantee the correctness of the generated uncompressed pixel data. Be sure to verify the correctness of the output using other means before you use them.

Supported Transfer Syntaxes

To get the transfer syntax of a dataset you can do:

>>> from pydicom import dcmread
>>> ds = dcmread('path/to/dicom/file')
>>> ds.file_meta.TransferSyntaxUID
'1.2.840.10008.1.2.1'
>>> ds.BitsAllocated
16

As far as we have been able to verify, the following transfer syntaxes are handled by the given packages:

Transfer Syntax

NumPy

NumPy + JPEG-LS

NumPy + GDCM

NumPy + Pillow

NumPy + pylibjpeg

Name

UID

Explicit VR Little Endian

1.2.840.10008.1.2.1

Implicit VR Little Endian

1.2.840.10008.1.2

Explicit VR Big Endian

1.2.840.10008.1.2.2

Deflated Explicit VR Little Endian

1.2.840.10008.1.2.1.99

RLE Lossless

1.2.840.10008.1.2.5

4

JPEG Baseline (Process 1)

1.2.840.10008.1.2.4.50

1

5

JPEG Extended (Process 2 and 4)

1.2.840.10008.1.2.4.51

1,3

5

JPEG Lossless (Process 14)

1.2.840.10008.1.2.4.57

5

JPEG Lossless (Process 14, SV1)

1.2.840.10008.1.2.4.70

5

JPEG LS Lossless

1.2.840.10008.1.2.4.80

5

JPEG LS Lossy

1.2.840.10008.1.2.4.81

5

JPEG 2000 Lossless

1.2.840.10008.1.2.4.90

2

6

JPEG 2000

1.2.840.10008.1.2.4.91

2

6

High-Throughput JPEG 2000 Lossless

1.2.840.10008.1.2.4.201

6

High-Throughput JPEG 2000 (RPCL) Lossless

1.2.840.10008.1.2.4.202

6

High-Throughput JPEG 2000

1.2.840.10008.1.2.4.203

6

1 only with JpegImagePlugin
2 only with Jpeg2KImagePlugin
3 only if (0028,0100) Bits Allocated = 8
4 with the pylibjpeg-rle plugin, 4-5x faster than default
5 with the pylibjpeg-libjpeg plugin
6 with the pylibjpeg-openjpeg plugin

Usage

To get uncompressed pixel data as a NumPy ndarray you have a number of options, depending on your requirements: