Ecualización de histograma CLAHE – OpenCV
La ecualización de histograma es una técnica utilizada en el procesamiento de imágenes para mejorar el contraste de una imagen redistribuyendo las intensidades de los píxeles de una manera que maximiza el brillo y el detalle generales. El método funciona ajustando la distribución de frecuencia de los valores de píxeles en una imagen, de modo que la imagen resultante tenga un histograma uniforme. El histograma uniforme garantiza que cada píxel de la imagen tenga las mismas posibilidades de aparecer, lo que da como resultado una imagen bien distribuida con contraste mejorado.
La ecualización de histogramas es una herramienta importante en el procesamiento de imágenes y se usa comúnmente en diversas aplicaciones, incluidas imágenes médicas, teledetección y visión por computadora. La técnica es particularmente útil para mejorar imágenes que tienen poco contraste o brillo, como las capturadas en condiciones de poca luz o las que están sobreexpuestas.
La ecualización de histogramas es una herramienta importante en el procesamiento de imágenes y se usa comúnmente en diversas aplicaciones, incluidas imágenes médicas, teledetección y visión por computadora. La técnica es particularmente útil para mejorar imágenes que tienen poco contraste o brillo, como las capturadas en condiciones de poca luz o las que están sobreexpuestas.
A pesar de su eficacia para mejorar el contraste de la imagen, la ecualización del histograma puede provocar algunos artefactos en la imagen resultante, como sobreamplificación del ruido y pérdida de detalles. Por lo tanto, a lo largo de los años se han desarrollado diversas variaciones y mejoras del método, como la ecualización de histograma adaptativa, la ecualización de histograma adaptativa limitada por contraste y la ecualización de histograma local, entre otras.
Ahora entendamos un poco sobre CLAHE.
CLAHE
La ecualización de histograma adaptativa limitada por contraste (CLAHE) es una variante de la ecualización de histograma que se ha utilizado ampliamente en aplicaciones de procesamiento de imágenes para mejorar el contraste de la imagen y al mismo tiempo evitar la sobreamplificación del ruido y preservar los detalles de la imagen. La idea principal detrás de CLAHE es realizar la ecualización de histograma localmente, en regiones más pequeñas de la imagen, en lugar de globalmente.
En la ecualización de histograma tradicional, la imagen se divide en pequeñas regiones o subimágenes que no se superponen, y cada subimagen se ecualiza individualmente. Este proceso puede dar lugar a una sobreamplificación del ruido en las subimágenes con bajo contraste, dando lugar a una imagen ruidosa y de aspecto artificial. Por el contrario, CLAHE divide la imagen en regiones superpuestas y aplica la ecualización de histograma a cada región por separado. Esto permite mejorar el contraste preservando los detalles locales y evitando la sobreamplificación del ruido.
CLAHE implica dos pasos principales: mejorar el contraste y limitar el contraste. En el primer paso, se aplica una ecualización de histograma local a cada pequeña región de la imagen, lo que da como resultado un mayor contraste. En el segundo paso, se limita el contraste de la imagen aplicando una función no lineal al histograma, de manera que se reduce el número de píxeles con intensidades muy altas o muy bajas. La función no lineal se define mediante un parámetro llamado límite de recorte, que determina la cantidad de limitación de contraste que se aplicará.
El límite de clip es un parámetro importante en CLAHE. Determina la cantidad máxima de amplificación de contraste que se puede realizar en cada región antes de que se limite el contraste. Si el límite de clip se establece demasiado alto, la imagen puede mejorarse demasiado y sufrir efectos de apariencia artificial, como halos alrededor de los bordes o una apariencia general descolorida. Por otro lado, si el límite de clip se establece demasiado bajo, la mejora del contraste puede no ser suficiente y la imagen puede parecer opaca.
CLAHE tiene varias ventajas sobre la ecualización de histograma tradicional. En primer lugar, puede preservar los detalles locales y mejorar el contraste de forma más eficaz. En segundo lugar, puede evitar la sobreamplificación del ruido, lo cual es particularmente importante en aplicaciones de imágenes médicas, donde las imágenes pueden tener ruido. Finalmente, es un algoritmo simple y computacionalmente eficiente, lo que lo hace adecuado para aplicaciones en tiempo real.
En conclusión, CLAHE es una técnica poderosa para mejorar el contraste de la imagen preservando al mismo tiempo los detalles locales y evitando la sobreamplificación del ruido. Se ha utilizado ampliamente en diversas aplicaciones, incluidas imágenes médicas, teledetección y visión por computadora. Su capacidad para adaptarse a las variaciones de contraste locales y evitar la sobreamplificación del ruido lo convierte en una herramienta valiosa para mejorar imágenes en muchos campos.
Este tutorial demostrará el proceso de uso de la ecualización de histograma adaptativa limitada por contraste (CLAHE) para ecualizar imágenes.
El contraste de las imágenes se puede mejorar utilizando este algoritmo. Además, CLAHE se puede aplicar a imágenes en color, con mejores resultados cuando se aplica el algoritmo únicamente al canal de luminancia de una imagen HSV en lugar de ecualizar todos los canales de una imagen BGR.
Al utilizar CLAHE, es importante tener en cuenta dos parámetros: clipLimit ytileGridSize.
clipLimit establece el umbral para limitar el contraste y tiene un valor predeterminado de 40. Mientras tanto,tileGridSize determina el número de mosaicos en cada fila y columna al dividir la imagen para la aplicación CLAHE, y su valor predeterminado es 8x8.
Ahora que es suficiente teoría, exploremos cómo podemos utilizar CLAHE para realizar la ecualización del histograma.
Antes de pasar al código, primero debemos asegurarnos de que el módulo opencv esté instalado en nuestra máquina y, de lo contrario, debemos ejecutar el comando que se muestra a continuación.
Comando
pip3 install opencv-python
Considere el código que se muestra a continuación.
Ejemplo
import cv2
import numpy as np
# Reading the image from the present directory
image = cv2.imread("aircraft-ww2.jpeg")
# Resizing the image for compatibility
image = cv2.resize(image, (500, 600))
# The initial processing of the image
# image = cv2.medianBlur(image, 3)
image_bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# The declaration of CLAHE
# clipLimit -> Threshold for contrast limiting
clahe = cv2.createCLAHE(clipLimit = 5)
final_img = clahe.apply(image_bw) + 30
# Ordinary thresholding the same image
_, ordinary_img = cv2.threshold(image_bw, 155, 255, cv2.THRESH_BINARY)
# Showing all the three images
cv2.imshow("ordinary threshold", ordinary_img)
cv2.imshow("CLAHE image", final_img)
cv2.waitKey()
Explicación
Este código realiza una tarea simple de procesamiento de imágenes utilizando la biblioteca OpenCV en Python.
Primero, importa las bibliotecas necesarias: OpenCV y NumPy. Luego lee una imagen llamada "aircraft-ww2.jpeg" del directorio actual y la cambia de tamaño a 500x600 para compatibilidad.
A continuación, la imagen se convierte a escala de grises utilizando la función cv2.cvtColor(). La variable image_bw resultante almacena la imagen en escala de grises.
Luego, el código aplica la ecualización de histograma adaptativo limitado por contraste (CLAHE) a la imagen en escala de grises usando la función cv2.createCLAHE(). El parámetro clipLimit se establece en 5, lo que determina el umbral para la limitación del contraste. Luego, la imagen resultante se ajusta agregando un valor de 30 para aumentar su brillo.
Además de la imagen CLAHE, el código también realiza un umbral ordinario en la imagen en escala de grises utilizando la función cv2.threshold(). El valor umbral se establece en 155, lo que significa que cualquier valor de píxel por encima de 155 se establece en 255 (blanco) y cualquier valor por debajo de 155 se establece en 0 (negro). La imagen resultante se almacena en la variable ordinaria_img.
Finalmente, el código muestra las tres imágenes usando la función cv2.imshow(), donde el "umbral ordinario" representa la imagen de umbral ordinaria y la "imagen CLAHE" representa la imagen mejorada por CLAHE. El código espera que se presione una tecla antes de cerrar las ventanas usando cv2.waitKey().
Para ejecutar el código anterior, necesitamos ejecutar el comando que se muestra a continuación.
Comando
python3 main.py
Una vez que ejecutamos el comando anterior, podemos esperar que el resultado sea el mismo que el que se muestra a continuación.
Producción
A la izquierda tenemos la imagen original sin clahe, y la imagen de la derecha es aquella en la que usamos CLAHE.
Ahora hagamos uso de un ejemplo más.
Donde cambiaremos cliplimit y titleGridSize.
Considere el código que se muestra a continuación.
Ejemplo
import cv2
import numpy as np
# Reading the image from the present directory
image = cv2.imread("aircraft-ww2.jpeg")
# Resizing the image for compatibility
image = cv2.resize(image, (500, 600))
# The initial processing of the image
# Uncomment the line below to apply median filtering
# image = cv2.medianBlur(image, 3)
image_bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# The declaration of CLAHE
# clipLimit -> Threshold for contrast limiting
# tileGridSize -> Number of tiles in the row and column
clahe = cv2.createCLAHE(clipLimit=10, tileGridSize=(8, 8))
final_img = clahe.apply(image_bw)
# Adjust the brightness of the output
final_img = cv2.add(final_img, 50)
# Showing all the three images
cv2.imshow("Original image", image)
cv2.imshow("CLAHE image", final_img)
cv2.waitKey()
Explicación
Primero, importamos las bibliotecas necesarias, OpenCV y NumPy.
Luego leemos una imagen llamada "aircraft−ww2.jpeg" del directorio actual usando la función cv2.imread() y la almacenamos en la variable 'imagen'. Cambiamos el tamaño de la imagen a 500 x 600 píxeles para garantizar la compatibilidad con la ventana de visualización.
A continuación, convertimos la imagen a escala de grises usando la función cv2.cvtColor() y la almacenamos en una nueva variable llamada 'image_bw'.
Luego, creamos un objeto de ecualización de histograma adaptativo limitado por contraste (CLAHE) usando la función cv2.createCLAHE(). Establecemos el parámetro 'clipLimit' en 10, que establece el umbral para limitar el contraste, y el parámetro 'tileGridSize' en (8,8), que establece el número de mosaicos en la fila y columna.
Luego aplicamos el algoritmo CLAHE a la imagen en escala de grises usando el método apply() del objeto CLAHE y almacenamos el resultado en una nueva variable llamada 'final_img'.
Finalmente, ajustamos el brillo de la imagen de salida agregando un valor de 50 a la variable 'final_img' usando la función cv2.add(). Mostramos la imagen original y la imagen mejorada CLAHE una al lado de la otra usando la función cv2.imshow() y esperamos a que se presione una tecla usando la función cv2.waitKey().
Para ejecutar el código anterior, necesitamos ejecutar el comando que se muestra a continuación.
Comando
python3 main.py
Una vez que ejecutamos el comando anterior, podemos esperar que el resultado sea el mismo que el que se muestra a continuación.
Producción
Conclusión
En conclusión, la ecualización de histograma adaptativa limitada por contraste (CLAHE) es una poderosa técnica de mejora de imágenes que puede mejorar el contraste y el rango dinámico de una imagen.
Con la ayuda de OpenCV, es fácil implementar CLAHE en imágenes en escala de grises y en color. Al ajustar los parámetros clipLimit ytileGridSize, podemos ajustar el rendimiento del algoritmo CLAHE para adaptarlo a nuestras necesidades. En general, CLAHE es una herramienta útil en el procesamiento de imágenes y puede ayudar a mejorar la calidad visual de las imágenes en una variedad de aplicaciones.