# Top 5 Types of thresholding techniques in Python using OpenCV – 2023 In today’s blog, we are going to perform one of the most important operations of image processing which is thresholding. So without any further due, let’s do it…

## Step 1 – Import the libraries required for thresholding.

```import cv2
import matplotlib.pyplot as plt```

## Step 2 – Read the grayscale image.

`img = cv2.imread('gray21.512.tiff')`

## Step 3 – Let’s instantiate some values.

```th = 127
max_val = 255```
• Here we have set our threshold value to 127.
• Also, we have set our max value to 255.

## Step 4 – Performing the thresholding operation using the following 5 methods.

```ret, o1 = cv2.threshold(img, th, max_val, cv2.THRESH_BINARY)
ret, o2 = cv2.threshold(img, th, max_val, cv2.THRESH_BINARY_INV)
ret, o3 = cv2.threshold(img, th, max_val, cv2.THRESH_TOZERO)
ret, o4 = cv2.threshold(img, th, max_val, cv2.THRESH_TOZERO_INV)
ret, o5 = cv2.threshold(img, th, max_val, cv2.THRESH_TRUNC)```
• cv2.threshold() returns 2 values, first is the return value(True or False) and second is the output image.
• cv2.THRESH_BINARY method gives the max value as soon as the value crosses the threshold.
• cv2.THRESH_BINARY_INV method gives max value till it does not crosses the threshold.
• cv2.THRESH_TOZERO method gives a 0 value till it does not crosses the threshold.
• cv2.THRESH_TOZERO_INV method gives 0 as it crosses the threshold.
• cv2.THRESH_TRUNC method gives a threshold value as it crosses the threshold.

NOTE – Refer to the resulting image below for further understanding.

## Step 5 – Plot the results.

```output = [img, o1, o2, o3, o4, o5]

titles = ['Original', 'Binary', 'Binary Inv', 'Zero', 'Zero Inv', 'Trunc']

for i in range(6):
plt.subplot(2, 3, i + 1)
plt.imshow(output[i])
plt.title(titles[i])
plt.xticks([])
plt.yticks([])

plt.show()```

NOTE – Thresholding can be further optimized by using OTSU Thresholding.

```ret, o1 = cv2.threshold(img, 0, max_val, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
ret, o2 = cv2.threshold(img, 0, max_val, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
ret, o3 = cv2.threshold(img, 0, max_val, cv2.THRESH_TOZERO+cv2.THRESH_OTSU)
ret, o4 = cv2.threshold(img, 0, max_val, cv2.THRESH_TOZERO_INV+cv2.THRESH_OTSU)
ret, o5 = cv2.threshold(img, 0, max_val, cv2.THRESH_TRUNC+cv2.THRESH_OTSU)```
• Simply just add a cv2.THRESH_OTSU as a flag as shown above to implement it.
• The main advantage that we have with OTSU is that in this method we don’t need to specify the threshold value (just specify 0 there) like in previous methods(without the OTSU method), it determines it automatically.

## Let’s see the whole code…

```import cv2
import matplotlib.pyplot as plt

th = 127
max_val = 255

# give max value as soon as value crosses threshold
ret, o1 = cv2.threshold(img, th, max_val, cv2.THRESH_BINARY)
# give max value till it does not crosses threshold
ret, o2 = cv2.threshold(img, th, max_val, cv2.THRESH_BINARY_INV)
# give 0 value till it does not crosses threshold
ret, o3 = cv2.threshold(img, th, max_val, cv2.THRESH_TOZERO)
# give 0 as it crosses threshold
ret, o4 = cv2.threshold(img, th, max_val, cv2.THRESH_TOZERO_INV)
# give threshold value as it crosses threshold
ret, o5 = cv2.threshold(img, th, max_val, cv2.THRESH_TRUNC)

output = [img, o1, o2, o3, o4, o5]

titles = ['Original', 'Binary', 'Binary Inv',
'Zero', 'Zero Inv', 'Trunc']

for i in range(6):
plt.subplot(2, 3, i + 1)
plt.imshow(output[i])
plt.title(titles[i])
plt.xticks([])
plt.yticks([])

plt.show()
```