Showing posts with label ajuste de histograma. Show all posts
Showing posts with label ajuste de histograma. Show all posts

Monday, October 16, 2017

Programación lúdica: ecualización del histograma de una imagen



El proceso digital de imágenes tiene una serie de técnicas para poder manipular los pixeles de una imagen. En un artículo pasado vimos la manera de ajustar el contraste a partir de estirar el histograma de frecuencias de valores de los pixeles en una imagen de tonos de gris. Cabe señalar que en una imagen de grises solamente puede haber 256 tonos diferentes, cuyas componentes de color son: (0,0,0) que es el negro; (1,1,1) que es menos negro... y así hasta (255,255,255), que es blanco.

Desafortunadamente el estirar el histograma no sirve cuando la diferencia entre el contraste mínimo y máximo es de 255, porque la fórmula para cada nuevo pixel sería: (TonoDeGris / 255) * 255, lo cual sería dividir entre 255 y multiplicar entre 255, lo que dejaría el resultado como el pixel original. Por ello, es necesaria otra técnica y ésta es lo que se llama la "ecualización de un histograma".

Cuando uno "ecualiza" algo, por ejemplo, una señal de audio, lo que hacemos es que los bajos y los altos se igualen. En lo que se refiere a gráficas, cuando hay muchos pixeles oscuros entonces se reduce esa cantidad y si hay pocos pixeles claros, se incrementan estos.

Para "ecualizar" (o igualar) los valores del histograma, lo que tenemos que hacer es simplemente crear algo que se llama CDF (Cumulative Distribution Frequency), lo cual es simplemente un arreglo de 256 bytes que contienen la suma de los valores de las frecuencias de los valores previos. Por ejemplo, si tenemos valores de frecuencias para los tones de grises: 52 tenemos 1, 53 tenemos 3, 58 tenemos 2 y 59 tenemos 3, entonces el CDF será 1, 4, 6, 9, etcétera, para el CFD[52], CDF[58] y CDF[59]. Simplemente sumamos el valor actual con el anterior y listo. Teniendo este valor, solamente nos falta calcular la ecualización de cada pixel, la cual es una función como ésta, para cada pixel en la imagen: NuevoPixel = round(((CDF[R]-1) / CDF[255]) * 255).

Para ver si esto funciona, tomemos la siguiente imagen de Lena:



Y procesemos de acuerdo a lo que hemos dicho:



Puede observarse que la imagen se ecualizó y el contraste cambió significativamente. Nótese cómo el histograma se "estiró" de alguna manera.

Cabe señalar que esta técnica puede no ser necesariamente la mejor pero todo dependerá de qué queremos hacer y por qué queremos ecualizar una imagen.

A quien le interese este tema, escríbame a morsa@la-morsa.com y le enviaré el software ejecutable y el código fuente escrito en Delphi.

Saturday, October 14, 2017

Cómo realizar el contraste de una imagen


En el curso que doy en la Facultad de Ciencias de la UNAM, de Proceso Digital de Imágenes, enseño cómo hacer una serie de filtros, muchos de ellos se pueden ver directamente en Photoshop, aunque otros, sobre todo los artísticos, no parecen ser fáciles de saber cómo están hechos, porque no hay documentación al respecto y en el oráculo que es Internet no he encontrado referencias sobre los mismos.

De todas maneras en este blog ya he descrito muchos de los filtros que enseño y otros que incluso no están disponibles en Photoshop o que hacerlos mediante esta herramienta pudiese resultar muy problemático de simular.

Uno de los filtros más comunes es el del contraste, y existen un par de algoritmos para realizarlos. Cuando uno aplica este filtro lo que hace es mover normalmente un valor el cual modifica pixel a pixel la imagen con la que estamos trabajando. Sin embargo, el resultado final muchas veces se hace a "ojímetro", es decir, midiendo visualmente cómo se ve la imagen al aplicarle cierto contraste.

Hay, sin embargo, una idea interesante para contrastar imágenes de manera automática. Esto se hace a través del ajuste del histograma de una imagen, el cual se basa en diferentes pasos (primero hablaremos de imágenes en tonos de gris):

  1.  cargar la imagen a procesar
  2.  calcular el histograma de frecuencias de tonos de gris de la imagen
  3.  Localizar los valores máximo y mínimo de los pixeles y hacer la resta de forma absoluta, es decir, nos dará el máximo contraste en términos positivos
  4. Aplicar la siguiente fórmula: NuevoPixel = (TonoDeGris / MaximoContraste) * 255
  5. Colocar el tono de gris nuevo en los tres componentes del pixel procesado (RGB).


Cabe decir que si tomamos el máximo contraste (MaximoContraste) como 255, la fórmula simplemente no hace nada, pues tendríamos: NuevoPixel = (TonoDeGris / 255) * 255, lo cual da que el valor es simplemente NuevoPixel = TonoDeGris, o lo que es lo mismo, multiplicamos y dividimos por 255.

Por ejemplo, la siguiente imagen de Einstein (ver siguiente figura), muestra su histograma que, como puede verse, tiende a estar más oscura que clara. Si tomamos la diferencia de contrastes como 225, entonces podemos aplicar la fórmula mencionada y ver cómo mejora la imagen.



Obsérvese (siguiente imagen), el resultado de esto. Nótese cómo cambia el histograma también.



Este procedimiento, como se mencionó, falla si tomamos 255 como el máximo contraste porque entonces no le estamos haciendo nada a la imagen. Sin embargo, se me ocurrió que bien podría yo decirle el valor máximo de contraste y debería funcionar. Como no estaba seguro de esto, hice el programa en cuestión y ¡ay! hallé que en principio sirve, pero deja "artefactos", es decir, puntos indeseables que no deberían quedar en la imagen procesada (véase la siguiente imagen)



Este proceso puede hacerse para imágenes en color también (no lo he hecho aún), pero en los documentos y páginas web que he leído, aparentemente funciona. Ya hablaré de los resultados de este proceso usando color, pero pienso que igual que en el caso anterior de tonos de gris, en algunos casos el procedimiento también dejará artefactos.

La solución es hacer una ecualización del histograma, pero esto es más complejo y lo abordaremos en otro artículo. Mientras tanto, dejo accesible el código fuente y ejecutable en Delphi de este programa. Basta con pedírmelo a mi correo morsa@la-morsa.com y lo encontrará a la brevedad en su buzón.