Ir al contenido

Visión por Computadora: Mejora el Contraste de Imágenes

Introducción

¿Alguna vez te has preguntado cómo puedes hacer que tus fotos se vean más profesionales y atractivas en las redes sociales? Muchas veces, el secreto detrás de una imagen impactante es el ajuste de su contraste. Así como las aplicaciones de edición de fotos te permiten ajustar el contraste y los niveles de luz con un simple deslizador, en esta entrada te mostraremos cómo es que se logra esta optimización de imágenes tras bambalinas, mediante código. Utilizando una técnica poderosa llamada ecualización del histograma, aprenderás a mejorar el contraste de tus imágenes. Te enseñaremos a aplicar esta técnica tanto de forma manual como utilizando la biblioteca OpenCV, para que tus fotos destaquen aún más.


¿Qué es un Histograma?

Un histograma es una representación gráfica de la distribución de niveles de intensidad en una imagen. En el contexto de imágenes digitales, muestra la frecuencia con la que aparecen los diferentes niveles de gris, que son los valores de intensidad que van desde 0 (negro) hasta 255 (blanco), con varios tonos de gris en medio.

La ecualización del histograma es una técnica que mejora el contraste de una imagen. Este método ajusta los niveles de gris de los píxeles para que se distribuyan de manera más uniforme. Al hacerlo, los detalles de la imagen se realzan y la claridad aumenta. Esto significa que una imagen oscura y poco contrastada puede volverse más clara y definida, mejorando su apariencia visual.


Importación de Librerías

Para comenzar, es necesario importar las librerías esenciales para el procesamiento de imágenes. Utilizaremos OpenCV para las operaciones de imagen, numpy para las operaciones matemáticas y manipulación de matrices, y matplotlib para la visualización.

Carga de Imágenes

Primero, cargaremos una imagen en escala de grises utilizando OpenCV.

Histograma de Entrada

Calculamos y graficamos el histograma de la imagen original para entender su distribución de niveles de gris.


En esta sección del código, primero inicializamos el histograma, luego obtenemos las dimensiones de la imagen, y finalmente contamos la frecuencia de cada nivel de gris en la imagen:


  1. Inicializa el histograma: Creamos una lista hist_entrada_manual con 256 elementos, todos inicializados en cero. Cada elemento de esta lista representará un nivel de gris (de 0 a 255) y su valor almacenará la frecuencia con la que aparece ese nivel en la imagen.
  2. Obtiene las dimensiones de la imagen: Usamos shape para obtener el número de filas y columnas de la imagen en escala de grises, almacenándolos en filas_ecu y cols_ecu, respectivamente.
  3. Conteo de niveles de gris: Iteramos sobre cada píxel de la imagen. Para cada píxel, obtenemos su valor de gris (color) y aumentamos en uno el contador correspondiente en hist_entrada_manual. Este bucle for doble permite contar la frecuencia de cada nivel de gris en la imagen.
Método Manual de Ecualización

El siguiente paso es realizar la ecualización del histograma de manera manual. Calculamos la función de distribución acumulativa (CDF) y reasignamos los valores de los píxeles según esta CDF.


¿Por Qué Utilizamos la CDF para Ecualizar?

La función de distribución acumulativa (CDF) se utiliza para ecualizar los niveles de gris porque permite redistribuir los valores de intensidad de manera que se llenen los vacíos en el rango de niveles de gris, produciendo una distribución más uniforme. La CDF se obtiene acumulando las frecuencias del histograma normalizado (PDF), y representa la probabilidad acumulada de encontrar un valor de intensidad menor o igual a un valor dado. Al aplicar la CDF, transformamos los valores originales de los píxeles en valores que están mejor distribuidos a lo largo del rango de intensidades disponibles. Esto realza los contrastes y hace que los detalles en la imagen sean más perceptibles, mejorando así su calidad visual.


Convertir Histograma y Calcular CDF

Ahora vamos a convertir el histograma a un array de numpy, calcular la CDF, y usarla para ecualizar la imagen:


  1. Convertir histograma a numpy array: Transformamos la lista hist_entrada_manual en un array de numpy para facilitar los cálculos matemáticos.
  2. Calcular PDF y CDF: Dividimos el histograma entre el número total de píxeles para obtener la función de distribución de probabilidad (PDF). Luego, calculamos la función de distribución acumulativa (CDF) sumando los valores de la PDF.
  3. Normalizar la CDF: Escalamos la CDF para que sus valores estén en el rango de 0 a 255, adecuado para valores de intensidad de píxeles en imágenes.
  4. Crear imagen ecualizada: Creamos una nueva imagen donde cada píxel es reasignado a un nuevo valor de intensidad basado en la CDF normalizada. Esto redistribuye los niveles de gris de manera uniforme.
  5. Calcular histograma de la imagen ecualizada: Repetimos el proceso de contar los niveles de gris en la nueva imagen ecualizada.
Método Automatizado con OpenCV

OpenCV proporciona una función optimizada para la ecualización del histograma que simplifica enormemente el proceso.


En esta sección del código, utilizamos OpenCV para calcular el histograma de la imagen ecualizada y lo visualizamos:


  1. Ecualización de la imagen: Utilizamos la función cv.equalizeHist de OpenCV para realizar la ecualización del histograma de la imagen de entrada de manera automática.
  2. Calcular el histograma de la imagen ecualizada por OpenCV: Utilizamos la función cv.calcHist para calcular el histograma de la imagen ecualizada. Los parámetros de esta función son:
    1. images: Lista que contiene la imagen de entrada.
    2. channels: Índice del canal para el cual se calcula el histograma. 0 se refiere al canal de escala de grises.
    3. mask: Máscara opcional. Si no se utiliza, se pasa None.
    4. histSize: Número de contenedores en el histograma. En este caso, 256 para cada nivel de gris.
    5. ranges: Rango de los niveles de gris, de 0 a 256.
  3. Aplanar el array: La función ravel() aplana el array de histograma de OpenCV a una dimensión para facilitar la visualización.
  4. Graficar el histograma: Utilizamos plt.bar para crear una gráfica de barras del histograma y plt.show para mostrarla.
Comparar los Histogramas Ecualizados con el Original

Comparar los histogramas ecualizados con el original permite ver cómo cada método mejora la imagen. La ecualización manual y la de OpenCV se evalúan según cómo redistribuyen los niveles de gris para mejorar el contraste. Un histograma que muestra una distribución más plana y extendida generalmente indica una mejor ecualización, resultando en una imagen con mejor contraste y detalles más claros.

Descarga el Jupyter Notebook de este ejemplo en GitHub

Conclusión

La ecualización del histograma es una técnica poderosa para mejorar el contraste de las imágenes. Comparando el método manual con el automatizado de OpenCV, podemos ver que ambos logran resultados similares, pero OpenCV simplifica el proceso considerablemente.


Importancia de la Ecualización del Histograma
  • Mejora del Contraste: Aumenta la capacidad de discernir detalles en la imagen.
  • Distribución Uniforme: Proporciona una mejor calidad visual con una distribución uniforme de niveles de gris.


Comparación de Métodos
  • Método Manual: Permite un control detallado pero es más laborioso.
  • OpenCV: Automatiza el proceso, haciéndolo más rápido y accesible.


La selección de la técnica adecuada depende de tus necesidades específicas y del nivel de control que desees tener sobre el proceso.


Explora estas técnicas y mejora la calidad de tus imágenes con ecualización del histograma. ¡Hasta la próxima entrada!


Compartir
Iniciar sesión dejar un comentario