In the previous blog, we discussed contrast stretching, a linear contrast enhancement method. In this blog, we will learn Histogram Equalization which automatically increase the dynamic range based on the information available in the histogram of the input image.
Histogram Equalization, as the name suggests, stretches the histogram to fill the dynamic range and at the same time tries to keep the histogram uniform as shown below
By doing this, the resultant image will have an appearance of high contrast and exhibits a large variety of grey tones.
Mostly we will not be able to perfectly equalize the histogram. This is only possible if we assume continuous intensity values.. But in reality, intensity values are discrete thus perfectly flat histograms are rare in practical applications of the histogram equalization.
The transformation function used in this is
where ‘s’ and ‘r’ are the output and input pixel intensities respectively. ‘L’ is the maximum intensity value(for n bit image L = 2n). The probability of occurrence of the intensity level rj in the image is approximated by
Here, MN is the total number of pixels in the image and nj is the number of pixels that have intensity rj.
Now, let’s take an example to understand how to perform Histogram Equalisation using the above equations.
Suppose we have a 3-bit, 8×8 image whose pixel count and corresponding histogram is shown below
Now, using the above transformation function we calculate the equalized intensity values. For instance
Doing this for all values we get
Because the pixel values can only be integers so we round the last column(
So, the round column is the output pixel intensity. The last step is to replace the pixel values in the original image(
To plot the histogram, count the total pixels belonging to the rounded intensity values(See Round and
The initial and equalized histogram is shown below
Sometimes rounding to nearest integer yield non-zero minimum value. If we want the output to range from say [0,255] for 8-bit, then we need to apply stretching (as we did in Min-Max stretching) after rounding.
Histogram Equalization often produces unrealistic effects in photographs and reduce color depth(no. of unique grey levels) as shown in the example above(See pixel value 5). It works best when applied to images with much higher color depth.
Let’s see OpenCV function for Histogram Equalization
1 |
equalized_img = cv2.equalizeHist(greyscale_img) |
Its input is grayscale image and output is our histogram equalized image.
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.