Mejora de los detalles locales con ecualización de histograma adaptable: hacia la IA

Estás leyendo la publicación: Mejora de los detalles locales con ecualización de histograma adaptable: hacia la IA

Publicado originalmente en Hacia la IA.

Mira esta foto que tomé en uno de mis viajes. Es una montaña hermosa.

Ahora hice algunas modificaciones a esa imagen y échale un vistazo ahora.

¿No se ve mejor que el original? Bueno, hice una operación simple en la imagen llamada ecualización de histograma.

La ecualización de histogramas es una tecnología de mejora de imágenes ampliamente utilizada que mejora la apariencia visual y amplifica los detalles más pequeños de la imagen. Es una técnica que asigna los píxeles a un nuevo conjunto de píxeles, de modo que los píxeles más oscuros se asignarán a negro, mientras que los píxeles más claros se asignarán a blanco.

Una imagen de color normal consta de tres canales de color, a saber, rojo, verde y azul. Cada uno de los canales de color puede tener una intensidad que va de 0 a 255. Todos los colores de una imagen digital pueden crearse combinando cada uno de los canales de color con una intensidad particular para cada canal. Por ejemplo, si la intensidad del rojo y el verde está cerca de 255 y la intensidad del azul está cerca de cero, obtenemos un color similar al amarillo. Si todos los canales tienen una intensidad de 255, obtendremos color blanco, mientras que si todos los canales tienen una intensidad de 0, obtendremos color negro.

Para la ecualización del histograma, dividimos la imagen de entrada en tres canales de color diferentes. Ahora podemos aplicar la ecualización de histogramas en cada uno de los canales. Para eso, creamos un histograma de la imagen, que representa la frecuencia de ocurrencia de cada nivel de intensidad. A partir de la distribución de frecuencias de los píxeles, crearemos una distribución acumulativa. Una función de distribución acumulativa dirá cuántos píxeles tienen una intensidad menor o igual al nivel de intensidad dado.
La distribución acumulada creada se puede normalizar al rango [0,1] dividiendo cada valor por el número de píxeles de la imagen. Este valor se puede convertir a una escala de [0,255] multiplicando cada valor por 255. Ahora podemos reemplazar cada píxel en la imagen original con el nuevo valor correspondiente.
Esta operación se puede realizar en cada canal de color, y la salida de cada canal de color se puede combinar para formar una nueva imagen ecualizada con histograma.

🔥 Recomendado:  8 consejos inteligentes para una vida frugal: ahorre en grande con un presupuesto pequeño

Aquí hay un código de Python para lo mismo.

de imagen de importación PIL
importar matplotlib.pyplot como plt

img = Imagen.open(“ruta/a/imagen”)
w,h = img.tamaño

# creando histogramas de rg y b

pix_r = [0]*255
pix_g = [0]*255
pix_b = [0]*255

para i en el rango (w):
para j en el rango (h):
r,g,b = img.getpixel((i,j))
pix_r[r-1] += 1
pix_g[g-1] += 1
pix_b[b-1] += 1

plt.subparcela(2,1,1)
plt.plot(pix_r,color=”red”)
plt.plot(pix_g,color=”verde”)
plt.plot(pix_b,color=”azul”)

#calculando la distribución acumulada

para i en el rango (1,255):
pix_r[i] += foto_r[i-1]
pix_g[i] += foto_g[i-1]
pix_b[i] += foto_b[i-1]

plt.subparcela(2,1,2)
plt.plot(pix_r,color=”red”)
plt.plot(pix_g,color=”verde”)
plt.plot(pix_b,color=”azul”)
plt.mostrar()

num_pixel = ancho*alto
para i en el rango (w):
para j en el rango (h):
r,g,b = img.getpixel((i,j))
nuevo_r = pix_r[r-1]*(255/num_pixel)
nuevo_g = foto_g[g-1]*(255/num_pixel)
nuevo_b = foto_b[b-1]*(255/num_pixel)
img.putpixel((i,j),(int(nueva_r),int(nueva_g),int(nueva_b)))
img.save(“imagen_ecualizada.jpg”)

