cuCIM - an extensible toolkit designed to provide GPU accelerated I/O, computer vision & image processing primitives for N-Dimensional images with a focus on biomedical imaging.
Project description
cuCIM
RAPIDS cuCIM is an extensible toolkit designed to provide GPU accelerated I/O, computer vision & image processing primitives for N-Dimensional images with a focus on biomedical imaging.
NOTE: For the latest stable README.md ensure you are on the main
branch.
- GTC 2021 cuCIM: A GPU Image I/O and Processing Toolkit [S32194]
- SciPy 2021 cuCIM - A GPU image I/O and processing library
Quick Start
Install cuCIM
pip install cucim
# Install dependencies for `cucim.skimage` (assuming that CUDA 11.0 is used for CuPy)
pip install scipy scikit-image cupy-cuda110
Jupyter Notebooks
Please check out our Welcome notebook.
Open Image
from cucim import CuImage
img = CuImage('image.tif')
See Metadata
import json
print(img.is_loaded) # True if image data is loaded & available.
print(img.device) # A device type.
print(img.ndim) # The number of dimensions.
print(img.dims) # A string containing a list of dimensions being requested.
print(img.shape) # A tuple of dimension sizes (in the order of `dims`).
print(img.size('XYC')) # Returns size as a tuple for the given dimension order.
print(img.dtype) # The data type of the image.
print(img.channel_names) # A channel name list.
print(img.spacing()) # Returns physical size in tuple.
print(img.spacing_units()) # Units for each spacing element (size is same with `ndim`).
print(img.origin) # Physical location of (0, 0, 0) (size is always 3).
print(img.direction) # Direction cosines (size is always 3x3).
print(img.coord_sys) # Coordinate frame in which the direction cosines are
# measured. Available Coordinate frame is not finalized yet.
# Returns a set of associated image names.
print(img.associated_images)
# Returns a dict that includes resolution information.
print(json.dumps(img.resolutions, indent=2))
# A metadata object as `dict`
print(json.dumps(img.metadata, indent=2))
# A raw metadata string.
print(img.raw_metadata)
Read Region
# Install matplotlib (`pip install matplotlib`) if not installed before.
from matplotlib import pyplot as plt
def visualize(image):
dpi = 80.0
height, width, _ = image.shape
plt.figure(figsize=(width / dpi, height / dpi))
plt.axis('off')
plt.imshow(image)
import numpy as np
# Read whole slide at the highest resolution
resolutions = img.resolutions
level_count = resolutions['level_count'] # level: 0 ~ (level_count - 1)
# Note: ‘level’ is at 3rd parameter (OpenSlide has it at 2nd parameter)
# `location` is level-0 based coordinates (using the level-0 reference frame)
# If `size` is not specified, size would be (width, height) of the image at the specified `level`.
region = img.read_region(location=(5000, 5000), size=(512, 512), level=0)
visualize(region)
#from PIL import Image
#Image.fromarray(np.asarray(region))
Using Cache
Please look at this notebook.
Using scikit-image API
Import cucim.skimage
instead of skimage
.
# The following code is modified from https://scikit-image.org/docs/dev/auto_examples/color_exposure/plot_ihc_color_separation.html#sphx-glr-auto-examples-color-exposure-plot-ihc-color-separation-py
#
import cupy as cp # modified from: `import numpy as np`
import matplotlib.pyplot as plt
# from skimage import data
from cucim.skimage.color import rgb2hed, hed2rgb # modified from: `from skimage.color import rgb2hed, hed2rgb`
# Example IHC image
ihc_rgb = cp.asarray(region) # modified from: `ihc_rgb = data.immunohistochemistry()`
# Separate the stains from the IHC image
ihc_hed = rgb2hed(ihc_rgb)
# Create an RGB image for each of the stains
null = cp.zeros_like(ihc_hed[:, :, 0]) # np -> cp
ihc_h = hed2rgb(cp.stack((ihc_hed[:, :, 0], null, null), axis=-1)) # np -> cp
ihc_e = hed2rgb(cp.stack((null, ihc_hed[:, :, 1], null), axis=-1)) # np -> cp
ihc_d = hed2rgb(cp.stack((null, null, ihc_hed[:, :, 2]), axis=-1)) # np -> cp
# Display
fig, axes = plt.subplots(2, 2, figsize=(7, 6), sharex=True, sharey=True)
ax = axes.ravel()
ax[0].imshow(ihc_rgb.get()) # appended `.get()`
ax[0].set_title("Original image")
ax[1].imshow(ihc_h.get()) # appended `.get()`
ax[1].set_title("Hematoxylin")
ax[2].imshow(ihc_e.get()) # appended `.get()`
ax[2].set_title("Eosin")
ax[3].imshow(ihc_d.get()) # appended `.get()`
ax[3].set_title("DAB")
for a in ax.ravel():
a.axis('off')
fig.tight_layout()
Acknowledgments
Without awesome third-party open source software, this project wouldn't exist.
Please find LICENSE-3rdparty.md
to see which third-party open source software
is used in this project.
License
Apache-2.0 License (see LICENSE
file).
Copyright (c) 2020-2021, NVIDIA CORPORATION.
Changelog (See Release Notes)
21.10.00
- [New] Add transforms for Digital Pathology (#100) @shekhardw @chirayuG-nvidia
- [New] Enable GDS and Support Runtime Context (enter, exit) for CuFileDriver and CuImage (#106) @gigony
- [New] Add a mechanism for user to know the availability of cucim.CuImage (#107) @gigony
- [New] Support raw RGB tiled TIFF (#108) @gigony
- [Bug] fix failing regionprops test cases (#110) @grlee77
- [Doc] Forward-merge branch-21.08 to branch-21.10 (#88) @jakirkham
- [Doc] Update PyPI cuCIM v21.08.01 README.md and CHANGELOG.md (#87) @gigony
- [Update] ENH Replace gpuci_conda_retry with gpuci_mamba_retry (#69) @dillon-cullinan
21.08.01
- [New] Add skimage.morphology.thin (#27)
- [Bug] Fix missing
__array_interface__
for associated_image(): (#48, #65) - [Testing] Added unit and performance tests for TIFF loaders (#62)
- [Bug] Fix Windows int-type Bug: (#72)
- [Update] Use more descriptive ElementwiseKernel names in cucim.skimage: (#75)
21.06.00
- Implement cache mechanism
- Add
__cuda_array_interface
. - Fix a memory leak in Deflate decoder.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for cucim-21.10.0-py3-none-manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | df3b24504da562df40b52804bc92cde68c266d35decd703b2315d2819a668461 |
|
MD5 | 16de27f5d2d57e3a3ab852ef9d467a10 |
|
BLAKE2b-256 | bfc735cf7f3b7cab7445e34c133124bbaedb3725b332d232a80062a4e93975fb |