Code Monkey home page Code Monkey logo

pylibjpeg-rle's Introduction

Build status Test coverage PyPI versions Python versions Code style: black

pylibjpeg-rle

A fast DICOM (PackBits) RLE plugin for pylibjpeg, written in Rust with a Python 3.7+ 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 pip install .

Supported Transfer Syntaxes

UID Description Decoding Encoding
1.2.840.10008.1.2.5 RLE Lossless Yes Yes

Usage

Decoding

With pylibjpeg
from pydicom import dcmread
from pydicom.data import get_testdata_file

ds = dcmread(get_testdata_file("OBXXXX1A_rle.dcm"))
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

pylibjpeg-rle's People

Contributors

dependabot[bot] avatar erikogabrielsson avatar scaramallion avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

pylibjpeg-rle's Issues

Pip install fails on 3.11 due to no wheel?

Hi,
I tried to install pylibjpeg-rle with pip install pylibjpeg-rle on windows python 3.11.2 without success.

pip install pylibjpeg-rle
Collecting pylibjpeg-rle
  Using cached pylibjpeg-rle-1.3.0.tar.gz (26 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: numpy>=1.20 in c:\users\er-gac\.pyenv\pyenv-win\versions\3.11.2\lib\site-packages (from pylibjpeg-rle) (1.24.2)
Building wheels for collected packages: pylibjpeg-rle
  Building wheel for pylibjpeg-rle (pyproject.toml) ... error
  error: subprocess-exited-with-error

  × Building wheel for pylibjpeg-rle (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [42 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build\lib.win-amd64-cpython-311
      creating build\lib.win-amd64-cpython-311\rle
      copying rle\utils.py -> build\lib.win-amd64-cpython-311\rle
      copying rle\_version.py -> build\lib.win-amd64-cpython-311\rle
      copying rle\__init__.py -> build\lib.win-amd64-cpython-311\rle
      creating build\lib.win-amd64-cpython-311\rle\benchmarks
      copying rle\benchmarks\bench_decode.py -> build\lib.win-amd64-cpython-311\rle\benchmarks
      copying rle\benchmarks\bench_encode.py -> build\lib.win-amd64-cpython-311\rle\benchmarks
      copying rle\benchmarks\__init__.py -> build\lib.win-amd64-cpython-311\rle\benchmarks
      creating build\lib.win-amd64-cpython-311\rle\tests
      copying rle\tests\test_decode.py -> build\lib.win-amd64-cpython-311\rle\tests
      copying rle\tests\test_encode.py -> build\lib.win-amd64-cpython-311\rle\tests
      copying rle\tests\test_handler.py -> build\lib.win-amd64-cpython-311\rle\tests
      copying rle\tests\test_utils.py -> build\lib.win-amd64-cpython-311\rle\tests
      copying rle\tests\__init__.py -> build\lib.win-amd64-cpython-311\rle\tests
      running egg_info
      writing pylibjpeg_rle.egg-info\PKG-INFO
      writing dependency_links to pylibjpeg_rle.egg-info\dependency_links.txt
      writing entry points to pylibjpeg_rle.egg-info\entry_points.txt
      writing requirements to pylibjpeg_rle.egg-info\requires.txt
      writing top-level names to pylibjpeg_rle.egg-info\top_level.txt
      reading manifest file 'pylibjpeg_rle.egg-info\SOURCES.txt'
      reading manifest template 'MANIFEST.in'
      adding license file 'LICENSE'
      writing manifest file 'pylibjpeg_rle.egg-info\SOURCES.txt'
      running build_ext
      running build_rust
      error: can't find Rust compiler
     
      If you are using an outdated pip version, it is possible a prebuilt wheel is available for this package but pip is not able to install from it. Installing from the wheel would avoid the need for a Rust compiler.  
     
      To update pip, run:
     
          pip install --upgrade pip
     
      and then retry package installation.
     
      If you did intend to build this package from source, try installing a Rust compiler from your system package manager and ensure it is on the PATH during installation. Alternatively, rustup (available at https://rustup.rs) is the recommended way to download and update the Rust compiler toolchain.
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for pylibjpeg-rle
Failed to build pylibjpeg-rle
ERROR: Could not build wheels for pylibjpeg-rle, which is required to install pyproject.toml-based projects

Support for Apple Silicon

Hi,

I run into this

ImportError: dlopen(/Users/tom/.asdf/installs/python/3.8.10/lib/python3.8/site-packages/rle/_rle.cpython-38-darwin.so, 0x0002): tried: '/Users/tom/.asdf/installs/python/3.8.10/lib/python3.8/site-packages/rle/_rle.cpython-38-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))

When using pydicom on an M1 macbook. Any suggestions for how to fix it would be appreciated!

Thanks

Error decoding segment with excess padding

See pydicom/pydicom#1438

Traceback (most recent call last):
  File ".../rle/utils.py", line 45, in decode_pixel_data
    decode_frame(src, ds.Rows * ds.Columns, ds.BitsAllocated, byteorder),
ValueError: The end of the frame was reached before the segment was completely decoded

The dylib installed with the wheel is missing the ARM architecture on Apple Silicon

Dear maintainer, thank you for pylibjpeg-rle, your work is much appreciated.

I am reporting an issue regarding the binary: When you pip install python-rle on macOS it succeeds but installs a x86 binary that fails on import when python attempts to dlopen the compiled part.

I guess I should try with anaconda/miniconda or compile from source but I have not yet done that.

Faster frame decoding using concurrency?

Can the decoding be sped up where multiple segments are available (i.e. samples/px > 1 or bytes/px > 1) using concurrency?

There may also be gains to be made by offering up a multi-frame decoder in addition to the single frame decoder currently available. Have to watch the memory use, though. And add support to pylibjpeg/pydicom.

Installing this dependency in a docker container always fails

I have a project wich has this library as dependency and I want to dockerize it but the pip install step always crashes.

I'm always getting this error when trying to build my container. I'm installing all the packages in the container which I think could be necessary but i think there must be still something missing.

This is my Dockerfile:

FROM python:3.8

WORKDIR /usr/src/app

RUN apt-get update && \
    apt-get install -y gcc g++ git cmake curl make apt-transport-https ca-certificates build-essential libc-dev python3-dev libsasl2-dev libldap2-dev libssl-dev libsnmp-dev libjpeg-dev zlib1g-dev libatlas-base-dev libffi-dev && \
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD "uwsgi -s /tmp/flaskr.sock --manage-script-name --mount /=flaskr:app"

Python, git and Rust are installed I'd like to to know what else I'm missing.

Thank you!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.