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)
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')