How to Perform Different Simple Thresholding of an Image Using Python OpenCV?
Image thresholding is a simple yet effective technique that is used in digital image processing to separate an object or a region from the background. OpenCV, the popular Computer Vision library, provides different thresholding techniques that can be used to convert grayscale images into binary images. This article will show you how to perform different simple thresholding of an image using Python OpenCV.
Prerequisites
Before starting with the project, you need to have Python installed on your computer. You can get it from the official website. Additionally, you need to install OpenCV and Matplotlib libraries. To install these libraries, open your terminal or command prompt and run the following commands.
pip install opencv-python
pip install matplotlib
Once you have installed the required libraries, you are ready to start.
Understanding Thresholding
Thresholding is a form of image segmentation, which is the process of dividing an image into multiple segments or regions. In thresholding, a grayscale image is converted into a binary image by defining a threshold value. Pixel values above this threshold are set to 255 (white), while pixel values below this threshold are set to 0 (black).
Simple Thresholding Techniques
OpenCV provides different thresholding techniques. In this article, we will discuss the following simple thresholding techniques:
- Binary Thresholding
- Inverse Binary Thresholding
- Adaptive Thresholding
- Otsu’s Thresholding
Binary Thresholding
Binary thresholding is the simplest form of thresholding. In binary thresholding, a threshold value is defined, and all pixel values above this threshold are set to 255 (white). All other pixel values are set to 0 (black). To perform binary thresholding using OpenCV, you can use the cv2.threshold
function.
The following code snippet demonstrates how to apply binary thresholding on an image.
import cv2
import matplotlib.pyplot as plt
# Read the image in grayscale
image = cv2.imread('image.jpg', 0)
# Apply binary thresholding
threshold_value = 128
max_value = 255
_, binary_image = cv2.threshold(image, threshold_value, max_value, cv2.THRESH_BINARY)
# Display the original and binary images
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(binary_image, cmap='gray')
plt.title('Binary Image'), plt.xticks([]), plt.yticks([])
plt.show()
In the code above, we first read an image in grayscale format using the cv2.imread
function. We then apply binary thresholding on the image using the cv2.threshold
function. The function takes four arguments:
image
: The input imagethreshold_value
: The threshold valuemax_value
: The maximum value to be assigned to pixel values higher than the threshold valuecv2.THRESH_BINARY
: The thresholding type to apply
The function returns two values: the threshold value used and the output binary image.
Finally, we display the original and thresholded images side by side using the plt.subplot
and plt.imshow
functions.
Inverse Binary Thresholding
Inverse binary thresholding works the same way as binary thresholding, except that the pixel values are inverted. All pixel values above the threshold value are set to 0 (black), while the pixel values below the threshold value are set to 255 (white). Inverse binary thresholding can be useful in situations where you want to highlight dark regions in an image.
To perform inverse binary thresholding using OpenCV, you can use the cv2.THRESH_BINARY_INV
flag instead of the cv2.THRESH_BINARY
flag in the cv2.threshold
function.
The following code demonstrates how to apply inverse binary thresholding on an image.
import cv2
import matplotlib.pyplot as plt
# Read the image in grayscale
image = cv2.imread('image.jpg', 0)
# Apply inverse binary thresholding
threshold_value = 128
max_value = 255
_, inverse_image = cv2.threshold(image, threshold_value, max_value, cv2.THRESH_BINARY_INV)
# Display the original and inverse binary images
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(inverse_image, cmap='gray')
plt.title('Inverse Binary Image'), plt.xticks([]), plt.yticks([])
plt.show()
In the code above, we read an image in grayscale format and apply inverse binary thresholding using the cv2.threshold
function with the cv2.THRESH_BINARY_INV
flag. We thendisplay the original and thresholded images side by side using the plt.subplot
and plt.imshow
functions.
Adaptive Thresholding
Simple thresholding techniques work well when the background and foreground of an image have similar lighting conditions. However, when the lighting conditions are not uniform across the image, adaptive thresholding can be more effective. In adaptive thresholding, the threshold value is calculated based on a local area of the image.
To perform adaptive thresholding using OpenCV, you can use the cv2.adaptiveThreshold
function. The function takes the following arguments:
image
: The input imagemax_value
: The maximum value to be assigned to pixel values higher than the threshold valueadaptive_method
: The adaptive thresholding method to use. This can be eithercv2.ADAPTIVE_THRESH_MEAN_C
orcv2.ADAPTIVE_THRESH_GAUSSIAN_C
.threshold_type
: The thresholding type to apply. This can becv2.THRESH_BINARY
orcv2.THRESH_BINARY_INV
.block_size
: The size of the local area used to calculate the threshold value. This should be an odd integer greater than1
.C
: A constant value subtracted from the mean or weighted mean calculated by the algorithm.
The following code demonstrates how to apply adaptive thresholding using OpenCV.
import cv2
import matplotlib.pyplot as plt
# Read the image
image = cv2.imread('image.jpg', 0)
# Apply adaptive thresholding
max_value = 255
adaptive_method = cv2.ADAPTIVE_THRESH_GAUSSIAN_C
threshold_type = cv2.THRESH_BINARY_INV
block_size = 11
C = 4
adaptive_image = cv2.adaptiveThreshold(image, max_value, adaptive_method, threshold_type, block_size, C)
# Display the original and adaptive thresholded images
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(adaptive_image, cmap='gray')
plt.title('Adaptive Thresholded Image'), plt.xticks([]), plt.yticks([])
plt.show()
In the code above, we read an image and apply adaptive thresholding using the cv2.adaptiveThreshold
function. We specify the cv2.ADAPTIVE_THRESH_GAUSSIAN_C
adaptive method and the cv2.THRESH_BINARY_INV
thresholding type. We use a block_size
of 11
and a constant C
of 4
.
Otsu’s Thresholding
Otsu’s thresholding is a method of automatically calculating the threshold value based on the histogram of the image. It works by maximizing the variance between the foreground and background of the image.
To perform Otsu’s thresholding using OpenCV, you can use the cv2.threshold
function with the cv2.THRESH_OTSU
flag. The function automatically calculates the threshold value based on the histogram of the image.
The following code demonstrates how to apply Otsu’s thresholding using OpenCV.
import cv2
import matplotlib.pyplot as plt
# Read the image in grayscale
image = cv2.imread('image.jpg', 0)
# Apply Otsu's thresholding
threshold_value, otsu_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Display the original and Otsu thresholded images
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(otsu_image, cmap='gray')
plt.title("Otsu's Thresholded Image"), plt.xticks([]), plt.yticks([])
plt.show()
In the code above, we read an image in grayscale format and apply Otsu’s thresholding using the cv2.threshold
function with the cv2.THRESH_OTSU
flag. The function automatically determines the threshold value based on the histogram of the image. We then display the original and thresholded images side by side using the plt.subplot
and plt.imshow
functions.
Conclusion
In conclusion, thresholding is a simple yet powerful technique used in image segmentation. In this article, we discussed several simple thresholding techniques that can be applied using Python OpenCV. We showed how to implement binary thresholding, inverse binary thresholding, adaptive thresholding, and Otsu’s thresholding using code examples. With this knowledge, you can apply different thresholding techniques to your own images and improve your image processing applications.