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-2024.6.1.tar.gz (7.3 kB view details)

Uploaded Source

Built Distribution

imagej_rolling_ball-2024.6.1-py3-none-any.whl (8.9 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for imagej_rolling_ball-2024.6.1.tar.gz
Algorithm Hash digest
SHA256 f27a76dc19f009d46a6bc1b5bc3f26320448b76b9121ca84594f63ec932e9754
MD5 9f14d920b15cc8e6f5ab8f17aaf5c930
BLAKE2b-256 434ede939f15749e0939f65f71fad6b5bf6ead1c4e92e0582fda3ed339e185ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for imagej_rolling_ball-2024.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 13fad3a1faa0df751e4cf378b5826556b647700e3ee8df25312d1f91fc0fbd2b
MD5 3836387eb57f118109b35a8056b3348d
BLAKE2b-256 068e2af5f8dcedbae4d1dd0c3a22c876ca89e2b58636d0cc8d47bfea40f70ef9

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