Matlab - Interpolar crominancias

 
Vista:

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).
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Interpolar crominancias

Publicado por LuisDa (9 intervenciones) el 09/12/2008 16:12:47
Lo conseguí solucionar a base de desplazar las cromas a valores positivos después de obtener Y, Cr y Cb y retornar las cromas a sus rangos originales antes de hacer el proceso inverso. Curiosamente MatLab se comporta así.

Ahora bien, si la interpolación es bilineal, me oscurece y desatura los rojos, si es por repetición no hay problema. Cosa rara.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar