Adaptive thresholding calculate different threshold values for different regions within the image.
There are two approaches in adaptive thresholding.
a. Mean based adaptive thresholding: This approach calculates the threshold value for each pixel as the mean pixel value in the neighbourhood, minus a constant value.
b. Gaussian-weighted adaptive thresholding: This approach is similar to mean-based adaptive thresholding, but it uses a Gaussian weighted average of the pixel values in the neighbourhood to calculate the threshold value.
Following are the steps involved in Adaptive thresholding.
1. Image pre-processing: Convert the image to grayscale, blur the image or both.
2. Select the adaptive thresholding algorithm: Choose tone of the algorithm (mean-based or Gaussian-weighted).
3. Choose neighbourhood size: neighbourhood size determines how many pixels are used to calculate the threshold value for each pixel.
4. Calculate the threshold value for each pixel: By applying the adaptive thresholding algorithm to the neighbourhood of each pixel, we can get the pixel threshold value.
5. Threshold the image
How to apply adaptive thresholding in OpenCV?
Using cv2.adaptiveThreshold method, we can apply adaptive thresholding.
Signature
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, c[, dst])
Following table summarizes the parameters of adaptiveThreshold method.
Parameter |
Description |
src |
Source image on which we want to apply adaptive thresholding. |
maxValue |
The maximum pixel value that can be assigned to a pixel based on the thresholding result. It is set to 255 for binary images. |
adaptiveMethod |
Specifies the algorithm used to calculate the adaptive threshold for each pixel in the image.
cv2.ADAPTIVE_THRESH_MEAN_C, cv2.ADAPTIVE_THRESH_GAUSSIAN_C |
thresholdType |
Specifies type of thresholding.
a. cv2.THRESH_BINARY: All pixel values above the calculated threshold are set to maxValue, and all pixel values below the threshold are set to 0. b. cv2.THRESH_BINARY_INV: The inverse of the cv2.THRESH_BINARY operation is applied. Pixel values above the threshold are set to 0, and those below the threshold are set to maxValue. |
blockSize |
Size of local neighborhood. In general it is an odd integer like 3, 5, 6 |
c |
Constant value that is subtracted from mean pixel value |
dst |
It is optional parameter, specifies where the threshold result will be stored. |
Example
adaptive_mean_thresholded_image = cv.adaptiveThreshold(grayed_image, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 7, 2)
Find the below working application.
adaptive_thresholding.py
import cv2 as cv
image = cv.imread('wolfs.jpeg')
grayed_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
adaptive_mean_thresholded_image = cv.adaptiveThreshold(grayed_image, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 7, 2)
adaptive_gaussian_thresholded_image = cv.adaptiveThreshold(grayed_image, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 7, 2)
adaptive_mean_thresholded_inverse_image = cv.adaptiveThreshold(grayed_image, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY_INV, 7, 2)
adaptive_gaussian_thresholded_inverse_image = cv.adaptiveThreshold(grayed_image, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 7, 2)
cv.imshow('Wolfs', image)
cv.imshow('grayed_image', grayed_image)
cv.imshow('adaptive_mean_thresholded_image', adaptive_mean_thresholded_image)
cv.imshow('adaptive_gaussian_thresholded_image', adaptive_gaussian_thresholded_image)
cv.imshow('adaptive_mean_thresholded_inverse_image', adaptive_mean_thresholded_inverse_image)
cv.imshow('adaptive_gaussian_thresholded_inverse_image', adaptive_gaussian_thresholded_inverse_image)
# Wait for Infinite amount of time for a keyboard key to be pressed
cv.waitKey(0)
# Close the OpenCV windows
cv.destroyAllWindows()
Output
Original image
grayed_image
adaptive_mean_thresholded_image
adaptive_gaussian_thresholded_image
adaptive_mean_thresholded_inverse_image
adaptive_gaussian_thresholded_inverse_image
No comments:
Post a Comment