Exercise: Thresholding#

In this exercise, we will try out different threshold methods and see how they perform on the same data and create a label image from the binarized image data.

Recap#

Segmentation is the process of separating single pixels into different categories that may or may not have specific meaning attached to that. Thresholding is a simple, yet often effecte segmentation technique. In thresholding, pixels are separated into two categories - the background and the foreground of an image - by comparing the intensities of each image to a single value, the threshold value. Finding a “good” threshold value is therefore of key importance.

The output of a thresholding operation is a binary image, consiting of 0s and 1s - which is equivalent to True and False in terms of boolean values.

Vocabulary: Thresholding is a type of segmentation. Separating the image into two types of pixels (background and foreground) is a type of semantic segmentation, and is - since only two types of pixels exist in the output - referred to as a binarization operation.

How to code: Remember - in Python you can compare objects (single numbers or images) to threshold values simply by using the < or > operator - make sure to put the output into a new variable!

from skimage import data, filters, measure
import matplotlib.pyplot as plt
import napari
image = data.human_mitosis()
plt.imshow(image, cmap='gray')
<matplotlib.image.AxesImage at 0x232307465e0>
../_images/df007ddcdd17745d8931d661ab16ef96eef0f8da965400bd8a8c62cb9bd8dd11.png

Now, apply several of the thresholds from skimage to the image data! Choose one that you think is suitable. Hint: You can find them under filters.threshold_... - use the tab key or the documentation to find out how to use the implemented threshold functions.

binary_image = # code goes here

Again, use plt.imshow() to visualize the results

# Code goes here

Now we would like to perform connected-component analysis. Use the appropriate function from skimage (measure.label()) for this task!

label_image = # code goes here

Visualization in Napari#

viewer = napari.Viewer()
WARNING: DirectWrite: CreateFontFaceFromHDC() failed (Indicates an error in an input file such as a font file.) for QFontDef(Family="8514oem", pointsize=12, pixelsize=20, styleHint=5, weight=50, stretch=100, hintingPreference=0) LOGFONT("8514oem", lfWidth=0, lfHeight=-20) dpi=240

Use the add_image() and the add_labels() function to add image, binary_image and label_image to the viewer and create screenshot of the viewer with the napari.utils.nbscreenshot() function.

# Code goes here