Categories: NoticiasTecnología

La función de mapeo y la implementación de circuitos en la ecualización de histogramas

En un artículo anterior, discutimos que igualar un histograma de imagen puede mejorar su contraste. Aquí veremos esta técnica con mayor detalle.
Primero, investigaremos un ejemplo simple. Luego, intentaremos desarrollar la intuición sobre cómo la función de mapeo de esta técnica aplana el histograma de la imagen. Finalmente, discutiremos brevemente la implementación del circuito del método de ecualización del histograma.

Ecualización de un histograma utilizando la función de mapeo

Suponga que el número de ocurrencias del valor de píxel xk en la imagen de entrada es nk (como se muestra en la Figura 1).


Figura 1

Para ecualizar este histograma, debemos mapear el valor de píxel xk a y dado por la siguiente ecuación:

(y = f (x_k) = (L-1) sum_ {j = 0} ^ k frac {n_j} {N} )
Ecuación 1

donde L es el número total de posibles niveles de gris (por ejemplo, L = 256 para una imagen de 8 bits) y N es el número total de píxeles en la imagen. El término de suma ( left ( sum_ {j = 0} ^ k frac {n_j} {N} right) ) es el número acumulado de píxeles cuyo valor gris está entre cero y xk.
Este término a veces se denomina "histograma de imagen normalizado acumulativo". Veamos un ejemplo simple.

Un ejemplo de función de mapeo
Considere una imagen de 3 bits con un total de 64⨉64 píxeles. Suponga que el histograma de esta imagen es como se muestra en la Figura 2.


Figura 2

Como puede ver, hay valores de píxeles que son mucho menos frecuentes que los demás. Los valores de píxel y su número de ocurrencias se dan en la segunda y tercera columnas de la Tabla 1, respectivamente.

k
xk
nk

y = f (xk)
(de la ecuación 1)

y = f (xk)
(Después del redondeo)

0 0
0 0
40
0,0684
0 0
1
1
80
0.2051
0 0
2
2
100
0.3760
0 0
3
3
2000
3.7939
4 4
4 4
4 4
1000
5.5029
6 6
5 5
5 5
756
6.7949
7 7
6 6
6 6
80
6,9316
7 7
7 7
7 7
40
7 7
7 7
tabla 1

Apliquemos la función de mapeo de la Ecuación 1 a este ejemplo. Con una imagen de 3 bits, hay ocho valores de píxeles diferentes, es decir, L = 23. Sustituyendo L = 8 y N = 64 x 64 = 4096 en la Ecuación 1, encontramos el valor de píxel de salida y = f (xk) para un determinado ingrese el valor de píxel xk como se indica en la cuarta columna de la tabla. Por ejemplo, la salida de la función de mapeo para x4 = 4 se puede encontrar como (y = f (x_4) = 7 times sum_ {j = 0} ^ 4 frac {n_j} {4096} = frac { 7} {4096} veces (40 + 80 + 100 + 2000 + 1000) = 5.5029 ).
Dado que el valor de píxel debe ser un número entero, podemos redondear esto a 6 (la última columna de la tabla). Podemos encontrar los otros valores de salida para esta función de mapeo de manera similar.
El histograma obtenido se muestra en la Figura 3.


figura 3

En este ejemplo, algunos de los valores de píxeles que son menos frecuentes, como xk = 0, 1 y 2, se asignan a un único valor de salida (y = 0). Esto conduce a un contenedor relativamente más grande con un valor de píxel de cero. Sin embargo, un valor de píxel frecuente, como xk = 3, se asigna a un valor (y = 4) al que no se asigna ningún otro valor de entrada. Debido a esto, los contenedores de histograma se vuelven relativamente ecualizados.
Sin embargo, esto no significa que tendremos contenedores ecualizados en todos los valores de píxeles. Por ejemplo, el histograma en la Figura 3 muestra que la altura de la papelera con un valor de píxel de 1 en realidad se reduce de 80 a cero. Por lo tanto, cuando aplicamos la técnica de ecualización del histograma, algunos de los bins del histograma original podrían desaparecer para igualar los otros bins.

¿Cómo realiza el mapeo acumulativo la ecualización del histograma?

Puede encontrar la derivación matemática de la ecuación 1 en los libros de texto (consulte la Sección 3.4.4 de Fundamentos del procesamiento de imágenes digitales de Chris Solomon).
En este artículo, intentaremos dar una explicación más intuitiva de cómo esta función de transferencia realiza la ecualización del histograma. Al igual que con el análisis matemático de los libros de texto, primero asumiremos que el valor de píxel es una variable continua y utilizaremos los resultados para explicar el caso discreto.

Un caso continuo

Considere la función de ejemplo que se muestra en la Figura 4. En esta figura, el valor de píxel es una variable continua que varía de 0 a L-1.


Figura 4

Necesitamos encontrar una función de mapeo que transforme la función anterior en la función uniforme que se muestra en la Figura 5. Suponiendo que el número total de píxeles es N, el valor de la función ecualizada debería ser ( frac {N} {L-1 } ).
Esto se debe al hecho de que la integral de la función en el caso continuo ( left ( frac {N} {L-1} times (L-1) right) ) puede considerarse como el número total de píxeles En el caso discreto, la integral se convierte en una suma de los recuentos de los diferentes valores de píxeles que obviamente da el número total de píxeles.


