Histogramas OpenCV Python

Un histograma es una gráfica en donde se muestra la frecuencia con las que aparecen los distintos niveles de intensidad de una imagen a escala de grises, normalmente el nivel de intensidad está en el rango de 0 a 255, en donde el valor 0 representa los color negro y 255 el color blanco, utilizando el histograma de una imagen podemos modificar sus características, por ejemplo, el brillo y contraste, existen además otras aplicaciones que veremos más adelante.

histograma opencv pyhton

Para el calculo de histogramas OpenCV nos proporciona la función cv2.calcHist() para dicho propósito, esta se define de la siguiente manera:

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]

Debemos indicar los siguientes parámetros:

  • images: imagen de estrada, puede ser a escala de grises o colores.
  • channels: índice de canal para el cual deseamos calcular el histograma, en una imagen a escala de grises [0], si la imagen es a colores podemos indicar [0], [1], [2] para los canales B, G, R respectivamente.
  • mask: mascara que define la región sobre la que deseamos calcular el histograma, es opcional.
  • histSize: intensidad máxima, para nosotros [256].
  • ranges: nuestro rango de valores, usaremos [0, 256].

Dibujaremos la gráfica del histograma usando la librería matplotlib, esta nos es estrictamente necesaria, solo nos facilita el trabajado de programación, si no deseas usar una biblioteca externa puede dibujar la gráfica usando la funciones de dibujo nativas de OpenCV, puedes ver este ejemplo: python/hist.py

El código para generar la salida que se muestra en la imagen superior es el siguiente:

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

img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('lena.jpg', img)

hist = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.plot(hist, color='gray' )

plt.xlabel('intensidad de iluminacion')
plt.ylabel('cantidad de pixeles')
plt.show()

cv2.destroyAllWindows()

La parte ha resaltar del código, el calculo del histograma usando la función cv2.calcHist(), luego graficamos el resultado usando el método plot(hist), como podemos ver le pasamos el resultado obtenido previamente, mostramos la gráfica con show().

Calcular histograma de imagen a color

También es posible calcular el histograma de una imagen a color, lo que obtenemos es una gráfica que muestra la frecuencia con la que aparecen los distintos niveles de cada uno de los canales, azul, verde y rojo, el código es similar al anterior, solo debemos asegurarnos de recorrer y calcular cada uno de los histogramas para cada canal.

histograma a color opencv python

El código requerido para lograr esto, es:

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

img = cv2.imread('lena.jpg')
cv2.imshow('lena.jpg', img)

color = ('b','g','r')

for i, c in enumerate(color):
    hist = cv2.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(hist, color = c)
    plt.xlim([0,256])

plt.show()

cv2.destroyAllWindows()

Recorremos los tres canales de la imagen y calculamos el histograma para cada uno, le asignamos un color diferente a cada uno, de este modo podremos identificarlo en la gráfica.

Ecualización de histogramas

La ecualización de histograma busca obtener una distribución uniforme de los distintos niveles de intensidad, esta técnica es muy utilizada para mejorar el contraste de las imágenes.

Para aplicar la ecualización de histograma OpenCV nos provee la función cv2.equalizeHist(src) solo debemos pasarle la imagen de estrada, la función nos retorna la imagen ecualizada.

Histograma de imagen con mucho brillo

Podemos observar que la imagen está bastante clara, tiene mucho brillo, si vemos el histograma podremos ver que la mayoría de los pixeles son blancos, en la siguiente imagen vemos el caso contrario, la imagen tiene poca luz, está oscura.

Histograma de imagen con poco brillo

Ahora la mayor concentración de pixeles está en el nivel de intensidad cercano a 0 es decir el color negro.

Usando la ecualización de histogramas podemos mejorar ambas imágenes, veamos el código:

import cv2

img = cv2.imread('lena-clara.jpg', cv2.IMREAD_GRAYSCALE)
img = cv2.equalizeHist(img)

cv2.imshow('Histogramas', img)
cv2.waitKey()

Obtenemos el siguiente resultado:

Ecualización de histograma con OpenCV Python

De momento terminamos este tutorial de visión por computador con OpenCV y el lenguaje Python, todavía hay muchas que aprender sobre los histogramas, esperamos en el futuro poder profundizar en el tema, hasta la próxima.

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV

Acceso a la webcam con OpenCV