Skip to main content

Python wrapper for ImageJ's rolling ball background subtraction using pyimagej

Project description

imagej-rolling-ball

Python wrapper for ImageJ's rolling ball background subtraction using pyimagej.

Install

  1. Follow pyimagej's installation instruction

  2. Install imagej-rolling-ball from pypi

    python -m pip install imagej-rolling-ball
    
  3. To work with large images, dask and zarr were used in the package. You can install them yourself or specify the [large] install

    python -m pip install imagej-rolling-ball[large]
    
  4. To work with pyramidal ome-tiff images, palom was used. Install the [wsi] extras

    python -m pip install imagej-rolling-ball[wsi]
    

Usage

The key parameter is the rolling ball radius, according to the doc, the radius

should be at least as large as the radius of the largest object in the image that is not part of the background

NOTE: While the java class BackgroundSubtracter handles RGB image, the current wrapper methods only accepts 2D arrays. One can process each channel separately and combine all the processed channels using numpy.array or numpy.dstack

Basic usage

import imagej_rolling_ball
import numpy

bg_subtracter = imagej_rolling_ball.BackgroundSubtracter(java_options='-Xmx1g')
img = numpy.eye(5) + 1

print('img\n', img, '\n')
print('radius=1')
print(bg_subtracter.rolling_ball_background(img, 1), '\n')
print('radius=2.5')
print(bg_subtracter.rolling_ball_background(img, 2.5), '\n')

And the output of the above script should be

img
 [[2. 1. 1. 1. 1.]
 [1. 2. 1. 1. 1.]
 [1. 1. 2. 1. 1.]
 [1. 1. 1. 2. 1.]
 [1. 1. 1. 1. 2.]] 

radius=1
[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]] 

radius=2
[[0.        0.        0.        0.        0.       ]
 [0.        0.7912879 0.        0.        0.       ]
 [0.        0.        0.7912879 0.        0.       ]
 [0.        0.        0.        0.7912879 0.       ]
 [0.        0.        0.        0.        0.       ]] 

Process large image

For large array (e.g. array that contains more than 2,147,483,647 elements), the BackgroundSubtracter.rolling_ball_background_chunked method is for such use case. It returns a dask.array by default or a zarr.core.Array if compute=True is set.

In [1]: import imagej_rolling_ball
   ...: import numpy
   ...: 
   ...: bg_subtracter = imagej_rolling_ball.BackgroundSubtracter(java_options='-Xmx4g')
   ...: img = numpy.eye(10_000, dtype='uint8') + 1
ImageJ Version: 2.14.0/1.54f

In [2]: bg_subtracter.rolling_ball_background_chunked(img, 50, 1024*5)
Operating in headless mode - the original ImageJ will have limited functionality.
Out[2]: dask.array<_trim, shape=(10000, 10000), dtype=uint8, chunksize=(5120, 5120), chunktype=numpy.ndarray>

In [3]: bg_subtracter.rolling_ball_background_chunked(img, 50, 1024*5).compute()
Out[3]: 
array([[1, 0, 0, ..., 0, 0, 0],
       [0, 1, 0, ..., 0, 0, 0],
       [0, 0, 1, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 1, 0, 0],
       [0, 0, 0, ..., 0, 1, 0],
       [0, 0, 0, ..., 0, 0, 1]], dtype=uint8)

In [4]: bg_subtracter.rolling_ball_background_chunked(img, 50, 1024*5, compute=True)
Out[4]: <zarr.core.Array (10000, 10000) uint8>

Process chunked ome-tiff in command line interface

Use rolling-ball command to process multi-channel tiff file and write the processed image to disk as a pyramidal ome-tiff. python -m pip install imagej-rolling-ball[wsi] is required.

NAME
    rolling-ball

SYNOPSIS
    rolling-ball IMG_PATH RADIUS <flags>

POSITIONAL ARGUMENTS
    IMG_PATH
    RADIUS

FLAGS
    --out_path=OUT_PATH
        Type: Optional[str]
        Default: None
    -t, --target_chunk_size=TARGET_CHUNK_SIZE
        Type: int
        Default: 5120
    --overwrite=OVERWRITE
        Type: bool
        Default: False
    -j, --java_options=JAVA_OPTIONS
        Type: Optional[str]
        Default: None
    -i, --imagej_version=IMAGEJ_VERSION
        Type: Optional[str]
        Default: None
    -p, --pyramid_config=PYRAMID_CONFIG
        Type: Optional[dict]
        Default: None
    --rolling_ball_kwargs=ROLLING_BALL_KWARGS
        Type: Optional[dict]
        Default: None
    -n, --num_workers=NUM_WORKERS
        Type: int
        Default: 4

NOTES:

  • To pass in JVM options, e.g. set max heap size (-Xmx4g), use the syntax of -j="-Xmx4g"
  • The defaut Java heap size is 70% of the available memory
  • Increase --num_workers may speed up processing time, default is 4
  • The default output file will be generated next to the input file, the file name ends with -ij_rolling_ball_{radius}.ome.tif

Example commands:

  • Minimal command, process file using rolling ball radius of 100 and writebackground-subtracted image to disk

    rolling-ball path/to/input/file.ome.tif 100
    
  • Write background image instead of subtracted image (--rolling_ball_kwargs "{'create_background': True}") to file; set JVM max heap size to 4 GB (-j="-Xmx4g") and use 8 threads (-n=8)

    rolling-ball path/to/input/file.ome.tif 100 \
        --out_path path/to/input/file-background_100.ome.tif \
        --rolling_ball_kwargs "{'create_background': True}" \
        -j="-Xmx4g" \ 
        --overwrite \
        -n=8
    

Docker usage

The docker image can be build from the github repo or be pulled from the docker hub.

To process an image file (input.ome.tif) with rolling ball radius 50 in the current directory:

 docker run -it --rm -v "$(pwd)":/data \
    yuanchen12/imagej-rolling-ball \
    rolling-ball /data/input.ome.tif 50

When the process is completed, output file input-ij_rolling_ball_50.ome.tif will be generated.

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

imagej_rolling_ball-2023.8.4.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

imagej_rolling_ball-2023.8.4-py3-none-any.whl (8.8 kB view details)

Uploaded Python 3

File details

Details for the file imagej_rolling_ball-2023.8.4.tar.gz.

File metadata

  • Download URL: imagej_rolling_ball-2023.8.4.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.8.11 Darwin/22.5.0

File hashes

Hashes for imagej_rolling_ball-2023.8.4.tar.gz
Algorithm Hash digest
SHA256 cadbf5dedc83bd9c63c6b9654c3b910a9c72a64499531f72a0db1f1a4a67d6f9
MD5 1dfa81afbf2883c7d5f3e5fcafdf55c1
BLAKE2b-256 6d61e35712ed0e7f9bc5dccf0bf0d16cffa595ef13ccec9932bcb77ebb4f41c9

See more details on using hashes here.

File details

Details for the file imagej_rolling_ball-2023.8.4-py3-none-any.whl.

File metadata

File hashes

Hashes for imagej_rolling_ball-2023.8.4-py3-none-any.whl
Algorithm Hash digest
SHA256 09ea59a9b67b9738bdd6fe89aa783aab10b1ed507d0246e883d58c90f700e769
MD5 17893ab0cd04505b4381bd2dda38136a
BLAKE2b-256 f8fe832fefef12e3d036e052cdf524591877dacb49c0ed6dbad1607a3fc5dccc

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page