Figura 5

La función original tiene tres rangos de valores de píxeles diferentes indicados por R1, R2 y R3 con valores h1, h2 y h3, respectivamente. Los rangos R1, R2 y R3 se asignan a r1, r2 y r3 en la Figura 5. Consideremos el rango denotado por R1.
El área de la función en este rango (h1R1) indica el número de píxeles con un valor entre 0 y x1. Todos estos píxeles deben asignarse al rango r1 para que obtengamos una función plana con un valor de ( frac {N} {L-1} ) (Figura 5). Como el número total de píxeles en el rango R1 es el mismo que el número de píxeles en r1, el área h1R1 debería ser igual al área de la nueva función en el rango r1. Por lo tanto, tenemos:

(h_1R_1 = frac {N} {L-1} r_1 )

Esto da:

(r_1 = frac {L-1} {N} h_1R_1 )
Ecuación 2

La ecuación anterior especifica el rango al que se asignarán los valores de los píxeles de entrada en el rango R1. Se puede derivar una ecuación similar para cualquier subrango de 0 a x donde x es menor o igual que R1. Por lo tanto, para (x leq R_1 ), el valor de píxel de entrada x debe asignarse al valor de píxel y dado por la siguiente ecuación:

(y = frac {L-1} {N} h_1x ; ; for ; ; x leq R_1 )
Ecuación 3

Esta ecuación extiende los valores de píxel de la función original que reside en el rango R1 sobre el rango r1, de modo que el valor de la función de salida es ( frac {N} {L-1} ).
Del mismo modo, los píxeles en el rango R2 deben asignarse al rango r2 con un valor de función de ( frac {N} {L-1} ) (Figura 5). Como el número de píxeles es fijo, tenemos:

(h_2R_2 = frac {N} {L-1} r_2 )

Esto da:

(r_2 = frac {L-1} {N} h_2R_2 )
Ecuación 4

Nuevamente, podemos modificar la ecuación anterior para obtener una ecuación que sea válida para un subrango arbitrario de R2. Para (x_1 <x leq x_2 ), el valor de píxel de entrada x debe asignarse al valor de píxel y dado por la siguiente ecuación:

(y = r_1 + frac {L-1} {N} h_2x )

El primer término de la ecuación anterior tiene en cuenta que el rango R1 ya está asignado a r1. El segundo término se deriva de la ecuación 4. Sustituyendo el valor de r1 de la ecuación 2 se obtiene:

(y = frac {L-1} {N} h_1R_1 + frac {L-1} {N} h_2x = frac {L-1} {N} (h_1R_1 + h_2x) ; ; para ; x_1 <x leq x_2 )
Ecuación 5

De manera similar, para (x_2 <x leq L-1 ), el valor de píxel de entrada x debe asignarse al valor de píxel y dado por la siguiente ecuación:

(y = frac {L-1} {N} h_1R_1 + frac {L-1} {N} h_2R_2 + frac {L-1} {N} h_3x = frac {L-1} {N} (h_1R_1 + h_2R_2 + h_3x) ; ; para ; x_1 <x leq L-1 )
Ecuación 6

Para resumir, de acuerdo con las ecuaciones 3, 5 y 6, podemos encontrar el valor de píxel de salida de un valor de píxel de entrada dado x calculando la integral de la función original de 0 a x y multiplicando el resultado por ( frac {L -1} {N} ). La discusión anterior es válida para la función de ejemplo representada en la Figura 4.
¿Podemos extender este resultado a una función arbitraria?
Tenga en cuenta que podemos usar una función de escalera para aproximar funciones de interés práctico (ver Figura 6). Por lo tanto, el resultado anterior se puede extender a otros tipos de funciones.


Figura 6

Por lo tanto, para encontrar la salida de la función de ecualización para un valor de píxel de entrada x, integramos la función original H (x) de 0 a x y multiplicamos el resultado por ( frac {L-1} {N} ):

(y = f (x) = frac {(L-1)} {N} int_0 ^ xH (t) dt )
Ecuación 7

donde t es una variable ficticia de integración.

Caso discreto

Los valores de intensidad en imágenes digitales reales adquieren valores discretos. En este caso, la integral en la ecuación 7 debe reemplazarse por una suma sobre los recuentos de píxeles. Esto nos da la ecuación que presentamos en la primera sección de este artículo:

(y = f (x) = frac {(L-1)} {N} sum_ {j = 0} ^ xn_j )
Ecuación 8

Es importante tener en cuenta que, a diferencia de la transformación continua, el mapeo discreto no puede producir una salida perfectamente ecualizada. Por ejemplo, el histograma ecualizado en la Figura 3 tenía algunos contenedores de altura cero. Aunque no puede producir una salida perfectamente ecualizada, la aproximación discreta puede conducir a un histograma más plano y mejorar el contraste de la imagen.

Implementación de circuito

