Recadrage interactif avec napari#
Lors du recadrage de données tridimensionnelles, il peut être judicieux de le faire de manière interactive, par exemple en utilisant napari. Pour faciliter le script, nous utilisons un plugin napari appelé napari-crop.
Voir aussi
import napari
from napari.utils import nbscreenshot
from skimage.io import imread
from magicgui import magicgui
# The following is a private function. The interface
# may be changed in the future. If you copy that code
# it breaks at some point, please come back to this
# notebook and check how to update your code.
from napari_crop._function import crop_region
Nous commençons par charger un ensemble de données et le montrer dans napari.
# Start a napari viewer
viewer = napari.Viewer()
# open an image and store it in a layer
image_layer = viewer.open("../../data/Haase_MRT_tfl3d1.tif")
# select a center plane for viewing
viewer.dims.current_step = [100, 0, 0]
# show napari window as screenshot in the notebook
nbscreenshot(viewer)
C:\Users\rober\Anaconda3\envs\bio_39\lib\site-packages\napari\plugins\_plugin_manager.py:494: UserWarning: Plugin 'napari-accelerated-pixel-and-object-classification' provided a non-callable type to `napari_experimental_provide_function`: <class 'magicgui._magicgui.MagicFactory'>. Function widget ignored.
warn(message=warn_message)
Ensuite, nous plaçons une forme circulaire dans une nouvelle couche de formes dans le visualiseur.
def make_circle(circle_center_x, circle_center_y, circle_radius):
"""Helper function to create circles"""
current_z_slice = viewer.dims.current_step[0]
return [[current_z_slice, circle_center_y - circle_radius, circle_center_x - circle_radius],
[current_z_slice, circle_center_y - circle_radius, circle_center_x + circle_radius],
[current_z_slice, circle_center_y + circle_radius, circle_center_x - circle_radius],
[current_z_slice, circle_center_y + circle_radius, circle_center_x + circle_radius]]
elipses = make_circle(80, 100, 50)
# add shapes to viewer
shapes_layer = viewer.add_shapes(elipses, shape_type='ellipse', edge_width=2)
nbscreenshot(viewer)
Ensuite, nous attachons une interface utilisateur graphique (GUI) pour recadrer une région.
# make a graphical user interface
crop_gui = magicgui(crop_region)
# attach it to the viewer window
viewer.window.add_dock_widget(crop_gui)
nbscreenshot(viewer)
Après avoir attaché l’interface graphique, nous pouvons également cliquer sur le bouton Run et recadrer une région comme ceci :
crop_gui()
nbscreenshot(viewer)
Nous pouvons également repositionner le cercle et recadrer à nouveau.
# reposition the selected circle
elipses = make_circle(120, 150, 50)
shapes_layer.data = elipses
# duplicate last cropped layer, because cropping again would overwrite it
viewer.add_image(viewer.layers[2].data)
# crop again
crop_gui()
# crop one more circle
shapes_layer.data = make_circle(170, 150, 50)
viewer.add_image(viewer.layers[2].data)
crop_gui()
nbscreenshot(viewer)
À la fin, nous supprimons les couches d’image et de formes et examinons les recadrages côte à côte.
# Remove the first two layers
viewer.layers.remove(viewer.layers[0])
viewer.layers.remove(viewer.layers[0])
# toggle grid view
viewer.grid.enabled = True
viewer.grid.stride = 1
nbscreenshot(viewer)