Python bindings for a fast RLE decoder/encoder, with a focus on use as a plugin for pylibjpeg
Project description
pylibjpeg-rle
A fast DICOM (PackBits) RLE plugin for pylibjpeg, written in Rust with a Python 3.6+ wrapper.
Linux, MacOS and Windows are all supported.
Installation
Installing the current release
pip install pylibjpeg-rle
Installing the development version
Make sure Python, Git and Rust are installed. For Windows, you also need to install Microsoft's C++ Build Tools.
git clone https://github.com/pydicom/pylibjpeg-rle
cd pylibjpeg-rle
python -m setup.py develop
Supported Transfer Syntaxes
UID | Description | Decoding | Encoding |
---|---|---|---|
1.2.840.10008.1.2.5 | RLE Lossless | Yes | Yes |
Usage
Decoding
With pylibjpeg
Because pydicom defaults to its own RLE decoder you must specify the use of pylibjpeg when decompressing:
from pydicom import dcmread
from pydicom.data import get_testdata_file
ds = dcmread(get_testdata_file("OBXXXX1A_rle.dcm"))
ds.decompress("pylibjpeg")
arr = ds.pixel_array
Standalone with pydicom
Alternatively you can use the included functions to decode a given dataset:
from rle import pixel_array, generate_frames
# Return the entire Pixel Data as an ndarray
arr = pixel_array(ds)
# Generator function that only processes 1 frame at a time,
# may help reduce memory usage when dealing with large Pixel Data
for arr in generate_frames(ds):
print(arr.shape)
Encoding
Standalone with pydicom
Convert uncompressed pixel data to RLE encoding and save:
from pydicom import dcmread
from pydicom.data import get_testdata_file
from pydicom.uid import RLELossless
from rle import pixel_data
# Get the uncompressed pixel data
ds = dcmread(get_testdata_file("OBXXXX1A.dcm"))
arr = ds.pixel_array
# RLE encode and encapsulate `arr`
ds.PixelData = pixel_data(arr, ds)
# Set the correct *Transfer Syntax UID*
ds.file_meta.TransferSyntaxUID = RLELossless
ds.save_as('as_rle.dcm')
Benchmarks
Decoding
Time per 1000 decodes, pydicom's default RLE handler vs. pylibjpeg-rle
Dataset | Pixels | Bytes | pydicom | pylibjpeg-rle |
---|---|---|---|---|
OBXXXX1A_rle.dcm | 480,000 | 480,000 | 4.89 s | 0.79 s |
OBXXXX1A_rle_2frame.dcm | 960,000 | 960,000 | 9.89 s | 1.65 s |
SC_rgb_rle.dcm | 10,000 | 30,000 | 0.20 s | 0.15 s |
SC_rgb_rle_2frame.dcm | 20,000 | 60,000 | 0.32 s | 0.18 s |
MR_small_RLE.dcm | 4,096 | 8,192 | 0.35 s | 0.13 s |
emri_small_RLE.dcm | 40,960 | 81,920 | 1.13 s | 0.28 s |
SC_rgb_rle_16bit.dcm | 10,000 | 60,000 | 0.33 s | 0.17 s |
SC_rgb_rle_16bit_2frame.dcm | 20,000 | 120,000 | 0.56 s | 0.21 s |
rtdose_rle_1frame.dcm | 100 | 400 | 0.12 s | 0.13 s |
rtdose_rle.dcm | 1,500 | 6,000 | 0.53 s | 0.26 s |
SC_rgb_rle_32bit.dcm | 10,000 | 120,000 | 0.56 s | 0.19 s |
SC_rgb_rle_32bit_2frame.dcm | 20,000 | 240,000 | 1.03 s | 0.28 s |
Encoding
Time per 1000 encodes, pydicom's default RLE handler vs. pylibjpeg-rle
Dataset | Pixels | Bytes | pydicom | pylibjpeg-rle |
---|---|---|---|---|
OBXXXX1A.dcm | 480,000 | 480,000 | 30.7 s | 1.36 s |
SC_rgb.dcm | 10,000 | 30,000 | 1.80 s | 0.09 s |
MR_small.dcm | 4,096 | 8,192 | 2.29 s | 0.04 s |
SC_rgb_16bit.dcm | 10,000 | 60,000 | 3.57 s | 0.17 s |
rtdose_1frame.dcm | 100 | 400 | 0.19 s | 0.003 s |
SC_rgb_32bit.dcm | 10,000 | 120,000 | 7.20 s | 0.33 s |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for pylibjpeg_rle-1.1.0-pp37-pypy37_pp73-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 10ec1917f46ba972cfb412c8c2d649335615117f1f4dafd2aff06897e5dbe020 |
|
MD5 | 99944f6f97f3e4c57adde53734a03723 |
|
BLAKE2b-256 | d55ef7d2e8a70d2a9ba7288bf884c92b0831153de5513163d86a7025cf7b136b |
Hashes for pylibjpeg_rle-1.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 89ed0ed5be8038ec0a4b2463ff6b04a58b472cad07b7a47f4d5be73676330629 |
|
MD5 | 83c8635b3ca779332750c13e72d5687d |
|
BLAKE2b-256 | 95d20e494e6fa0fa50fefbb7d90884516f68eb4743add01953b5ead67eac6d15 |
Hashes for pylibjpeg_rle-1.1.0-pp37-pypy37_pp73-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b616e137270adae7a3c0d2611de4a1e7895658bc63e1b5b7b43d69a8b53391f7 |
|
MD5 | 84bc504092fce57824b9df10c44e1198 |
|
BLAKE2b-256 | 436b0a7bf47affdc71a65c9c967bcd2785dcfe3d622823b681a562f2a0b081fd |
Hashes for pylibjpeg_rle-1.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0e3d585163f1edfb44003240978f782ee49cd08a4d107ce63a885fb80bc26cd5 |
|
MD5 | 219f9195db86d0e25be0ddeef3212dfc |
|
BLAKE2b-256 | 6e6084bd5d56ddd7f14b2643acc76bbe75401a96646e98249c2a898c57db1dcf |
Hashes for pylibjpeg_rle-1.1.0-pp36-pypy36_pp73-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 39a90e16c6e1cb2ea4f5302e04f0965efd38a7541720b0881d384cb66badb6be |
|
MD5 | 19bafd3ec8d55d99377a87e6293d5211 |
|
BLAKE2b-256 | 1fc16bf6f4d72fbb947dfb0213381b4fb1630bfcd42c1952f3333fade92892f2 |
Hashes for pylibjpeg_rle-1.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 55c0541956cadaf11457f5ff51d085f798d723bd3b25a88667233b3a38f63a6c |
|
MD5 | 929aa9f4e1bad2e30a2b1c1d8576e483 |
|
BLAKE2b-256 | fda47f51d58646f8aead696388d8c7418452bbc0e8a2a230766a61d476a36c9b |
Hashes for pylibjpeg_rle-1.1.0-pp36-pypy36_pp73-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 641cab22386c38fb465c3ba47646cc940423739c472b7d4e947f56fd9787640c |
|
MD5 | 50d74754b55cf32602e25f7d24b89fcc |
|
BLAKE2b-256 | 86e5ed013216bbcfbbeacf44b2117da0f4e713580cd84b6461c36dd8ca6c5dc2 |
Hashes for pylibjpeg_rle-1.1.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 852963024589b90ce303564e33e7c1b17320fbf19c1301c354a114bf20594c92 |
|
MD5 | 8173f8125ef05e98d5a7b4c1deb7cc44 |
|
BLAKE2b-256 | 29be7febafe9efc8c9c7297d4fb2ce6b40c30f2261b709e4a8ba57ee30d59340 |
Hashes for pylibjpeg_rle-1.1.0-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bc2302be178fe0ec86c2aa2552057561e3ae56dea78b6a1f1163e426d46a1cba |
|
MD5 | 1c43a285e3f9b97b4f88095c938f6635 |
|
BLAKE2b-256 | c82621434788b0a9d6d0d40aa5959c0c68130a2c0b41dc4a181c716c9f43632f |
Hashes for pylibjpeg_rle-1.1.0-cp39-cp39-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c441cb56bf18984b0eae273563d6c2e1a919f35bfd7c193fb5a53a2278d443cd |
|
MD5 | 550c10c4cde802cdaa24a4753a4b7165 |
|
BLAKE2b-256 | 28c24b179b3e099b1eeaa6e98e7b7dd7e6ffee099cd6e7289e8cedc277e7ab12 |
Hashes for pylibjpeg_rle-1.1.0-cp39-cp39-manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3b30a47186ed7c481d941abb818b96ab9addb812114c9c766f9d21bacec1cd4d |
|
MD5 | f62de962a2bcc0d8a1f52c750698acc4 |
|
BLAKE2b-256 | 5b71f6ee4aaa8360bd68055fedc1b410183968a0154b484b1d3f15676be30fa5 |
Hashes for pylibjpeg_rle-1.1.0-cp39-cp39-manylinux2010_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d741f533562323657c006ad28bb4448b8a6cf28aa547133fee9d60e532f12b74 |
|
MD5 | a4de7ebddb55bf8d6987b8e44a75ff09 |
|
BLAKE2b-256 | 211ad4b7632cc482e595763fc184179b5a736dbc2ec66b08e93e6f1eade88362 |
Hashes for pylibjpeg_rle-1.1.0-cp39-cp39-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0dea1ca52b5dbdb6af3a95ccd871dd59cf35e47ca7977c4cd691fd1e88ffb9f3 |
|
MD5 | 7d2851b4eadd0526a28ba7d0a7bbaba6 |
|
BLAKE2b-256 | 8f765e3e94d0737f28cb15efa4166da28b8355454a90c1b4fd06f7e80fc1e238 |
Hashes for pylibjpeg_rle-1.1.0-cp39-cp39-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 55a6074bf9858a9b872b7cc7cb3ec866b637a9f9d1a9c85aaf15e7af59e4f311 |
|
MD5 | 75646238e1484772ec788018a33f64ac |
|
BLAKE2b-256 | dbbab7deb73e4f88cadf3f736500488ef6e131902acc765aba65879cd4925ff4 |
Hashes for pylibjpeg_rle-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 365f5f7dd08b30f44c82511e8ac51f535b83c6fbbc07a347b051db405c87e638 |
|
MD5 | c828b653ed1858888f415153b80f095a |
|
BLAKE2b-256 | de3dc8d79bcd19b8ab8f00f550e627f4eafa58fc260ec741a957fc73c8ca713a |
Hashes for pylibjpeg_rle-1.1.0-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 93449d89e0b52b3a36a880316581653a4d464701a8f55cbcc9fe7ccdcd7c53e9 |
|
MD5 | 39900410ac35cda96b1d57d19e9fe366 |
|
BLAKE2b-256 | 34863bf93988382b9b27eea1b57e0a3867462eb9695f9eb5b9e4810b0a58c050 |
Hashes for pylibjpeg_rle-1.1.0-cp38-cp38-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4ffa2cd077e0bb9737a9f8ddf71489edd6edff85baab7a86994d650062d4bd02 |
|
MD5 | d0f86eeaefdc96a9da06fd3e1c1ecb13 |
|
BLAKE2b-256 | 9d35cf7c3dc71d29e09380cfb576083b7b2a9ffb3ca0efcf86832171df59b09f |
Hashes for pylibjpeg_rle-1.1.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0ea5bd62ca71a37847ed8f8b184e07ea6e9b0deebf0c1667d34eeb69a4ddabe4 |
|
MD5 | eb5b10a432a9a5649f4bf3951c8fb372 |
|
BLAKE2b-256 | 0b4a25bb4f516d9e0b1ed2f202d7df29534624af2b254fef6b726a2a9e9cfe16 |
Hashes for pylibjpeg_rle-1.1.0-cp38-cp38-manylinux2010_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 055b17c30ffd02021a688930a7636e33b8a6b45105d44597ac71b609635eb3a1 |
|
MD5 | 34c0690a2717a1a6dbd23532a649388e |
|
BLAKE2b-256 | 8d0c3d689357afebf7d1e00b42d2547b5f474ffa5a9cc9c78b077214130e02c0 |
Hashes for pylibjpeg_rle-1.1.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 160c396630d512528ff424ea25289cb49db3ad9906f083956e4521d120f515bb |
|
MD5 | 832e764742aa32278bfb88c6560563e3 |
|
BLAKE2b-256 | 072cfd77b3f4ac5d254d2bd3ddc05b907b9c0e7a12331b609ea248e82a9f33c4 |
Hashes for pylibjpeg_rle-1.1.0-cp38-cp38-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 151a9902a5832c8fef8eba40c51ff446acc3217ba18aa6bf8f861c1cb29eb6b1 |
|
MD5 | a6cb52075325d1cb965b8b0572989a98 |
|
BLAKE2b-256 | 1cfa28dcf76efa4e24289d7c71c1580fc0d5341f9940ee0ad9e2bec156d42bff |
Hashes for pylibjpeg_rle-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 211876e3211a68ece7f757b53b5d36c3a8c799c5cf06baabf62e2e88e3b62b26 |
|
MD5 | 57a9308cfc4ae24cc0867ea305a8cd85 |
|
BLAKE2b-256 | f17a468a2ef2ccabf0ab6222dddbc89e7107879b2e29f8215781335657341834 |
Hashes for pylibjpeg_rle-1.1.0-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 92ede6713425145853c1d88c79abc557f20cf42ed142d63acd108ff250b79c2b |
|
MD5 | 0abbc49c1bb4e8b40ead71accfcbd38f |
|
BLAKE2b-256 | 264a4a164b8369d71fc8b985a2340f2f62c28e659470466cc74f93701a2493ca |
Hashes for pylibjpeg_rle-1.1.0-cp37-cp37m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dc68d7fe4c2375427b12de01b91fa5bfcf9ef4a40521c9db3bc35603eae90433 |
|
MD5 | f88a69b57b8ac73838b8fba15563f5af |
|
BLAKE2b-256 | 7de30485858e5398ec0cbf2028d2cd0301b3acca2b9546a043e0068d21413cfe |
Hashes for pylibjpeg_rle-1.1.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5fd2b6a2d9bd7abaee25a587a23b98981744bdcdebe6d62c589b2a3cde1c6cb |
|
MD5 | 7ea85c5082568a52216b1eb5c945930a |
|
BLAKE2b-256 | 7369768d04031b12091c5395b8aecff7eeee6e3f5c117796e43b86df50b714ce |
Hashes for pylibjpeg_rle-1.1.0-cp37-cp37m-manylinux2010_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | df811082c635e86082eab25f23df6c2ba2511a2720cbf0c151a185dc8e3e98e3 |
|
MD5 | 55a9e8600b88118aa5f93082efa4dd7b |
|
BLAKE2b-256 | b53f48aa3af75ff226452d4840beddbaaac28776059b56ea024c88dce85c97c7 |
Hashes for pylibjpeg_rle-1.1.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 07bda527602eeea5e795ab4d83230f8d6c8ad31c3ca013a34a775e90b6d57078 |
|
MD5 | 322702dc9420a59e3030c372d038a454 |
|
BLAKE2b-256 | f59ebba0dabc5b5a9ba5fda12731e34f8187d843ea21e0a7767d0eef5bfa4d58 |
Hashes for pylibjpeg_rle-1.1.0-cp37-cp37m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 15198a6d29428ae67e081eda8df5a35ee09dd645659100253060d7cbc05c1532 |
|
MD5 | 6dc1d3945c63e8a8ea5b2f89c828bb02 |
|
BLAKE2b-256 | 37cf32ba51dd326f7120cb3655cc04c64093b09c5c17d8c02e3dc384dc6c8c4d |
Hashes for pylibjpeg_rle-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c69444f4d18b40133ed3a5f920dad49c6fd546bc9e7b6e6ef33d080f2a20a41f |
|
MD5 | 8b56c39fda44dab6106d3c32d8754fbf |
|
BLAKE2b-256 | 87df1620bebf309eee3d073f9fbe6083f3c9264548399dc44191ed4729cc91bb |
Hashes for pylibjpeg_rle-1.1.0-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 73d147fee8c9231e9a14e1b2b36d7cd6de92cbded438601ee63a9a6701654049 |
|
MD5 | e72122ec9bcdea35cdb3c066af5f0d59 |
|
BLAKE2b-256 | f6f039d8ea7ec6188a16111e9e5bd8d20c943bb0995d3ac946b744b8444fcd0b |
Hashes for pylibjpeg_rle-1.1.0-cp36-cp36m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 25dd09c9fc34afe98017224f64de46f5b3b5f5d1cb37dc184dfdb1ece0f2f3ea |
|
MD5 | ae10e76a0e003f737bab2871f4c024e0 |
|
BLAKE2b-256 | 63746434aaada811d6304c85be405577ab7a3152b1408fa476e8e2ceed6f8919 |
Hashes for pylibjpeg_rle-1.1.0-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 43be0a3cba51f8002cab001f5773fac45eafeec6f27e7f01c39295031d512cd8 |
|
MD5 | 9f895121d75ad8db14ef85db657fdc73 |
|
BLAKE2b-256 | 86a4d29b34abbac5b653b6cec46060a333fc7a2f3cb90ace30f579923c16d621 |
Hashes for pylibjpeg_rle-1.1.0-cp36-cp36m-manylinux2010_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 91846a615616d1f0bfb471d0aff498f9f2f6f2f13476f74bbb2166247a948ea7 |
|
MD5 | 5523897616530bb5014a96da7ded6f75 |
|
BLAKE2b-256 | 4baabccdb93e20217cc408559f0509afead103e7d7023319e96aa4174a8bd2ca |
Hashes for pylibjpeg_rle-1.1.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | be22f29c5e490b2fce48b6304f5c6ebc5a3e9ba6648bddf0a1448e92b8ddf1c1 |
|
MD5 | 3ceb9eccc35e942767c20df9d1e67aca |
|
BLAKE2b-256 | 8fbc46fea9642dd68d1e3ab3dc83e39622cbd48dcab99acfdb685c6533569cf5 |
Hashes for pylibjpeg_rle-1.1.0-cp36-cp36m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 63227b0714f7ce10d25c433cf12b3c282e1e955215f944340e2f28613fc11d18 |
|
MD5 | ef2fa8c2c4a72376afdf3633e8a552c0 |
|
BLAKE2b-256 | 83e2a86ab9c111f87d276cb012533a1f0f2f1b21793f89a3455f6cd9911db949 |
Hashes for pylibjpeg_rle-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7f89a0130c119844a54a32bd4e2fd549df50453fa08cc5f2b990e38b542c5b17 |
|
MD5 | e4971f683b08b17b06870631a2c88bfc |
|
BLAKE2b-256 | c79e765bb9b00669b1fe1e2772908d4691ce0ee0965f62cacecca9cb2b2042ef |