OpenCV  4.1.1-pre
Open Source Computer Vision
Looking for a C++ dev who knows OpenCV?
I'm looking for work. Hire me!
Histogram Equalization

Prev Tutorial: Affine Transformations

Next Tutorial: Histogram Calculation

Goal

In this tutorial you will learn:

  • What an image histogram is and why it is useful
  • To equalize histograms of images by using the OpenCV function cv::equalizeHist

Theory

What is an Image Histogram?

  • It is a graphical representation of the intensity distribution of an image.
  • It quantifies the number of pixels for each intensity value considered.
Histogram_Equalization_Theory_0.jpg

What is Histogram Equalization?

  • It is a method that improves the contrast in an image, in order to stretch out the intensity range (see also the corresponding Wikipedia entry).
  • To make it clearer, from the image above, you can see that the pixels seem clustered around the middle of the available range of intensities. What Histogram Equalization does is to stretch out this range. Take a look at the figure below: The green circles indicate the underpopulated intensities. After applying the equalization, we get an histogram like the figure in the center. The resulting image is shown in the picture at right.
Histogram_Equalization_Theory_1.jpg

How does it work?

  • Equalization implies mapping one distribution (the given histogram) to another distribution (a wider and more uniform distribution of intensity values) so the intensity values are spread over the whole range.
  • To accomplish the equalization effect, the remapping should be the cumulative distribution function (cdf) (more details, refer to Learning OpenCV). For the histogram \(H(i)\), its cumulative distribution \(H^{'}(i)\) is:

    \[H^{'}(i) = \sum_{0 \le j < i} H(j)\]

    To use this as a remapping function, we have to normalize \(H^{'}(i)\) such that the maximum value is 255 ( or the maximum value for the intensity of the image ). From the example above, the cumulative function is:

    Histogram_Equalization_Theory_2.jpg
  • Finally, we use a simple remapping procedure to obtain the intensity values of the equalized image:

    \[equalized( x, y ) = H^{'}( src(x,y) )\]

Code

  • What does this program do?
    • Loads an image
    • Convert the original image to grayscale
    • Equalize the Histogram by using the OpenCV function cv::equalizeHist
    • Display the source and equalized images in a window.

Explanation

  • Load the source image:
  • Convert it to grayscale:

As it can be easily seen, the only arguments are the original image and the output (equalized) image.

  • Display both images (original and equalized):
  • Wait until user exists the program

Results

  1. To appreciate better the results of equalization, let's introduce an image with not much contrast, such as:

    Histogram_Equalization_Original_Image.jpg

    which, by the way, has this histogram:

    Histogram_Equalization_Original_Histogram.jpg

    notice that the pixels are clustered around the center of the histogram.

  2. After applying the equalization with our program, we get this result:

    Histogram_Equalization_Equalized_Image.jpg

    this image has certainly more contrast. Check out its new histogram like this:

    Histogram_Equalization_Equalized_Histogram.jpg

    Notice how the number of pixels is more distributed through the intensity range.

Note
Are you wondering how did we draw the Histogram figures shown above? Check out the following tutorial!