Transformaciones del histograma.
La diferencia entre diferentes dispositivos (televisores, cámaras, escáneres) se modela con una transformación de gama.
Si el comportamiento del dispositivo fuera perfectamente lineal, Gama = 1.
Blanco
Negro
¿Dónde está el 50% de gris? ¿Es la escala lineal?
¿Dónde estaría si tomáramos una foto?
Transformaciones del histograma.
Otra transformación habitual es la ecualización del histograma (del latín aequalis = igual).
Ecualización del histograma: es una transformación definida de forma que el histograma resultante se reparte uniformemente en todo el rango de grises.
(Gp:) 0
(Gp:) 255
(Gp:) 127
(Gp:) 0
(Gp:) 255
(Gp:) 127
0
255
128
64
192
0
255
128
64
192
¿?
En este caso se usa una función escalonada:f: array [0..255] de byte
+
Transformaciones del histograma.
¿Cómo definir f para conseguir la ecualización?
Idea: suponer que a la salida hay 5 niveles de gris.
(Gp:) 0
(Gp:) 255
(Gp:) 127
0
255
128
64
192
(Gp:) 0
(Gp:) 4
(Gp:) 2
(Gp:) 1
(Gp:) 3
20%
20%
20%
20%
20%
para todo píxel (x,y) de R hacer
R(x,y):= f[A(x,y)]
(Gp:) 0
(Gp:) 4
(Gp:) 2
(Gp:) 1
(Gp:) 3
Transformaciones del histograma.
Algoritmo. Cálculo de la función de ecualización del histograma.
Entrada. Histograma: array [0,…,255] de entero
np: entero (número total de píxeles = mx*my)
Salida. f: array [0,…,255] de byte
Algoritmo:
f[0]:= 0
acumulado:= Histograma[0]
para i:= 1, …, 254 hacer
f[i]:= acumulado*255/np
acumulado:= acumulado + Histograma[i]
finpara
f[255]:= 255
La función de ecualización es la integral del histograma, escalada por el factor 255/np.
Transformaciones del histograma.
Imagen de entrada (A)
Imagen ecualizada (R)
Histograma de A
Histograma de R
Función f
+
Transformaciones del histograma.
Ejemplos. Ecualización del histograma.
Cuidado, en algunos casos los resultados pueden ser artificiosos.
Cada canal (R,G,B) es ecualizado por separado
Transformaciones del histograma.
Umbralización de imágenes. En algunas aplicaciones puede ser interesante convertir la imagen en binaria, o recortar cierto rango de valores.
Las funciones tienen las siguientes formas:
0
255
128
64
192
(Gp:) 0
(Gp:) 255
(Gp:) 128
(Gp:) 64
(Gp:) 192
Valor de entrada
Valor de salida
Umbralizar la imagen con valor cte.
0
255
128
64
192
(Gp:) 0
(Gp:) 255
(Gp:) 128
(Gp:) 64
(Gp:) 192
Valor de entrada
Cortar un rango y mantener el resto
0
255
128
64
192
(Gp:) 0
(Gp:) 255
(Gp:) 128
(Gp:) 64
(Gp:) 192
Valor de entrada
Seleccionar un rango
Umbral
Umbral inferior
Umbral superior
+
Transformaciones del histograma.
Las funciones serán del estilo:
f(v):= si v > umbral1 entonces g(v)
sino h(v)
Transformación de binarización (saturar a 0 ó 255).f(v):= si v < umbral entonces 0 sino 255
Ejemplo 1. La binarización se suele aplicar en OCR.
Imagen de entrada (256 grises)
Umbral = 160
Umbral = 215
Transformaciones del histograma.
Imagen de entrada
Umbralizar, u = 42
Umbralizar, u = 180
Cortar rango (192, 255)
La separación del objeto del fondo se llama segmentación.
La umbralización se puede usar para segmentar…
… aunque por sí sola no suele funcionar muy bien.
Ejemplo 2. Segmentación de objetos.
Transformaciones del histograma.
Conclusiones:
Una transformación elemental se puede ver desde distintas perspectivas:
Como una función unidimensional: f: N ? N
Como una curva tonal.
Como una modificación del histograma.
La característica fundamental es que cada píxel se trata independientemente de los demás.
Los histogramas son útiles para encontrar la transformación adecuada.
En imágenes RGB, aplicamos la misma operación a los 3 canales para que se mantenga el color.
Página anterior | Volver al principio del trabajo | Página siguiente |