Python OpenCV Histogram of Color Image
In this post, you will learn how to compute the histogram of a colour image using the OpenCV and the cv2.calcHist() function.
A histogram is a graphical representation of data. A histogram of an image represents how frequently various color values occur in the image or the distribution of pixel intensities in a colour or gray-scale image. The histogram plot shows the intensity distribution of an image. It is a plot with pixel values (ranging from 0 to 255, not always) in the X-axis and a corresponding number of pixels in the image on the Y-axis. It means the x-axis represents the different color values, which lie between 0 and 255, and the y-axis represents the number of times a particular intensity value occurs in the image.
Python OpenCV provides the cv2.calcHist() function to calculate the histogram of one or more arrays. We can use this function to calculate the histogram of both single channel images and multi-channel images. In this article, we have used a multi-channel image.
Syntax of calcHist()
cv2.calcHist(images, channels, mask, histSize, ranges)
images: It is the image source of type uint8 or float32 and given in a square bracket.
channels: It represents the index of the channel. It is also given in a square bracket. For grayscale images, its value is [0].
mask: It represents a mask image. To find the histogram of the full image, it is given as "None".
histSize: It represents the number of bins provided as a list.
ranges: It represents the range of intensity values.
Required Modules
These are the modules that we have used in this article to create histograms of a color image or multi-channel image.
- OpenCV (cv2)
- Numpy
- Matplotlib
Python color image histogram without Mask
Here is the code for calculating the histogram of a full multi-channel image. In this case, hist is a (256,1) array. Each value of the array corresponds to the number of pixels with the corresponding tone value.
In this example, the matplotlib library is used to plot the histograms. It provides the hist() function for plotting. The channel values [0], [1] and [2] represent blue, green, and red channels, respectively.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('nature.jpg')
# Calculate histogram without mask
hist1 = cv2.calcHist([img],[0],None,[256],[0,256])
hist2 = cv2.calcHist([img],[1],None,[256],[0,256])
hist3 = cv2.calcHist([img],[2],None,[256],[0,256])
plt.subplot(221), plt.imshow(img)
plt.subplot(222), plt.plot(hist1), plt.plot(hist2),plt.plot(hist3)
plt.xlim([0,256])
plt.show()
The above code returns output something like this-
Python color image histogram with mask
First, you should know, "What is the mask?" The mask consists of a black image with the same dimensions as the loaded image and some white regions corresponding to the image where we want to calculate the histogram. Here is the complete code to draw a histogram of the image with a mask. In this example, it will be very clear for you to draw a histogram of a multi-channel image with and without the mask.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('nature.jpg')
# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)
# Calculate histogram without mask
hist1 = cv2.calcHist([masked_img],[0],mask,[256],[0,256])
hist2 = cv2.calcHist([masked_img],[1],mask,[256],[0,256])
hist3 = cv2.calcHist([masked_img],[2],mask,[256],[0,256])
plt.subplot(221), plt.imshow(img)
plt.subplot(222), plt.imshow(mask)
plt.subplot(223), plt.imshow(masked_img)
plt.subplot(224), plt.plot(hist1), plt.plot(hist2),plt.plot(hist3)
plt.xlim([0,256])
plt.show()
The above code returns the following output-
Related Articles
Color detection OpenCVPython OpenCV Histogram of Grayscale Image
Python OpenCV ColorMap
Python OpenCV Gaussian Blur Filtering
Python OpenCV Overview and Examples
Draw different shapes on image using Python OpenCV
OpenCV Logical Operators- Bitwise AND, OR, NOR, XOR
Python OpenCV Histogram of Color Image
Capture a video in Python OpenCV and save
Contour Detection using Python OpenCV
Python OpenCV Erosion and Dilation
Image Thresholding Python OpenCV
Python OpenCV Histogram Equalization
Human Body Detection Program In Python OpenCV
Adaptive Thresholding in Python OpenCV
Python OpenCV Erosion and Dilation
Eye Detection Program in Python OpenCV
Face Recognition OpenCV Source Code
Python Line Plot Using Matplotlib