Command Line Interface (CLI)
ZarrNii provides convenient command-line tools for converting between OME-Zarr and NIfTI formats. These console scripts are simple wrappers around the main ZarrNii API, making it easy to perform conversions without writing Python code.
Installation
The CLI scripts are automatically installed when you install ZarrNii:
pip install zarrnii
After installation, you'll have access to two console commands:
- z2n
- Convert OME-Zarr to NIfTI or TIFF stack format
- n2z
- Convert NIfTI to OME-Zarr
z2n: OME-Zarr to NIfTI/TIFF Conversion
The z2n
script converts OME-Zarr datasets to NIfTI format or TIFF stack format. TIFF stack export is particularly useful for compatibility with napari plugins like cellseg3d that don't support OME-Zarr multiscale data.
Basic Usage
# NIfTI output
z2n input.ome.zarr output.nii.gz
# TIFF stack output (auto-detected by pattern)
z2n input.ome.zarr output_z{z:04d}.tif
Output Format Selection
The output format is automatically detected based on the output filename:
- .nii
or .nii.gz
extensions → NIfTI format
- .tif
or .tiff
extensions with {z}
pattern → TIFF stack format
- Other extensions default to NIfTI format
TIFF Stack Format: Each Z-slice is saved as a separate 2D TIFF file. This format is useful for: - Napari plugins that don't support OME-Zarr (e.g., cellseg3d) - Tools that expect individual image files - Visual inspection of individual slices
⚠️ Performance Note: TIFF stack export loads all data into memory. Consider cropping or downsampling large datasets first.
Options
z2n --help
usage: z2n [-h] [--level LEVEL] [--channels CHANNELS]
[--channel-labels CHANNEL_LABELS [CHANNEL_LABELS ...]]
[--timepoints TIMEPOINTS] [--axes-order {ZYX,XYZ}]
[--orientation ORIENTATION] [--downsample-near-isotropic]
[--chunks CHUNKS] [--rechunk]
input output
Convert OME-Zarr to NIfTI format
positional arguments:
input Input OME-Zarr path or store
output Output NIfTI file (.nii or .nii.gz)
options:
-h, --help show this help message and exit
--level LEVEL Pyramid level to load (0 = highest resolution) (default: 0)
--channels CHANNELS Comma-separated channel indices to load (e.g., '0,2,3')
--channel-labels CHANNEL_LABELS [CHANNEL_LABELS ...]
Channel names to load by label
--timepoints TIMEPOINTS
Comma-separated timepoint indices to load (e.g., '0,1,2')
--axes-order {ZYX,XYZ}
Spatial axes order for processing (default: ZYX)
--orientation ORIENTATION
Anatomical orientation string (default: RAS)
--downsample-near-isotropic
Apply near-isotropic downsampling
--chunks CHUNKS Chunk specification for dask arrays (default: auto)
--rechunk Rechunk data arrays
Examples
# Basic conversion
z2n input.ome.zarr output.nii.gz
# Convert from ZIP store with specific pyramid level
z2n input.ome.zarr.zip output.nii.gz --level 1
# Select specific channels and reorder axes
z2n input.ome.zarr output.nii.gz --channels 0,2 --axes-order ZYX
# Change orientation and apply near-isotropic downsampling
z2n input.ome.zarr output.nii.gz --orientation LPI --downsample-near-isotropic
# TIFF Stack Export
# Save each Z-slice as a separate TIFF file for compatibility with napari plugins
z2n input.ome.zarr output_z{z:04d}.tif --tiff-channel 0
# Export to TIFF stack with custom pattern and settings
z2n input.ome.zarr slices/brain_{z:03d}.tiff --tiff-timepoint 0 --tiff-no-compress
# Export multi-channel data as multi-channel TIFFs (no channel selection)
z2n input.ome.zarr multichannel_z{z:04d}.tif
# Load specific timepoints
z2n input.ome.zarr output.nii.gz --timepoints 0,5,10
# Use channel labels instead of indices
z2n input.ome.zarr output.nii.gz --channel-labels DAPI GFP
n2z: NIfTI to OME-Zarr Conversion
The n2z
script converts NIfTI files to OME-Zarr format with multiscale pyramid generation. It's a wrapper around ZarrNii.from_nifti().to_ome_zarr()
.
Basic Usage
n2z input.nii.gz output.ome.zarr
Options
n2z --help
usage: n2z [-h] [--chunks CHUNKS] [--axes-order {XYZ,ZYX}] [--name NAME]
[--as-ref] [--zooms ZOOMS] [--max-layer MAX_LAYER]
[--scale-factors SCALE_FACTORS]
input output
Convert NIfTI to OME-Zarr format
positional arguments:
input Input NIfTI file (.nii or .nii.gz)
output Output OME-Zarr path or store
options:
-h, --help show this help message and exit
--chunks CHUNKS Chunk specification for dask arrays (default: auto)
--axes-order {XYZ,ZYX}
Spatial axes order for processing (default: XYZ)
--name NAME Name for the dataset
--as-ref Create as reference without loading data
--zooms ZOOMS Custom voxel sizes as comma-separated floats (e.g., '2.0,2.0,2.0')
--max-layer MAX_LAYER
Maximum number of pyramid levels (default: 4)
--scale-factors SCALE_FACTORS
Custom scale factors as comma-separated integers (e.g., '2,4,8')
Examples
# Basic conversion
n2z input.nii.gz output.ome.zarr
# Create compressed ZIP store with more pyramid levels
n2z input.nii.gz output.ome.zarr.zip --max-layer 6
# Use custom voxel sizes and create as reference
n2z input.nii.gz output.ome.zarr --as-ref --zooms 1.5,1.5,2.5
# Specify custom scale factors for pyramid
n2z input.nii.gz output.ome.zarr --scale-factors 2,4,8,16
# Change axes order and add dataset name
n2z input.nii.gz output.ome.zarr --axes-order ZYX --name "brain_scan"
# Custom chunking specification
n2z input.nii.gz output.ome.zarr --chunks 64,64,32
Common Workflows
Round-trip Conversion
Convert from NIfTI to OME-Zarr and back to verify data integrity:
# Original NIfTI to OME-Zarr
n2z original.nii.gz intermediate.ome.zarr
# OME-Zarr back to NIfTI
z2n intermediate.ome.zarr final.nii.gz
Working with ZIP Stores
OME-Zarr supports compressed ZIP format for efficient storage and sharing:
# Create compressed OME-Zarr
n2z input.nii.gz output.ome.zarr.zip
# Convert from compressed OME-Zarr
z2n input.ome.zarr.zip output.nii.gz
Multiscale Processing
Create OME-Zarr with multiple resolution levels for efficient visualization:
# Create 6 pyramid levels
n2z input.nii.gz output.ome.zarr --max-layer 6
# Extract a lower resolution level
z2n output.ome.zarr downsampled.nii.gz --level 2
Channel and Timepoint Selection
For multi-dimensional datasets:
# Select specific channels during conversion
z2n multichannel.ome.zarr selected_channels.nii.gz --channels 0,2,4
# Select specific timepoints
z2n timeseries.ome.zarr timepoint_subset.nii.gz --timepoints 0,10,20
Error Handling
The CLI scripts provide informative error messages for common issues:
- File not found: Clear error message if input file doesn't exist
- Invalid arguments: Helpful guidance for malformed arguments
- Conversion errors: Detailed error information for debugging
Example error handling:
# Missing input file
$ z2n missing.ome.zarr output.nii.gz
Error: Input path 'missing.ome.zarr' does not exist
# Invalid zoom specification
$ n2z input.nii.gz output.ome.zarr --zooms 1.0,2.0
Error during conversion: Expected exactly 3 comma-separated floats
Integration with Python API
The CLI scripts use the same underlying API as the Python interface, so you can easily switch between command-line and programmatic usage:
# Equivalent Python code for: n2z input.nii.gz output.ome.zarr
from zarrnii import ZarrNii
znimg = ZarrNii.from_nifti("input.nii.gz")
znimg.to_ome_zarr("output.ome.zarr")
# Equivalent Python code for: z2n input.ome.zarr output.nii.gz --level 1
from zarrnii import ZarrNii
znimg = ZarrNii.from_ome_zarr("input.ome.zarr", level=1)
znimg.to_nifti("output.nii.gz")
This consistency makes it easy to prototype with the CLI and then integrate the same functionality into your Python workflows.