Skip to main content

Concepts Review

Histogram Equalization

Sample Code

from collections import Counter
from pathlib import Path
from typing import Final

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


def __show_image(window_name: str, image: np.ndarray) -> None:
cv2.startWindowThread()
cv2.imshow(window_name, image)
while True:
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyWindow(window_name)
for _ in range(5):
cv2.waitKey(1)


def show_images(images, titles=None):
num_images = len(images)

num_rows = 1
num_cols = num_images

if titles is None:
titles = [f'Image {i}' for i in range(1, num_images + 1)]

plt.figure(figsize=(15, 5))

for i, (image, title) in enumerate(zip(images, titles), 1):
plt.subplot(num_rows, num_cols, i)
plt.imshow(image, cmap='gray')
plt.title(title)
plt.axis('off')

plt.show()


BASE_DIR: Final[Path] = Path().resolve()
DATA_DIR: Final[Path] = os.path.join(BASE_DIR, 'data')

# Load an image
image = cv2.imread(os.path.join(DATA_DIR, 'example-one', 'low-contrast.png'))

# Convert the image to grayscale
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

# Perform histogram equalization
equalized_image = cv2.equalizeHist(gray_image)

# Calculate the histogram of the original image using Counter
original_histogram = Counter(gray_image.flatten())

# Calculate the histogram of the equalized image using Counter
equalized_histogram = Counter(equalized_image.flatten())

# Display the original and equalized images
__show_image("Original Gray Image", gray_image)
__show_image("Equalized Image", equalized_image)

cv2.imwrite(os.path.join(DATA_DIR, 'example-one', 'equalized.png'), equalized_image)

show_images([gray_image, equalized_image], ['Original Image', 'Equalized Image'])

# Plot the original histogram
plt.figure(figsize=(8, 6))
plt.subplot(2, 2, 3)
intensities_original = sorted(original_histogram.keys())
counts_original = [original_histogram[intensity] for intensity in intensities_original]
plt.bar(intensities_original, counts_original, width=1.0, color='b', alpha=0.7)
plt.title('Original Histogram')
plt.xlabel('Intensity')
plt.ylabel('Count')

# Plot the equalized histogram
plt.subplot(2, 2, 4)
intensities_equalized = sorted(equalized_histogram.keys())
counts_equalized = [equalized_histogram[intensity] for intensity in intensities_equalized]
plt.bar(intensities_equalized, counts_equalized, width=1.0, color='g', alpha=0.7)
plt.title('Equalized Histogram')
plt.xlabel('Intensity')
plt.ylabel('Count')

plt.tight_layout()
plt.show()

Example One

Orginal ImageEqualized Image
originalequalized

histogram


Example Two

Orginal ImageEqualized Image
originalequalized

histogram


Example Three

Orginal ImageEqualized Image
originalequalized

histogram


Example Four

Orginal ImageEqualized Image
originalequalized

histogram