En esta sección, veremos brevemente la implementación del circuito de la técnica de ecualización del histograma. Necesitamos obtener el histograma de la imagen y usarlo para encontrar la función de mapeo de la Ecuación 1. En la Figura 7 se muestra un diagrama de bloques simplificado para obtener el histograma de la imagen.


Figura 7

La memoria se utiliza para almacenar el histograma de la imagen. En esta implementación, asumimos que la entrada es una imagen en escala de grises de ocho bits de tamaño 256 × 256 píxeles. Una imagen de ocho bits tiene 256 valores de píxeles diferentes. Por lo tanto, la memoria debe tener 256 filas para almacenar el recuento de los diferentes valores de píxeles. ¿Cuántos bits necesitamos en cada fila de la memoria? El número total de píxeles es 256 ✕ 256 = 216.
Por lo tanto, necesitamos una memoria de 256 ✕ 16 bits para poder almacenar los datos del peor de los casos donde todos los píxeles de la imagen son del mismo valor.
Inicialmente, la memoria se restablece (el recuento inicial de todos los valores de píxeles es cero). Luego, los valores de píxeles de la imagen de entrada se aplican al puerto de dirección de la memoria uno por uno. Con cada valor de píxel aplicado al puerto de dirección de memoria, el recuento actual de ese nivel de gris aparece en el puerto de lectura de la memoria. El valor actual aumenta en uno y el resultado se almacena en el registro de 16 bits.
En el siguiente ciclo de reloj, el contenido del registro se aplica al puerto de escritura de la memoria para actualizar el recuento actual del valor de píxel de entrada. Cuando se procesan todos los píxeles, la memoria contendrá el recuento total de los diferentes valores de píxeles (la información del histograma).
Para implementar la Ecuación 8, necesitamos calcular la suma de píxeles cuyo valor gris está en un rango específico. La suma debe multiplicarse por L-1 y dividirse por N. La suma se puede obtener aplicando los datos almacenados en la "Memoria de histograma" a un acumulador como se muestra en la Figura 8.


Figura 8

El "Contador de generación de direcciones" hace que los valores de bin consecutivos del histograma (almacenados en la "Memoria de histograma") aparezcan en la entrada del "Acumulador". El valor de bin actual se agrega a la suma de los valores de bin anteriores y el resultado se almacena en la "Memoria de histograma acumulativo". La dirección de la "Memoria de histograma acumulativo" también se puede obtener del "Contador de generación de direcciones".
¿Cómo podemos aplicar el factor de escala ( frac {L-1} {N} ) a los datos de la "Memoria de histograma acumulativo"?
Existen varios métodos diferentes. Una técnica inteligente discutida en la Sección 7.1.2 del libro "Diseño para el procesamiento de imágenes incrustadas en FPGA" de Donald G. Bailey modifica la estructura del acumulador para realizar la acumulación y la división en un solo bloque. Otra técnica común se basa en la aproximación del factor de escala ( frac {L-1} {N} ). Por ejemplo, con L = 256 y N = 256 ✕ 256 = 216, tenemos

( frac {(L-1)} {N} = frac {256-1} {256 times 256} simeq frac {1} {256} )

La división por 256 = 28 se puede obtener simplemente desplazando los datos binarios a la derecha por 8 bits. Por lo tanto, podemos descartar los ocho bits inferiores de los datos en la "Memoria de histograma acumulativo" para obtener los valores de salida de la función de asignación de ecualización.

Resumen

En este artículo, observamos la técnica de ecualización del histograma con mayor detalle. Intentamos desarrollar la intuición sobre cómo la función de mapeo de esta técnica aplana el histograma de la imagen. También discutimos brevemente la implementación del circuito del método de ecualización del histograma.

Para ver una lista completa de mis artículos, visite esta página.

Maria Montero

Me apasiona la fotografía y la tecnología que nos permite hacer todo lo que siempre soñamos. Soñadora y luchadora. Actualmente residiendo en Madrid.

Recent Posts

Máquina de mano Lean, Green, Raspberry Pi

Los días felices de la PDA y Blackberry han quedado definitivamente atrás, pero el factor…

2 years ago

Cómo pronosticar series de tiempo usando autorregresión

Tutorial sobre cómo pronosticar usando un modelo autorregresivo en PythonFoto de Aron Visuals en UnsplashForecasting…

2 years ago

Aquí están todas las formas en que puede cargar su AirPods Pro

Si tienes un iPhone, los AirPods Pro son la opción obvia para escuchar música, ¡aunque…

2 years ago

Las principales noticias tecnológicas del lunes: la prohibición de clientes de terceros de Twitter parece no ser un accidente

Ilustración de Alex Castro / The Verge Plus nuevos rumores sobre el quinto Galaxy Fold.…

2 years ago

AirPods Max 2: aquí están las características más solicitadas

Se rumorea que los auriculares premium de próxima generación de Apple, los AirPods Max 2,…

2 years ago

El remake de Dead Space continúa luciendo terriblemente genial en el nuevo tráiler de la historia

El desarrollador Motive Studio y el editor EA han lanzado un nuevo tráiler de la…

2 years ago