Tutorial: Thresholding and Morphology
Tutorial: Thresholding and Morphology
Deep Learning Image Processing. Updated. 2024.3
I. Introduction
In this tutorial, we will learn how to apply thresholding and morphology algorithms to segment objects from the background. Thresholding is a powerful tool to segment object images into regions or from the background based on the image intensity values. After applying thresholding methods, morphology methods are usually applied for post-processing such as pruning unwanted spikes, filling holes, and connecting broken pieces. Also, you will learn how to draw and analyze the histogram of a digital image to determine the contrast of the image intensity and use this information to balance the contrast and determine an optimal value for the thresholding.
II. Tutorial
Part 1. Binary Thresholding
This tutorial shows how to create a simple code to apply the OpenCV function for local thresholding.
Thresholding: OpenCV
First, read the OpenCV documentation

Sample code
int threshold_value = 0;
int threshold_type = 3;
int morphology_type = 0;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;
Mat src, src_gray, dst, dst_morph;
src = imread("coin.jpg", 1);
/* threshold_type
0: Binary
1: Binary Inverted
2: Threshold Truncated
3: Threshold to Zero
4: Threshold to Zero Inverted*/
threshold(src, dst, threshold_value, max_BINARY_value, threshold_type);
Example 1-1. Select the local threshold value manually.
Download the example code and test images.
Run the code on all test images.
Apply different values of thresholding for each images and find the best threshold values.
Example 1-2. Otsu Threshold
Modify the program to include ‘Otsu method’.
Read this documentation for THRESH_OTSU
Apply on each test image and compare the results with global thresholding output.
Example 1-3. Plot Histogram
Calculate and Plot the histogram for each image in gray-scale and analyze if a clear threshold value exists in a histogram.
Read this documentation for calculating histogram
calcHist()
void cv::calcHist ( const Mat * images,
int nimages,
const int * channels,
InputArray mask,
OutputArray hist,
int dims,
const int * histSize,
const float ** ranges,
bool uniform = true,
bool accumulate = false
)
# Python:
hist=cv.calcHist( images, channels, mask, histSize, ranges[, hist[, accumulate]] )
For plotting histogram, you may use the following function.
void plotHist(Mat src, string plotname, int width, int height) {
/// Compute the histograms
Mat hist;
/// Establish the number of bins (for uchar Mat type)
int histSize = 256;
/// Set the ranges (for uchar Mat type)
float range[] = { 0, 256 };
const float* histRange = { range };
calcHist(&src, 1, 0, Mat(), hist, 1, &histSize, &histRange);
double min_val, max_val;
cv::minMaxLoc(hist, &min_val, &max_val);
Mat hist_normed = hist * height / max_val;
float bin_w = (float)width / histSize;
Mat histImage(height, width, CV_8UC1, Scalar(0));
for (int i = 0; i < histSize - 1; i++) {
line(histImage,
Point((int)(bin_w * i), height - cvRound(hist_normed.at<float>(i, 0))),
Point((int)(bin_w * (i + 1)), height - cvRound(hist_normed.at<float>(i + 1, 0))),
Scalar(255), 2, 8, 0);
}
imshow(plotname, histImage);
}
See here for full example codes
Example 1: Histogram of GrayScale Image File
Example 2: Histogram of Color Image File
Example 3: Histogram of Webcam Image
Example 1-4. Local Threshold
Apply ‘Local Adaptive Thresholding’ on the following images. Compare the results of the global thresholding.

Refer to adaptiveThreshold()
documentation
//adaptiveThreshold()
void cv::adaptiveThreshold ( InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C
)
#Python:
dst=cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
Sample code
void cv::adaptiveThreshold (
InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C
)
adaptiveThreshold(src, dst, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY,3, 11);
Part 2. Morphology
Morphology: OpenCV
First, read the OpenCV documentation on morphology.
Sample code
// Structuring Element
int shape = MORPH_RECT; // MORPH_CROSS, MORPH_ELLIPSE
Mat element = getStructuringElement( shape, Size(M, N) )
// Apply a morphology operation
dilate( src, dst_morph, element);
erode ( src, dst_morph, element);
Example 2-1. Morphology selection with trackbar
Download the example code
Apply several morphology to obtain clear segmentation of the object in given images, after Thresholding.
Exercise
Exercise 1
Create a new C++ project in Visual Studio Community
Project Name:
DLIP_Tutorial_Thresholding
Project Folder:
C:\Users\yourID\source\repos\DLIP\Tutorial\
Source File:
DLIP_Tutorial_Thresholding.cpp
Analyze Histogram and apply Thresholding methods on given images.
Find the optimal threshold method and value for the object segmentation.
Show the results to TA before proceeding to Exercise 2.
Exercise 2
Apply Morphology methods after threshold on all test images.
Analyze which morphology methods works best for each images for object segmentation.
Show the results to TA before finishing this tutorial.
Last updated
Was this helpful?