In the last blog, we discussed 1-D histograms in which we analyze each channel separately. Suppose, we want to find the correlation between image channels, let’s say we are interested in finding like how many times a (red, green) pair of (100,56) appeared in an image. In such a case, a 1-D histogram will fail as it does not shows the relationship of intensities at the exact position between two channels.
To solve this problem, we need Multi-dimensional histograms like 2-D or 3D. With the help of 2-D histograms, we can analyze the channels together in groups of 2 (RG, GB, BR) or all together with 3D histograms. Let’s see what is a 2-D histogram and how to construct this using OpenCV Python.
A 2-D histogram counts the occurrence of combinations of intensities. Below figure shows a 2D histogram
Here, Y and X-axis correspond to the Red and Green channel ranges( for 8-bit, [0,255]) and each point within the histogram shows the frequency corresponding to each R and G pair. Frequency is color-coded here, otherwise, another dimension would be needed.
Let’s understand how to construct a 2-D histogram by taking a simple example.
Suppose, we have 4×4, 2-bit images of Red and Green channels(as shown below) and we want to plot their 2-D histogram.
- First, we plot the R and G channel ranges(Here, [0,3]) on the X and Y-axis respectively. This will be our 2-D histogram.
- Then, loop over each position within the channels, find the corresponding intensity pairs frequency and plot it in the 2-D histogram. These frequencies are then color-coded for ease of visualization.
Now, let’s see how to construct a 2-D histogram using OpenCV-Python
- channels: [0,1] for (Blue, Green), [1,2] for (G, R) and [0,2] for (B, R).
- bins: specify for each channel according to your need. e.g [256,256].
- range: [0,256,0,256] for an 8-bit image.
We use the same function cv2.calcHist() that we have used for a 1-D histogram. Just change the following parameters and rest is the same.
Below is the sample code for this using OpenCV-Python
# 2D histogram for Blue and Green channels.
hist = cv2.calcHist([image], [0, 1], None, [256, 256], [0, 256, 0, 256])
# show using matplotlib
plt.imshow(hist, interpolation = 'nearest')
Always use Nearest Neighbour Interpolation when plotting a 2-D histogram.
Plotting a 2-D histogram using RGB channels is not a good choice as we cannot extract color information using 2 channels only. Still, this can be used for finding the correlation between channels, finding clipping or intensity proportions etc.
To extract color information, we need a color model in which two components/channels can solely represent the chromaticity (color) of the image. One such color model is HSV where H and S tell us about the color of the light. So, first convert the image from BGR to HSV and then apply the above code.
Hope you enjoy reading.
If you have any doubt/suggestion please feel free to ask and I will do my best to help or improve myself. Good-bye until next time.