After completing this lesson, learners should be able to:
Describe the relationship between an intensity image and a derived binary image
Apply a threshold to segment an image into foreground and background regions
Motivation
One strategy to detect objects or specific regions in images is to first distinguish so-called background pixels,
which do not contain objects or interesting regions from foreground pixels, which mark the areas of interest.
This process is called two class semantic segmentation and is often referred to as image binarization.
The foreground regions can then be further processed, e.g. to detect objects or perform intensity measurements.
Concept map
graph TD
I("Image") --> T("Threshold")
T --> BI("Binary image / Binary mask")
BI --- BG("Background pixels (false, 0)")
BI --- FG("Foreground pixels (true, 1, 255)")
Figure
Image before and after binarization
Image thresholding
A common algorithm for binarization is thresholding. A threshold value t is chosen, either manually or automatically,
and all pixels with intensities below t are set to 0, whereas pixels with intensities >= t are set to the value for the foreground.
Depending on the software the foreground value can be different (e.g. 1 in MATLAB or 255 in ImageJ). At any pixel (x,y):
p_im(x,y) < t->p_bin(x,y) = 0
p_im(x,y) >= t->p_bin(x,y) = 1
where, p_im and p_bin are the intensity and binary images respectively.
It is also possible to define an interval of threshold values, i.e. a lower and upper threshold value. Pixels with intensity values
within this interval belong to the foreground and vice versa.
Repeat above applying a higher threshold so that only the high intensity level nucleus becomes foreground
ImageJ Macro
// Parametersthreshold1=49;threshold2=100;run("Close All");// Codeopen("https://github.com/NEUBIAS/training-resources/raw/master/image_data/xy_8bit__two_cells.tif");rename("input");// apply threshold 1selectWindow("input");run("Duplicate...","title=threshold1");setThreshold(threshold1,65535);setOption("BlackBackground",true);run("Convert to Mask");// apply threshold 2selectWindow("input");run("Duplicate...","title=threshold2");setThreshold(threshold2,65535);setOption("BlackBackground",true);run("Convert to Mask");
skimage napari
# Instantiate the napari viewer
importnapariviewer=napari.Viewer()# Read the intensity image
fromskimage.ioimportimreadimage=imread('https://github.com/NEUBIAS/training-resources/raw/master/image_data/xy_8bit__two_cells.tif')# View the intensity image
viewer.add_image(image)# Check the intensity image's datatype
print(image.dtype)# Inspect the intensity image values in order to identify a threshold
# that segments both cells
# napari GUI: hover with mouse, line profile
# Threshold the image
binary_image_two_cells=image>49# Overlay the binary image
viewer.add_image(binary_image_two_cells,opacity=0.8)# Inspect data type
print(binary_image_two_cells.dtype)# Inspect value content
importnumpyasnpprint(np.unique(binary_image_two_cells))# Apply a higher threshold
# to only select the brighter cell
binary_image_one_cell=image>100viewer.add_image(binary_image_one_cell,opacity=0.8)
%These matlab scripts illustrate separating the foreground from the
%background using a threshold value provided by the user
%Prompt user for a threshold value
thres_val = input('Enter a threshold value: ');
% Prompt user to choose an image, e.g. xy_8bit__two_cells.tif
[file, path] = uigetfile("*.tif");
%Read input image
in_image = imread(fullfile(path, file));
%display input image
figure; imagesc(in_image);
%Binarize input image with the threshold valuein_image
bin_image = uint8(in_image>= thres_val);
% Display binary image
figure; imagesc(bin_image);
#@ Integer (label="Lower threshold") thr1
#@ Integer (label="Upper threshold") thr2
fromijimportIJ,ImagePlusfromij.pluginimportThresholder# image is xy_8bit_PCNA.tif should be already open
inputImage=IJ.openImage("https://github.com/NEUBIAS/training-resources/raw/master/image_data/xy_8bit__PCNA.tif")IJ.setRawThreshold(inputImage,thr1,thr2,None)binaryImage=ImagePlus('Thresholded image',Thresholder.createMask(inputImage))binaryImage.show()
Assessment
Fill in the blanks
Pixels in a binary image can have maximally ___ different values.
If the threshold is larger than the maximal pixel value in the intensity image, all pixels in the binary image have a value of ___.
Solution
Pixels in a binary image can have maximally 2 different values.
If the threshold is larger than the maximal pixel value in the intensity image,
all pixels in the binary image have a value of 0.
True or False
There is only one correct threshold value in order to convert an intensity image into a binary image.
Binary images are always unsigned 8-bit where the foreground is 255.
Solution
There is only one correct threshold value in order to convert an intensity image into a binary image. False
Binary images are always unsigned 8-bit where the foreground is 255. False