Visualización interactiva de imágenes con napari#

napari es un visor de imágenes basado en Python. Hoy, lo usaremos controlándolo remotamente desde un cuaderno jupyter.

Ver también

Para abrir una imagen, seguimos usando scikit-image:

import napari

from skimage.io import imread

image = imread('../../data/Haase_MRT_tfl3d1.tif')

# print out the spatial dimensions of the image
print(image.shape)
(192, 256, 256)
# Create an empty viewer
viewer = napari.Viewer()
# Add a new layer containing an image
viewer.add_image(image)
<Image layer 'image' at 0x1d5a7bb9af0>

Con este comando, podemos hacer una captura de pantalla de napari y guardarla en nuestro cuaderno.

napari.utils.nbscreenshot(viewer)

Corte#

Podemos mover programáticamente el deslizador de corte Z de esta manera.

dims = viewer.dims.current_step
dims
(96, 128, 128)
# modify Z-slice position
dims = list(dims)
dims[0] = 60
viewer.dims.current_step = dims

# take another screenshot
napari.utils.nbscreenshot(viewer)

Renderizado 3D#

También podemos activar la vista 3D programáticamente.

viewer.dims.ndisplay = 3

napari.utils.nbscreenshot(viewer)

Orientación de la cámara#

Para cambiar la posición de la cámara, se recomienda imprimir la cámara, por ejemplo, después de hacer una modificación manualmente. Esto te permite entender qué significan center, zoom, angles, etc. Luego puedes modificar estos parámetros usando Python.

viewer.camera
Camera(center=(95.5, 127.5, 127.5), zoom=2.2191406249999996, angles=(0.0, 0.0, 90.00000000000001), perspective=0.0, interactive=True)
viewer.camera.angles = (15, -15, 90)

napari.utils.nbscreenshot(viewer)
viewer.camera.zoom = 1

napari.utils.nbscreenshot(viewer)
viewer.dims.ndisplay = 2

dims[0] = 96
viewer.dims.current_step = dims

Propiedades de la capa#

Para modificar mapas de colores / tablas de búsqueda y rango de visualización de imágenes, puedes llamar a comandos como estos.

image_layer = viewer.layers[0]

image_layer.colormap = "jet"

napari.utils.nbscreenshot(viewer)
image_layer.contrast_limits = [0, 500]

napari.utils.nbscreenshot(viewer)
image_layer.colormap = 'gray'

Visualización de resultados de segmentación#

Los resultados de segmentación se muestran típicamente como imágenes de etiquetas en Napari. En una imagen de etiquetas, las intensidades corresponden al objeto (clase) al que pertenece un píxel. Por ejemplo, en una segmentación semántica, un píxel con intensidad 1 pertenece a la categoría 1 y un píxel con intensidad 2 pertenece a la categoría 2. Al hacer segmentación de instancias, un píxel con intensidad 1 pertenece al objeto 1. Un píxel con intensidad 2 pertenece al objeto 2.

Las imágenes de etiquetas se pueden poner en la lista de capas de Napari usando el comando viewer.add_labels().

label_image = (image > 50) * 1 + (image > 110) * 2

labels_layer = viewer.add_labels(label_image)

napari.utils.nbscreenshot(viewer)

Las capas de etiquetas también se pueden modificar en consecuencia.

labels_layer.opacity = 0.3

napari.utils.nbscreenshot(viewer)
labels_layer.visible = False

napari.utils.nbscreenshot(viewer)

Eliminación de capas#

Por último, pero no menos importante, también podemos limpiar y eliminar capas.

for l in list(viewer.layers):
    viewer.layers.remove(l)
    
napari.utils.nbscreenshot(viewer)

Ejercicio#

Inicia un nuevo cuaderno, importa napari, carga la imagen ../data/hela-cells.tif y agrega sus tres canales independientemente a napari como tres capas. Después, juega con el mapa de colores y la fusión en la interfaz de usuario. ¿Puedes hacer que se vea similar a ImageJ? También revisa el tutorial de capa de imagen de napari. ¿Puedes también programar tal visualización?