
2007-03-05
|
 |
Bestia

|
|
Registrado: Oct 2004
Posts: 2.504
FoquiMoney: 9.506
Gracias dadas: 27
Agradecido 204 vez en 63 posts
|
|
|
Matrices de Cuantización (Quantization Matrices): ¿para qué sirven?
Hace tiempo que ando interesado en conocer cómo funcionan estas matrices para video. Ahora creo estar en condiciones de explicar de forma simple qué son, para qué sirven y cómo funcionan.
Seguramente, todos hemos visto que la mayoría de los codecs de compresión tienen una opción para especificar una matriz de 8x8 que tiene ciertos números en sus casilleros. Los codecs conocidos que utilizan estas matrices son MPEG-1/2, MPEG-4 ASP (DivX, XviD, 3ivX) y MPEG-4 AVC/H.264 (x264). Estas matrices tienen que ver directamente con la calidad de imagen que queremos obtener de nuestra película.
Navegando por internet encontré una muy buena explicación de cómo funcionan las matrices para XviD. Más adelante volveré para explicar para MPEG-1/2 y H.264:
Con XviD no sólo se puede usar diferentes Matrices de Cuantización incluidas, como H.263 y MPEG, sino también matrices personalizadas, hechas por uno mismo o por otro. Dado que poca gente entiende realmente lo que hace una matriz, trataré de explicarlo de forma simple, incluso para los que no son expertos en matemáticas.
Hasta aquí todos habrán oído sobre los macrobloques (macroblocks). Estos son bloques de 16x16 o 32x32 de los cuales se compone un cuadro MPEG-4. Estos macrobloques contienen 4 bloques de 8x8 que se agrupan entre sí. Esos bloques de 8x8 forman la base de la compresión MPEG-4.
En vez de star compuestos por pixeles, como una imagen de mapa de bits (BMP) o un cuadro de película, un bloque es más como una representación de una fórmula compleja que trata de imitar el contenido de la imagen original de la mejor forma posible.
El ojo humano es mucho más sensible a los cambios en el brillo, o Luminancia, que en el color. Por lo tanto, MPEG-4 utiliza un tipo de espacio de color en su estructura de archivo que asigna menos bits de información a los cambios de color que a los cambios en el brillo.
Un bloque de 8x8 no está hecho de pixeles, sino de un valor único que representa el brillo (o color) promedio, y todos los valores restantes son representaciones matemáticas de la variación de este promedio en todo el bloque. En otras palabras, tenemos una media básica, o valor promedio, y toda la variación, o detalle de la imagen, está representada por el valor final de una fórmula compleja dada.
Los otros lugares en el bloque de 8x8, que de forma indiferente pero inadecuada llamamos pixeles, representan diferentes tipos de detalle, y especialmente la variación de este detalle.
Tomemos un bloque:
X X X X X X X X
X X X X X X X X
X X X X X X X X
X X X X X X X X
X X X X X X X X
X X X X X X X X
X X X X X X X X
X X X X X X X X
La primera posición en la esquina superior izquierda representa el promedio, o valor medio. Así, si el bloque completo es café oscuro o rojo claro en promedio, esta posición lo indica. Desde aquí hacia la derecha o hacia abajo, tenemos representaciones de la variación de este valor.
Ahora esto es difícil de entender, ¡así que ojo!
Yendo de izquierda a derecha, o de arriba a abajo, la cantidad de detalle aumenta. Si se toma la imagen original de 8x8 bits, el detalle se transforma a valores dependiendo de una cierta frecuencia a la cual se presenta el detalle. El detalle más fino se representa por frecuencias más altas. Así, mientras más a la derecha del bloque, más alta es la frecuencia (o más fino es el detalle).
Tomemos tres ejemplos:
Una imagen de 8x8 con una gran barra de acero en ella tiene poco detalle, por lo tanto tiene una frecuencia muy baja.
Una imagen de 8x8 con cuatro palos de escoba en ella tiene algo de detalle, por lo tanto tiene una frecuencia media.
Una imagen de 8x8 con lluvia, un campo de maíz o un cabello en ella tiene mucho detalle, por lo tanto tiene una frecuencia muy alta.
Como puede suponerse, los valores en un bloque representan la frecuencia horizontal y vertical en la imagen original.
La formula que realiza la conversión o transformación de detalle a frecuencia se conoce como Transformación Discreta del Coseno (Discrete Cosine Transformation) o TDC (DCT).
Luego, si miramos un bloque de la forma que acabamos de comprender, podemos ver lo siguiente:
Code:
Brillo y color promedio del bloque
│
│ Baja frecuencia, (mayor) detalle
│ │
│ │ Media frecuencia, detalle (normal)
│ │ │
│ │ │ Mayor frecuencia,
│ │ │ detalle (fino)
│ │ │ │
X--X--X--X--X--X--X--X
X--\--X--X--X--X--X--X
Detalle de baja frec.── X--X--\--X--X--X--X--X
X--X--X--\--X--X--X--X
Detalle de frec. Media─ X--X--X--X--\--X--X--X
X--X--X--X--X--\--X--X
X--X--X--X--X--X--\--X
Detalle de alta frec.───X--X--X--X--X--X--X--A
│
│
Representación matemática del detalle más
fino, horizontal y verticalmente
Listo, ya entendemos cómo se forma un bloque.
Entonces, ¿cómo funcionan las matrices de cuantización?
Una matriz de cuantización (en adelante MC) se ve algo así:
08 16 19 22 26 27 29 34
16 16 22 24 27 29 34 37
19 22 26 27 29 34 34 38
22 22 26 27 29 34 37 40
22 26 27 29 32 35 40 48
26 27 29 32 35 40 48 58
26 27 29 34 38 46 56 69
27 29 35 38 46 56 69 83
Detrás de esto hay un proceso realmente complejo, pero trataré de describirlo de forma simple:
Cada valor en la MC es la tolerancia para la conversión TDC de detalle a frecuencia. Todo detalle menor a la tolerancia no será considerado como detalle y NO será codificado. Simplemente será descartado.
Ahora se entiende porqué XviD es conocido como un codec con pérdidas. Descarta detalles. El detalle descartado es determinado por la MC.
Como puede verse, mientras más a la derecha y más hacia abajo, mayor es la tolerancia. Mientras más fino el detalle, más debe notarse el detalle del resto de la imagen para ser codificado y no descartado.
Digamos que se tiene una imagen de una muchacha con cabello rubio largo parada frente a un muro de un gris muy claro y detrás de dos barras de una reja de prisión (¿no nos gusta ver eso ahora? ) obviamente es difícil de imaginar eso en una imagen de 8x8 pero aguántenme por un minuto.
La muchacha rubia y el muro tendrán poco contraste entre ellos, por lo que la diferencia entre los valores promedio para brillo y contraste y los máximos no será demasiada.
Los valores serán menores y no variarán demasiado por sobre la tolerancia. Esto implica menos diferencia que tiene que codificarse y la imagen tendrá alta compresión.
Si el muro fuera negro, el contraste sería mucho mayor y la diferencia entre el valor promedio (algo gris) y los extremos (rubio y negro) sería mucho mayor también. Los valores, que variarían demasiado por sobre la tolerancia, tendrían que codificarse. Por lo tanto, en escenas de mayor contraste la compresión es menor, cosa que obviamente ya sabemos.
Ahora, las dos barras de la reja frente a la muchacha son detalle, que no es muy fino. Por lo tanto, tienen una frecuencia baja y será codificado si su diferencia del promedio está por sobre la tolerancia. Así, asumiendo que no son rubias, serán codificadas . Por otro lado, la muchacha tiene cabello, cuya textura es lógicamente muy fina. Por lo tanto el cabello tiene mucho detalle y tiene una frecuencia muy alta.
Como puede verse en nuestra MC, la tolerancia para frecuencias altas es mucho mayor que para frecuencias bajas. Por lo tanto el detalle fino (cabello) tiene que diferenciarse mucho más de los valores promedios para codificarse. Así que a menos que la diferencia sea muy alta, que en este caso sabemos que no es así, los detalles del cabello no se codificarán. La cosa sería distinta si tuviera cintas de colores en el cabello, ya que aumentaría el contraste.
Por lo tanto, el resultado final es que mientras más fino sea el detalle, se requiere que mayor sea el contraste de los valores promedio de la imagen, para que se codifique. Obviamente esto se realiza en base a cada bloque y no en una imagen completa, que en general consiste en más de un bloque de 8x8. Esperemos que se pueda ver mediante de esta simplificación.
Ahora puede entenderse porqué algunas matrices suavizan la imagen, como H.263, mientras que otras como MPEG producen una imagen más nítida. Los valores en una MC simplemente dan un detalle más fino a una tolerancia menor y por lo tanto tienden más a codificar detalles más finos, a cambio de menor compresión. Puede verse también que la MC que se dio como ejemplo no es de mucha compresión; los valores son más bien bajos.
Otros puntos:- Los créditos finales de una película suelen tener muy poco detalle, por lo que puede asignarse una MC especialmente para esto, con MUCHO MÁS compresión.
- Una matriz de compresión extrema simplemente aumenta todos los detalles más finos para que sólo unos pocos sean codificados.
- Pueden asignarse matrices específicas para tipos de contenido específicos.
Pueden asignarse matrices especiales para aventuras espaciales de ciencia ficción, anime y animación y escenas selváticas.
- Si se conoce la frecuencia exacta de artefactos de entrelazado, ¡puede aumentarse su tolerancia para filtrarlas!
- Lo mismo podría funcionar para otros tipos de ruido y artefactos.
- No sé si una MC se destina para información de luminancia y color a la vez, supongo que así es, pero dos MCs para luminancia y color por separado producirían una mayor afinación (no sé si cumpliría con MPEG-4 o incluso si es posible).
Además debe especificarse una matriz intra, que se aplica a los bloques 8x8 de un cuadro I de video, y una matriz non-intra que se aplica a las variaciones entre cuadros (cuadros P y B).
La explicación anterior se aplica también para MPEG-1/2 y H.264, pero con algunas alteraciones. Específicamente, los tres estándares utilizan las matrices de igual forma, pero con algunas cosas a considerar.
Sabemos que el estándar más eficiente es H.264, seguido por MPEG-4 ASP MPEG-1/2 al final. Esto se debe al valor de cuantización necesaria para que así sea.
El valor de cuantización es un número que se aplica a cada bloque de 8x8 y corresponde a un divisor para los componentes de la matriz. Así, si dicho valor es muy alto la calidad disminuye, mientras que si es bajo la calidad es mayor. El valor de cuantización difiere entre los estándares en razón de su eficiencia. Por ejemplo un valor de 18 en H.264 equivale aproximadamente a 2 en MPEG-4 ASP.
El funcionamiento de las matrices puede experimentarse mediante la codificación con factor de cuantización (quantization factor) constante. Sin embargo, la calidad debe medirse de forma objetiva (métodos PSNR, SSIM, VQM).
Construir matrices no es fácil. En Internet existen matrices diseñadas para bajos bitrates (56-500 kbps), que suavizan la imagen para una visión más agradable, bitrates medios (500-2000 kbps) que optimizan los bordes a costa de un poco de detalle, altos bitrates (2000-8000 kbps) que son adecuadas para mantener el detalle en la imagen, y para alta definición (8000-20000 kbps) que optimizan la visión en este tipo de resolución. Las más adecuadas para TV parece ser la HVS (Human Visual System) que recrea la visión humana descartando toda la información que nuestros ojos no ven.
Les adjunto un programa para “visualizar” gráficamente las matrices y unos pack de matrices que encontré por ahí.
Matrices para MPEG-2
Matrices para MPEG-4 ASP
Custom Quantization Matrix Editor 1.0
Saludos
By ALEX-KID
|

