Parallel tiff writer compatible with ImageJ.
Project description
Tiffwrite
Exploiting tifffile in parallel to write ImageJ compatible tiffs with good compression.
Features
- Writes bigtiff file that opens in ImageJ as hyperstack with correct dimensions.
- Parallel compression.
- Write individual frames in random order.
- Compresses even more by referencing tag or image data which otherwise would have been save several times. For example empty frames, or a long string tag on every frame.
- Enables memory efficient scripts by saving frames whenever they're ready to be saved, not waiting for the whole stack.
Installation
pip install tiffwrite
or
pip install tiffwrite@git+https://github.com/wimpomp/tiffwrite
Usage
Write an image stack
tiffwrite(file, data, axes='TZCXY', bar=False, colormap=None, pxsize=None)
- file: string; filename of the new tiff file.
- data: 2 to 5D numpy array in one of these datatypes: (u)int8, (u)int16, float32.
- axes: string; order of dimensions in data, default: TZCXY for 5D, ZCXY for 4D, CXY for 3D, XY for 2D data.
- bar: bool; whether or not to show a progress bar.
- colormap: string; choose any colormap from the colorcet module.
- pxsize: float; set tiff tag so ImageJ can read the pixel size (in um).
Write one frame at a time
with IJTiffWriter(file, shape, dtype='uint16', colormap=None, nP=None, extratags=None, pxsize=None) as tif:
some loop:
tif.save(frame, c, z, t)
-
file: string; filename of the new tiff file, or list of filenames.
-
shape: iterable; shape (C, Z, T) of data to be written in file.
-
dtype: string; cast data to dtype before saving, only (u)int8, (u)int16 and float32 are supported.
-
colormap: string; choose any colormap from the colorcet module.
-
nP: int; number of compressor workers to use
-
extratags: dict {int tagnr: (int type, data)}, extra tags to save on every frame, will cause a crash if not used correctly!
-
pxsize: float; set tiff tag so ImageJ can read the pixel size (in um).
-
frame: 2D numpy array with data
-
c, z, t: int; channel, z, time coordinates of the frame
Examples
Write an image stack
from tiffwrite import tiffwrite
import numpy as np
image = np.random.randint(0, 255, (5, 3, 64, 64), 'uint16')
tiffwrite('file.tif', image, 'TCXY')
Write one frame at a time
from itertools import product
from tiffwrite import IJTiffWriter
import numpy as np
shape = (3, 5, 10) # channels, z, time
with IJTiffWriter('file.tif', shape, pxsize=0.09707) as tif:
for c in range(shape[0]):
for z in range(shape[1]):
for t in range(shape[2]):
tif.save(np.random.randint(0, 10, (32, 32)), c, z, t)
Saving multiple tiffs simultaneously
from itertools import product
from tiffwrite import IJTiffWriter
import numpy as np
shape = (3, 5, 10) # channels, z, time
with IJTiffWriter(('fileA.tif', 'fileB.tif'), shape) as tif:
for c in range(shape[0]):
for z in range(shape[1]):
for t in range(shape[2]):
tif.save('fileA.tif', np.random.randint(0, 10, (32, 32)), c, z, t)
tif.save('fileB.tif', np.random.randint(0, 10, (32, 32)), c, z, t)
Tricks & tips
- ImageJ colors channels in the order rgbwcym, and IJTiffwriter automatically and efficiently writes 0's when a frame is skipped. You can use this when specific colors are important, for example: you want to use only red and blue.
- The order of feeding frames to IJTiffWriter is unimportant, IJTiffWriter will order de ifd's such that the file will be opened as a correctly ordered hyperstack.
- Using the colormap parameter you can make ImageJ open the file and apply the colormap. colormap='glasbey' is very useful.
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 Distribution
Built Distribution
Hashes for tiffwrite-2021.12.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 04c8da55b1d9b16d1e396a5244361508e326172cf30dfbe1f813a8f187f0b539 |
|
MD5 | 1f6a2a23f16b914caf098e5825c9f014 |
|
BLAKE2b-256 | b377fb9076bbf4197d5d0213463b273b8f29b1a6e716a49f94cb5362ea89b1d4 |