Histogram Equalization for Color Images

To perform histogram equalization on color images, we run the histogram and equalizationHistogram() functions on all channels of the image. It is important to note that, running equalization of all color channels may have unexpected result for RGB images on the final image.

Common practice is to convert color images into a LAB or HSV format and equalize the histogram on the luminosity channel.

This note demonstrates histogram equalization on the following color schemes:

  • 1. LAB - Equalization on the L channel
  • 2. HSV - Equalization on the V channel
  • 3. YUV - Equalization on the Y channel
  • 4. BGR - Equalization on all channels

Implementation in python

import cv2
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
%config InlineBackend.figure_format = 'retina'
cat_img = cv2.imread('cat.png')
cat_img = cv2.cvtColor(cat_img, cv2.COLOR_BGR2RGB)

# plot the image
plt.imshow(cat_img)
Histogram Equalization for Color Images

Equalization Steps

  • 1. Convert image to the color schema for equalization. RGB to LAB, HSV or YUV
  • 2. Split the image into image channels
  • 3. Equalize channels
  • 4. Merge channels back into image
  • 5. Convert equalized image to original color channel

The following fuctions implement these steps by color scheme

# BGR Equalization
def rgb_color_equalization(input_img):
    
    channels = cv2.split(input_img)
    equalized_channels = []
    for channel in channels:
        equalized_channels.append(cv2.equalizeHist(channel))
    return cv2.merge(equalized_channels)


# LAB Equalization on the Luminosity Channel
def lab_color_equalization(input_img):
    
    lab_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2Lab)
    l, a, b = cv2.split(lab_img)
    equalized_l = cv2.equalizeHist(l)
    merged_img = cv2.merge([equalized_l, a, b])
    return cv2.cvtColor(merged_img, cv2.COLOR_Lab2BGR)

# YUV Equalization on the Y Channel
def yuv_color_equalization(input_img):
    yuv_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2YUV)
    y, u, v = cv2.split(yuv_img)
    equalized_y = cv2.equalizeHist(y)
    merged_img = cv2.merge([equalized_y, u, v])
    return cv2.cvtColor(merged_img, cv2.COLOR_YUV2BGR)


# HSV Equalization on the V Channel
def hsv_color_equalization(input_img):
    hsv_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv_img)
    equalized_h = cv2.equalizeHist(h)
    merged_img = cv2.merge([equalized_h, s, v])
    return cv2.cvtColor(merged_img, cv2.COLOR_HSV2BGR)
rgb_equalization = rgb_color_equalization(img)
lab_equalization = lab_color_equalization(img)
hsv_equalization = hsv_color_equalization(img)
yuv_equalization = yuv_color_equalization(img)

Visualizing the Equalized Images

fig = plt.figure(figsize=(10, 7))

fig.add_subplot(231)
plt.imshow(img)
plt.title('Original Image')
plt.axis('off')

fig.add_subplot(232)
plt.imshow(rgb_equalization)
plt.title('RGB Equalization')
plt.axis('off')

fig.add_subplot(233)
plt.imshow(lab_equalization)
plt.title('LAB Equalization')
plt.axis('off')

fig.add_subplot(234)
plt.imshow(hsv_equalization)
plt.title('HSV Equalization')
plt.axis('off')

fig.add_subplot(235)
plt.imshow(yuv_equalization)
plt.title('YUV Equalization')
plt.axis('off')
Histogram Equalization for Color Images