This repository provides a collection of tools to simplify reading CZI (Carl Zeiss Image) pixel and metadata in Python. It is available as a Python Package on PyPi
To install czitools use (will not install Napari or plotting functionality):
pip install czitools
To install the package with all optional dependencies use (will not install Napari):
pip install czitools[all]
Please check use_metadata_tools.py for some examples.
from czitools.metadata_tools.czi_metadata import CziMetadata, writexml
from czitools.metadata_tools.dimension import CziDimensions
from czitools.metadata_tools.boundingbox import CziBoundingBox
from czitools.metadata_tools.channel import CziChannelInfo
from czitools.metadata_tools.scaling import CziScaling
from czitools.metadata_tools.sample import CziSampleInfo
from czitools.metadata_tools.objective import CziObjectives
from czitools.metadata_tools.microscope import CziMicroscope
from czitools.metadata_tools.add_metadata import CziAddMetaData
from czitools.metadata_tools.detector import CziDetector
from czitools.read_tools import read_tools
try:
import napari
from napari.utils.colormaps import Colormap
show_napari = True
except ImportError:
print("Napari not installed, skipping napari import")
show_napari = False
# get the metadata_tools at once as one big class
mdata = CziMetadata(filepath)
# get only specific metadata_tools
czi_dimensions = CziDimensions(filepath)
print("SizeS: ", czi_dimensions.SizeS)
print("SizeT: ", czi_dimensions.SizeT)
print("SizeZ: ", czi_dimensions.SizeZ)
print("SizeC: ", czi_dimensions.SizeC)
print("SizeY: ", czi_dimensions.SizeY)
print("SizeX: ", czi_dimensions.SizeX)
# try to write XML to file
xmlfile = writexml(filepath)
# get info about the channels
czi_channels = CziChannelInfo(filepath)
# get the complete metadata_tools from the CZI as one big object
czimd_complete = get_metadata_as_object(filepath)
# get an object containing only the dimension information
czi_scale = CziScaling(filepath)
# get an object containing information about the sample
czi_sample = CziSampleInfo(filepath)
# get info about the objective, the microscope and the detectors
czi_objectives = CziObjectives(filepath)
czi_detectors = CziDetector(filepath)
czi_microscope = CziMicroscope(filepath)
# get info about the sample carrier
czi_sample = CziSampleInfo(filepath)
# get additional metainformation
czi_addmd = CziAddMetaData(filepath)
# get the complete data about the bounding boxes
czi_bbox = CziBoundingBox(filepath)
While the pylibCZIrw is focussing on reading individual planes it is also helpful to read CZI pixel data as a STCZYX(A) stack. Please check use_read_tools.py for some examples.
# return a dask or numpy array with dimension order STCZYX(A)
array6d, mdata = read_tools.read_6darray(filepath, use_xarray=True)
if show_napari:
# show in napari (requires napari to be installed!)
viewer = napari.Viewer()
# loop over all channels
for ch in range(0, array6d.sizes["C"]):
# extract channel subarray
sub_array = array6d.sel(C=ch)
# get the scaling factors for that channel and adapt Z-axis scaling
scalefactors = [1.0] * len(sub_array.shape)
scalefactors[sub_array.get_axis_num("Z")] = mdata.scale.ratio["zx_sf"]
# remove the last scaling factor in case of an RGB image
if "A" in sub_array.dims:
# remove the A axis from the scaling factors
scalefactors.pop(sub_array.get_axis_num("A"))
# get colors and channel name
chname = mdata.channelinfo.names[ch]
# inside the CZI metadata_tools colors are defined as ARGB hexstring
rgb = "#" + mdata.channelinfo.colors[ch][3:]
ncmap = Colormap(["#000000", rgb], name="cm_" + chname)
# add the channel to the viewer
viewer.add_image(
sub_array,
name=chname,
colormap=ncmap,
blending="additive",
scale=scalefactors,
gamma=0.85,
)
# set the axis labels based on the dimensions
viewer.dims.axis_labels = sub_array.dims
napari.run()
The basic usage can be inferred from this sample notebook:
The basic usage can be inferred from this sample notebook:
The basic usage can be inferred from this sample notebook:
The basic usage can be inferred from this sample notebook:
The basic usage can be inferred from this sample notebook:
The basic usage can be inferred from this sample notebook:
The code to read multi-dimensional with delayed reading using Dask array was heavily inspired by input from: Pradeep Rajasekhar.
Local installation:
pip install -e .
Local installation (full functionality):
pip install -e ".[all]"