Source code for megafish.napari

import dask.config
import napari
from functools import partial
import pandas as pd
import zarr
import dask.array as da
dask.config.set(scheduler='threads')


[docs] def tile_2d(zarr_path, groups, pitch, colors, limits): """ Visualizes 2D tiled image data from a Zarr dataset using napari. Args: zarr_path (str): Path to the Zarr file containing the image data. groups (list of str): List of Zarr group names to be visualized. pitch (tuple of float): Physical size of each pixel in micrometers (y, x). colors (list of str): List of colormap names for each image channel. limits (list of tuple): Contrast limits for each image channel in the format [(min, max), ...]. Returns: None. The function opens a napari viewer displaying the images. """ zr = zarr.open(zarr_path, mode='r') # Load each channel data from the specified groups channels = [] for group in groups: channels.append(zr[group + "/0/data"]) # Initialize napari viewer viewer = napari.Viewer() for channel, group, color, limits in zip(channels, groups, colors, limits): # Add each channel to the viewer with specified settings viewer.add_image(channel, name=group, colormap=color, blending="additive", contrast_limits=limits, scale=pitch) # Configure the viewer's scale bar and labels viewer.scale_bar.visible = True viewer.scale_bar.unit = "um" viewer.scale_bar.font_size = 18 viewer.dims.axis_labels = ["cycle", "tile_y", "tile_x", "", ""] napari.run(max_loop_level=2)
[docs] def registered(zarr_path, pitch, max_level, groups, colors, limits, genename_path=None): """ Visualizes multiscale registered image data from a Zarr dataset using napari, with optional gene name display. Args: zarr_path (str): Path to the Zarr file containing the image data. pitch (tuple of float): Physical size of each pixel in micrometers (y, x). max_level (int): Maximum pyramid level to load for each group. groups (list of str): List of Zarr group names containing the image data to be visualized. colors (list of str): List of colormap names for each image channel. limits (list of tuple): Contrast limits for each image channel in the format [(min, max), ...]. genename_path (str, optional): Path to a CSV file containing gene names for each cycle. If provided, gene names will be displayed based on the current cycle slider value. Returns: None. The function opens a napari viewer displaying the images with multiscale support and optional annotations. """ # Load multiscale channels from the Zarr groups channels = [] for group in groups: channels.append( [da.from_zarr(zarr_path, component=group + "/" + str(i) + "/data") for i in range(max_level + 1)]) # Load gene names from the CSV file if provided if genename_path is not None: df = pd.read_csv(genename_path) # Update text overlay based on the current cycle in the viewer def update_slider(event, df): cycle = viewer.dims.current_step[0] row = df.iloc[cycle].values.tolist() txt = "" for i, r in enumerate(row[1:]): txt += "ch" + str(i + 1) + ": " + str(r) + "\n" viewer.text_overlay.text = txt viewer.text_overlay.font_size = 18 viewer.text_overlay.position = "top_left" viewer.text_overlay.color = 'white' update_slider_partial = partial(update_slider, df=df) # Initialize napari viewer viewer = napari.Viewer() for channel, group, color, limits in zip(channels, groups, colors, limits): # Add each channel with multiscale and specified settings viewer.add_image(channel, name=group, colormap=color, blending="additive", contrast_limits=limits, scale=pitch, multiscale=True) # Configure the scale bar and gene name overlay (if applicable) viewer.scale_bar.visible = True viewer.scale_bar.unit = "um" viewer.scale_bar.font_size = 18 if genename_path is not None: viewer.dims.events.current_step.connect(update_slider_partial) viewer.text_overlay.visible = True viewer.dims.axis_labels = ["cycle", "", ""] napari.run(max_loop_level=2)
[docs] def registered_is(zarr_path, pitch, max_level, groups, colors, limits, genename_path=None): """ Visualizes registered image data with image stitching from a Zarr dataset using napari, with optional gene name display. Args: zarr_path (str): Path to the Zarr file containing the image data. pitch (tuple of float): Physical size of each pixel in micrometers (y, x). max_level (int): Maximum pyramid level to load for each group. groups (list of str): List of Zarr group names containing the image data to be visualized. colors (list of str): List of colormap names for each image channel. limits (list of tuple): Contrast limits for each image channel in the format [(min, max), ...]. genename_path (str, optional): Path to a CSV file containing gene names for each cycle. If provided, gene names will be displayed based on the current cycle slider value. Returns: None. The function opens a napari viewer displaying the images with multiscale support and optional annotations. Notes: - The function supports multiscale image data and displays different channels with specified settings. - If a gene name file is provided, gene names will update based on the current cycle index in the viewer. """ # Load multiscale channels from the Zarr groups channels = [] for group in groups: channels.append( [da.from_zarr(zarr_path, component=group + "/" + str(i) + "/data") for i in range(max_level + 1)]) # Load gene names from the CSV file if provided if genename_path is not None: df = pd.read_csv(genename_path) # Update text overlay based on the current cycle in the viewer def update_slider(event, df): cycle = viewer.dims.current_step[0] row = df.iloc[cycle * 2].values.tolist() txt = "" for i, r in enumerate(row[1:]): txt += "ch" + str(i + 1) + ": " + str(r) + "\n" viewer.text_overlay.text = txt viewer.text_overlay.font_size = 18 viewer.text_overlay.position = "top_left" viewer.text_overlay.color = 'white' update_slider_partial = partial(update_slider, df=df) # Initialize napari viewer viewer = napari.Viewer() for channel, group, color, limits in zip(channels, groups, colors, limits): # Add each channel with multiscale and specified settings viewer.add_image(channel, name=group, colormap=color, blending="additive", contrast_limits=limits, scale=pitch, multiscale=True) # Configure the scale bar and gene name overlay (if applicable) viewer.scale_bar.visible = True viewer.scale_bar.unit = "um" viewer.scale_bar.font_size = 18 if genename_path is not None: viewer.dims.events.current_step.connect(update_slider_partial) viewer.text_overlay.visible = True viewer.dims.axis_labels = ["cycle", "", ""] napari.run(max_loop_level=2)
[docs] def segment(zarr_path, pitch, max_level, groups, colors, limits): """ Visualizes segmented and labeled image data from a Zarr dataset using napari, with support for multiscale images. Args: zarr_path (str): Path to the Zarr file containing the image data. pitch (tuple of float): Physical size of each pixel in micrometers (y, x). max_level (int): Maximum pyramid level to load for each group. groups (list of str): List of Zarr group names containing the image data to be visualized. colors (list of str): List of colormap names for each image channel. Use "label" for segmented data. limits (list of tuple): Contrast limits for each image channel in the format [(min, max), ...]. Returns: None. The function opens a napari viewer displaying the images with multiscale support. """ # Load multiscale channels from the Zarr groups channels = [] for group in groups: channels.append( [da.from_zarr(zarr_path, component=group + "/" + str(i) + "/data") for i in range(max_level + 1)]) # Initialize napari viewer viewer = napari.Viewer() for channel, group, color, limits in zip(channels, groups, colors, limits): if color == "label": # Add segmented data as labels viewer.add_labels(channel, name=group, scale=pitch, multiscale=True, opacity=0.5) else: # Add regular image channels viewer.add_image(channel, name=group, colormap=color, blending="additive", contrast_limits=limits, scale=pitch, multiscale=True) # Configure the scale bar then run the viewer viewer.scale_bar.visible = True viewer.scale_bar.unit = "um" viewer.scale_bar.font_size = 18 napari.run(max_loop_level=2)