2007-03-05
|
 |
Animal

|
|
Registrado: Feb 2006
Posts: 2.156
FoquiMoney: 8.307
Gracias dadas: 5
Agradecido 97 vez en 51 posts
|
|
|
Re: Matrices de Cuantización (Quantization Matrices): ¿para qué sirven?
buen texto
hace tiempo habia escuchado de esto pero no me habia puesto a leer
com siempre se agradece esta informacion
voy revisar los packs esos pa entender mejor
shaolin
|

2007-03-05
|
 |
Moderador

|
|
Registrado: Sep 2004
Posts: 8.340
FoquiMoney: 5.971
Gracias dadas: 0
Agradecido 31 vez en 12 posts
|
|
|
Re: Matrices de Cuantización (Quantization Matrices): ¿para qué sirven?
Muy buen aporte, pero lamentablemente es una lectura incomprensible para la mayoria de los simios que visitan este foro, esos que con suerte saben lo que es un codec...
Saludos...
|

2007-03-06
|
 |
Bestia

|
|
Registrado: Oct 2004
Posts: 2.504
FoquiMoney: 9.506
Gracias dadas: 27
Agradecido 204 vez en 63 posts
|
|
|
Re: Matrices de Cuantización (Quantization Matrices): ¿para qué sirven?
Lo sé estimado moderador. De todos modos, me doy por satisfecho con que sepan que las matrices influyen en la calidad de video. Si entienden cómo influye, mejor; si entienden lo del valor de cuantización, mejor aún; y sería ideal que pensaran algo como "el programa que uso no me da esas opciones, algo me debo estar perdiendo" (ConvertXToDVD, SUPER, y la mayoría de los "todo en uno").
De todas formas, este artículo está pensado para mostrar cómo funcionan y cómo se usan las matrices. Construir una es complicado hasta para mí. De hecho tienes que conocer la matemática detrás de esto para que la matriz sea "usable". Pero con tantas matrices ya creadas que están dando vueltas por internet eso no es necesario.
Saludos
By ALEX-KID
|

2007-03-07
|
 |
Hij@'e Puta

|
|
Registrado: Sep 2004
Posts: 5.455
FoquiMoney: 11.100
Gracias dadas: 89
Agradecido 150 vez en 70 posts
|
|
|
Re: Matrices de Cuantización (Quantization Matrices): ¿para qué sirven?
Muy interesante y bastante complicado a decir verdad(a menos que quieras dedicarle tiempo), voy a descargar las matrices para mpeg2 a ver qué resulta.
Gracias
|
Personas en esta discusión: 1 (0 usuario(s) y 1 invitado(s))
|
|
|
Todas las horas son GMT -3. La hora es 16:51.
|
|