Note
Go to the end to download the full example as a Python script or as a Jupyter notebook.
Glasbey colormap#
A long-requested feature [1] for napari was to display labels/segmentation layers using a well-known discrete colormap such as Glasbey [2].
In this example, we demonstrate displaying segmentations using custom colormaps with the help of the glasbey Python library [3], which you can install with your favorite Python package manager, such as pip or conda. We display a segmentation using the napari built-in labels colormap, the original Glasbey colormap, a more modern version produced by limiting the lightness and chroma and optimizing for colorblind-safety, and finally with the matplotlib tab10 colormap.
import glasbey
import numpy as np
from skimage import data
from skimage.filters import threshold_otsu
from skimage.measure import label
from skimage.morphology import closing, remove_small_objects
from skimage.segmentation import clear_border
import napari
image = data.coins()[50:-50, 50:-50]
First, we segment the image.
# apply threshold
thresh = threshold_otsu(image)
bw = closing(image > thresh, footprint=np.ones((4, 4), dtype=bool))
# remove artifacts connected to image border
cleared = remove_small_objects(clear_border(bw), 20)
# label image regions
label_image = label(cleared).astype("uint8")
Then, we create two color palettes using the glasbey library. One with the original glasbey parameters and 256 colors, and a more modern one with better lightness and chroma bounds for a less glary look.
# original glasbey
glas = glasbey.create_palette(256)
# more optimized glasbey
glas19mid = glasbey.create_palette(
19,
lightness_bounds=(20, 60), chroma_bounds=(40, 50),
colorblind_safe=True,
)
Finally, we display the coins image and the overlaid segmentation. We do this in two viewers to show both colormaps.
viewer, image_layer = napari.imshow(image, name='coins')
# add the labels
label_layer_glas = viewer.add_labels(
label_image, name='segmentation', colormap=glas
)
viewer2, image_layer2 = napari.imshow(image, name='coins')
label_layer_modern = viewer2.add_labels(
label_image, name='segmentation-glasbey-19-mid-chroma', colormap=glas19mid,
)
if __name__ == '__main__':
napari.run()