Interpolar crominancias
Publicado por LuisDa (9 intervenciones) el 03/12/2008 08:30:58
Hola:
Estoy programando con MatLab un esquema (bastante simplificado) de codificación-decodificación de imagen en el que se basan los estándares de TV digital.
El caso: una de las primeras etapas consiste en convertir las bandas R, G y B (el tipo de datos es byte sin signo) de la imagen de entrada en la luminancia (Y) y las dos bandas de crominancia, Cr y Cb (esas bandas, Y, Cr y Cb, son de tipo double ahora).
Posteriormente he probado a hacer un submuestreo y posterior interpolación de las crominancias (dado que la banda de crominancia tiene menos definición que la de luminancia, se submuestrea a fin de reducir el volumen de información, pues el ojo humano no se dará cuenta y es menos sensible a detalles finos de color que de brillo). Para ello desarrollé tres bloques: uno de submuestreo, otro de expansión (coger la imagen reducida y expandirla insertando ceros, el resultado sería ver esa imagen como si estuviera tras una cortina negra diáfana) y otro de interpolación (el cual toma la imagen expandida e interpola los píxeles inicialmente nulos).
Probé primero la interpolación bilineal con una imagen monocroma, que es al fin y al cabo una luminancia (submuestreada, expandida y por último interpolada), y los resultados me parecieron satisfactorios (si acaso se apreciaba un ligero deterioro de los bordes, pero vi que se reconstruía muy bien). Concretamente, probé a calcular la diferencia entre la imagen original y la reconstruida, y el resultado era que solamente se veían los bordes de la imagen (vamos, un error no muy grande); ello me llevo a frotarme las manos, pues si con la luminancia podía recuperarse casi bien, con la crominancia, que tiene menos definición, ni se notaría la diferencia. PERO al hacer lo mismo con la banda de crominancia, los resultados ya no eran tan bonitos. Y me extrañó, pues las crominancias tienen menor definición que la luminancia. Entonces se me ocurrió que podría deberse a que el rango de una crominancia (que puede tomar tanto valores positivos como negativos) no es el mismo que el de una luminancia (de 0 a 255). Sé que no tiene mucho sentido pensar eso, pero a veces pasan esas cosas.
La máscara que utilicé para la interpolación bilineal fue la siguiente matriz:
| 1/4 1/2 1/4 |
H = | 1/2 1 1/2 |
| 1/4 1/2 1/4 |
Se me ha ocurrido entonces probar a trasladar los valores de la croma a positivos (sumando para ello el valor mínimo cambiado de signo, pues es negativo) y ver si los resultados mejorarían.
Alguien que entienda de tratamiento digital de imágenes o de vídeo, ¿se le puede ocurrir alguna otra solución? Espero vuestras respuestas.
NOTA: Probé a cambiar a interpolación por repetición de píxeles vecinos en vez de bilineal y el resultado era el mismo (la crominancia alterada en saturación y tinte).
Estoy programando con MatLab un esquema (bastante simplificado) de codificación-decodificación de imagen en el que se basan los estándares de TV digital.
El caso: una de las primeras etapas consiste en convertir las bandas R, G y B (el tipo de datos es byte sin signo) de la imagen de entrada en la luminancia (Y) y las dos bandas de crominancia, Cr y Cb (esas bandas, Y, Cr y Cb, son de tipo double ahora).
Posteriormente he probado a hacer un submuestreo y posterior interpolación de las crominancias (dado que la banda de crominancia tiene menos definición que la de luminancia, se submuestrea a fin de reducir el volumen de información, pues el ojo humano no se dará cuenta y es menos sensible a detalles finos de color que de brillo). Para ello desarrollé tres bloques: uno de submuestreo, otro de expansión (coger la imagen reducida y expandirla insertando ceros, el resultado sería ver esa imagen como si estuviera tras una cortina negra diáfana) y otro de interpolación (el cual toma la imagen expandida e interpola los píxeles inicialmente nulos).
Probé primero la interpolación bilineal con una imagen monocroma, que es al fin y al cabo una luminancia (submuestreada, expandida y por último interpolada), y los resultados me parecieron satisfactorios (si acaso se apreciaba un ligero deterioro de los bordes, pero vi que se reconstruía muy bien). Concretamente, probé a calcular la diferencia entre la imagen original y la reconstruida, y el resultado era que solamente se veían los bordes de la imagen (vamos, un error no muy grande); ello me llevo a frotarme las manos, pues si con la luminancia podía recuperarse casi bien, con la crominancia, que tiene menos definición, ni se notaría la diferencia. PERO al hacer lo mismo con la banda de crominancia, los resultados ya no eran tan bonitos. Y me extrañó, pues las crominancias tienen menor definición que la luminancia. Entonces se me ocurrió que podría deberse a que el rango de una crominancia (que puede tomar tanto valores positivos como negativos) no es el mismo que el de una luminancia (de 0 a 255). Sé que no tiene mucho sentido pensar eso, pero a veces pasan esas cosas.
La máscara que utilicé para la interpolación bilineal fue la siguiente matriz:
| 1/4 1/2 1/4 |
H = | 1/2 1 1/2 |
| 1/4 1/2 1/4 |
Se me ha ocurrido entonces probar a trasladar los valores de la croma a positivos (sumando para ello el valor mínimo cambiado de signo, pues es negativo) y ver si los resultados mejorarían.
Alguien que entienda de tratamiento digital de imágenes o de vídeo, ¿se le puede ocurrir alguna otra solución? Espero vuestras respuestas.
NOTA: Probé a cambiar a interpolación por repetición de píxeles vecinos en vez de bilineal y el resultado era el mismo (la crominancia alterada en saturación y tinte).
Valora esta pregunta


0