Что такое гистограмма изображения?

Гистограмма изображения — это графическое представление распределения яркостей (интенсивностей пикселей) в изображении. Она показывает, сколько пикселей изображения имеют ту или иную яркость. Гистограммы широко применяются в компьютерном зрении и цифровой обработке изображений для анализа контрастности, освещённости, улучшения качества и сегментации изображения.

Основные понятия

Гистограмма состоит из:

  • Оси X — уровни интенсивности (яркости), обычно от 0 до 255 для 8-битных изображений.

  • Оси Y — количество пикселей с данной яркостью.

Пример: если на изображении 500 пикселей имеют значение 128, то в гистограмме высота столбика над значением 128 будет равна 500.

Гистограмма для grayscale-изображения

Для изображения в оттенках серого (градации от чёрного до белого) гистограмма содержит 256 значений, соответствующих яркости от 0 (чёрный) до 255 (белый).

import cv2
import matplotlib.pyplot as plt
image = cv2.imread('image.jpg', 0) # загрузка в градациях серого
hist = cv2.calcHist(\[image\], \[0\], None, \[256\], \[0, 256\])
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Intensity')
plt.ylabel('Number of Pixels')
plt.show()

Гистограмма для цветного изображения (RGB)

В цветных изображениях обычно строят отдельные гистограммы по каждому каналу: красному (Red), зелёному (Green) и синему (Blue).

image = cv2.imread('image.jpg')
color = ('b', 'g', 'r')
for i, col in enumerate(color):
hist = cv2.calcHist(\[image\], \[i\], None, \[256\], \[0, 256\])
plt.plot(hist, color=col)

Такой подход позволяет анализировать, насколько насыщены цвета и как распределены тени/света по каналам.

Что можно понять по гистограмме

  1. Тёмное изображение — большинство значений сосредоточено ближе к 0 (левая часть гистограммы).

  2. Светлое изображение — пиксели сконцентрированы справа (яркие значения).

  3. Низкий контраст — гистограмма узкая, сжатая в центре.

  4. Высокий контраст — гистограмма широко распределена по всей шкале.

Применение гистограмм

1. Улучшение контрастности

  • Гистограммное выравнивание (histogram equalization) позволяет перераспределить значения яркости, растянув их на всю шкалу 0–255.
equalized = cv2.equalizeHist(image)
  • Полезно при плохом освещении или тусклых изображениях.

2. Адаптивное выравнивание (CLAHE)

Для локального повышения контраста, без резких переходов.

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
cl1 = clahe.apply(image)

3. Сегментация по гистограмме

Можно выбрать пороговое значение на основе анализа пиков и впадин гистограммы для бинаризации:

\_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

4. Сравнение изображений

Можно использовать гистограмму как вектор признаков. Сравнение гистограмм позволяет оценивать, насколько изображения похожи:

hist1 = cv2.calcHist(\[img1\], \[0\], None, \[256\], \[0, 256\])
hist2 = cv2.calcHist(\[img2\], \[0\], None, \[256\], \[0, 256\])
cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)

Нормализация гистограммы

Иногда гистограмму нормализуют (переводят высоты в диапазон от 0 до 1 или 0 до 255), чтобы она не зависела от размера изображения:

cv2.normalize(hist, hist, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)

Маски для локальных гистограмм

Можно анализировать гистограмму только в заданной области изображения с помощью маски:

mask = np.zeros(image.shape\[:2\], dtype="uint8")
cv2.rectangle(mask, (50, 50), (200, 200), 255, -1)
masked = cv2.bitwise_and(image, image, mask=mask)
hist = cv2.calcHist(\[image\], \[0\], mask, \[256\], \[0, 256\])

2D-гистограммы

Если нужно анализировать распределение двух каналов одновременно (например, Hue и Saturation в HSV-пространстве):

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hist = cv2.calcHist(\[hsv\], \[0, 1\], None, \[180, 256\], \[0, 180, 0, 256\])

Полезно для анализа цветового распределения.

Практические задачи, где используется гистограмма

  • Повышение читаемости изображений перед распознаванием (OCR).

  • Сегментация в задачах машинного зрения (медицина, спутники).

  • Распознавание лиц/объектов — в виде HOG-фич.

  • Устранение плохого освещения (контрастирование).

  • Фильтрация изображений в датасетах по уровню контраста или освещённости.

Гистограмма — простой, но мощный инструмент анализа и улучшения изображений. Она даёт числовое и визуальное представление о том, как распределены пиксели по яркости или цвету, и помогает принимать решения при обработке.