Что такое гистограмма изображения?
Гистограмма изображения — это графическое представление распределения яркостей (интенсивностей пикселей) в изображении. Она показывает, сколько пикселей изображения имеют ту или иную яркость. Гистограммы широко применяются в компьютерном зрении и цифровой обработке изображений для анализа контрастности, освещённости, улучшения качества и сегментации изображения.
Основные понятия
Гистограмма состоит из:
-
Оси 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)
Такой подход позволяет анализировать, насколько насыщены цвета и как распределены тени/света по каналам.
Что можно понять по гистограмме
-
Тёмное изображение — большинство значений сосредоточено ближе к 0 (левая часть гистограммы).
-
Светлое изображение — пиксели сконцентрированы справа (яркие значения).
-
Низкий контраст — гистограмма узкая, сжатая в центре.
-
Высокий контраст — гистограмма широко распределена по всей шкале.
Применение гистограмм
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-фич.
-
Устранение плохого освещения (контрастирование).
-
Фильтрация изображений в датасетах по уровню контраста или освещённости.
Гистограмма — простой, но мощный инструмент анализа и улучшения изображений. Она даёт числовое и визуальное представление о том, как распределены пиксели по яркости или цвету, и помогает принимать решения при обработке.