Using histogram, we can visualize the distribution on pixel intensities in an image.
Using cv2.calcHist method, we can compute histogram from an image or specific portion of the image.
Why histogram needed?
Using histogram, we can visualize the distribution on pixel intensities in an image.
Signature
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
Following table summarizes the parameters of calcHist method.
Parameter |
Description |
images |
It is a list of source images from which you want to calculate the histogram. |
channels |
Specifies which color channels of image you want to consider while calculating histogram.
For a grayscale image, it is set to [0].
For a BGR image, you can specify [0], [1], or [2] for the blue, green, and red channels. |
mask |
It is used to calculate histogram for specific region in the image. This is set to None, if you want to calculate histogram for entire image. |
histSize |
Specifies number of bins in the histogram. |
ranges |
Specify range of pixel values in each channel.
For grayscale images, it is usually [0, 256] to cover the full range of pixel values.
For color images, you might use [0, 256] for each channel. |
hist |
This is optional, specifies an output parameter where the calculated histogram is stored |
accumulate |
This is optional parameter. If set to True, the histogram is not cleared in the beginning but is accumulated. This can be useful when you want to calculate histograms for multiple images and accumulate them. |
Example
image = cv.imread('sea_animals.jpeg')
grayscale_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
gray_histogram = cv.calcHist([grayscale_image], [0], None, [256], [0, 256])
Above snippet calculate the histogram for a grayscale image.
Original image
Find the below working application.
gray_scale_image_histogram.py
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread('sea_animals.jpeg')
grayscale_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow('Image', image)
cv.imshow('grayscale_image', grayscale_image)
# Compute grayscale histogram
gray_histogram = cv.calcHist([grayscale_image], [0], None, [256], [0, 256])
plt.title('Histogram for Grayscaled imaged')
plt.xlabel('bins')
plt.ylabel('Number of Pixels')
plt.xlim([0, 256])
plt.plot(gray_histogram)
plt.show()
cv.waitKey(0)
# Close the OpenCV windows
cv.destroyAllWindows()
Output
Gray scale image
Histogram
Let’s create a histogram for specific portion using mask parameter.
Create a mask and use it while calculation histogram.
blank_image = np.zeros(image.shape[:2], dtype='uint8')
mask = cv.rectangle(blank_image, (50, 50), (350, 350), color=255, thickness=-1)
# Compute grayscale histogram
gray_histogram = cv.calcHist([grayscale_image], [0], mask, [256], [0, 256])
Find the below working application.
gray_scale_specific_region_histogram.py
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
image = cv.imread('sea_animals.jpeg')
grayscale_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
blank_image = np.zeros(image.shape[:2], dtype='uint8')
mask = cv.rectangle(blank_image, (50, 50), (350, 350), color=255, thickness=-1)
# Compute grayscale histogram
gray_histogram = cv.calcHist([grayscale_image], [0], mask, [256], [0, 256])
cv.imshow('Image', image)
cv.imshow('grayscale_image', grayscale_image)
cv.imshow('mask', mask)
plt.title('Histogram for Grayscaled imaged')
plt.xlabel('bins')
plt.ylabel('Number of Pixels')
plt.xlim([0, 256])
plt.plot(gray_histogram)
plt.show()
cv.waitKey(0)
# Close the OpenCV windows
cv.destroyAllWindows()
Output
No comments:
Post a Comment