Ahora considere esta imagen

Después de la ecualización del histograma, este es el resultado que obtuve.

La mitad inferior de la imagen obtuvo un tinte diferente debido a la iluminación en la parte superior de la imagen. Esto sucedió debido a la diferencia de luminiscencia en la parte superior e inferior de la imagen. ¿Qué pasa si igualo cada parte de la imagen por separado?

Este es el resultado que obtuve cuando dividí la imagen en dos bloques y los igualé por separado.

Aquí podemos ver que los detalles de las partes superior e inferior se realzan por separado. Esta técnica se conoce como ecualización de histograma de bloque.
Echemos un vistazo a cómo se realiza la ecualización del histograma de bloques.

Primero, la imagen se divide en diferentes bloques. Se pueden utilizar enfoques adaptativos para dividir la imagen en segmentos según los bordes, las texturas y las intensidades. Para ello se pueden utilizar algoritmos de segmentación o crecimiento de regiones. Ahora, para cada región, la ecualización del histograma se realiza por separado como se explicó anteriormente. Las regiones ecualizadas se pueden combinar para obtener una imagen mejorada.

🔥 Recomendado:  Conversaciones en la nube: hacia la IA

Ahora, echemos un vistazo a esta imagen, donde bloqueamos la ecualización del histograma.

Aquí podemos ver el límite de los segmentos, que es causado por la discontinuidad de intensidad en el límite del bloque. Esto se llama un artefacto de bloqueo.
Para eliminar los artefactos de bloqueo, podemos utilizar la técnica de la ventana móvil. Aquí definimos una ventana N*N y aplicamos la ecualización del histograma dentro de esa región, luego deslizamos la ventana y aplicamos la ecualización en la nueva ventana. Esto sigue y sigue hasta que cubrimos toda la imagen con la ventana.

Esta es una técnica costosa desde el punto de vista computacional, pero se puede usar en situaciones requeridas usando una programación inteligente. Esta técnica mejora de forma adaptativa las pequeñas regiones de la imagen y evita los artefactos de bloqueo.

Existe otro enfoque eficiente para eliminar los artefactos de bloqueo. La ecualización del histograma de bloques se puede realizar en regiones que no se superponen como antes, pero las funciones de transferencia se pueden interpolar sin problemas a medida que nos movemos de una región a otra.

Veamos cómo se hace eso…
La posición de un píxel en un bloque se puede indicar mediante (s,t), donde s es la posición horizontal en el bloque y t es la posición vertical en el bloque. Tanto s como t están normalizados al rango [0,1]. Ahora tenemos que identificar tres bloques vecinos, de modo que uno de ellos esté horizontalmente más cerca del píxel, uno verticalmente más cerca del píxel y otro diagonalmente más cerca del píxel.

Teniendo la función de búsqueda de los tres bloques, podemos combinar la función de búsqueda de todos estos bloques usando la ecuación

🔥 Recomendado:  ChatGPT frente a Jasper.ai: ¿cuál es una mejor solución de Chatbot?

En esta ecuación, f00 es la función de búsqueda del bloque diagonal al píxel, f10 es la función de búsqueda del bloque vertical al píxel, f01 es la función de búsqueda del bloque horizontal al píxel, f11 es la función de búsqueda del bloque que contiene el píxel.

Con este método, los diferentes bloques se mejoran por separado y se combinan mientras se mantiene una transición suave entre los bloques. Este método también reduce el problema de amplificación de ruido que está presente en otros métodos de ecualización tradicionales. Cabe señalar que existen muchas más variaciones de técnicas de ecualización de histograma adaptativo basadas en la implementación.

Estoy abierto a las respuestas si desea discutir más sobre la ecualización de histogramas.

Publicado a través de Hacia la IA