SlideShare une entreprise Scribd logo
1  sur  82
Télécharger pour lire hors ligne
PROYECTO FINAL DE CARRERA 
COMPRESIÓN DE IMÁGENES Y VIDEO 
(formato MPEG2) 
Fernando Martín Pap 
Director: Mg. Silvia Mabel Castro 
UNIVERSIDAD NACIONAL DEL SUR – BAHIA BLANCA – 
ARGENTINA 
Departamento de Ciencias e Ingeniería de la Computación 
Ingeniería en Sistemas de Computación 
x de abril de 2005
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
AGRADECIMIENTOS 
A mis padres y hermanos, que siempre confiaron en mi, me han apoyado en 
todo momento y me dieron fuerzas para poder cumplir mi meta. 
A mi directora, por todo el tiempo que me dedicó, por sus recomendaciones y 
por haber confiado en mi. 
A todos aquellos que hicieron que mis años de estudio hayan sido realmente 
maravillosos. 
2 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
ÍNDICE 
Introducción 6 
Percepción 6 
El sistema visual 7 
El ojo 7 
La retina 7 
Los conos 8 
Los bastones 9 
Psicofísica visual 9 
El sistema auditivo 11 
El oído 12 
La membrana basilar 12 
Psicofísica auditiva 13 
Bandas críticas 13 
Enmascaramiento frecuencial 14 
Enmascaramiento temporal 15 
Compresión 16 
Codificación de Huffman 16 
Codificación aritmética 19 
Compresión de imágenes 20 
Compresión de imágenes con pérdida 21 
Submuestreo (subsampling) 21 
Formatos de muestreo de YCbCr 23 
Transformada discreta del coseno (DCT) 24 
Wavelet 28 
Formato de imagen JPEG 30 
Esquema secuencial (baseline) 32 
Cuantificación 33 
Recorrido en zigzag 35 
Codificación RLC 35 
3 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Codificación DPCM 36 
Codificación entrópica 37 
Codificación de los coeficientes DC Diferenciales 37 
Codificación de los coeficientes AC 38 
Caso de estudio: COMPRESSLIB 40 
Librería de compresión de imágenes 41 
Muestreo 43 
Discretización en bloques 45 
Transformación DCT 45 
Cuantificación 48 
Codificación DPCM 49 
Recorrido en zigzag y codificación RLC 50 
Codificación de Huffman 54 
Compress demo 56 
Image viewer 57 
Compresión de video 59 
Codificación temporal 60 
Compensación de movimiento 60 
Compresión de audio 61 
Replicación de banda espectral (SBR) 61 
Formato de video MPEG2 62 
Perfiles y niveles 63 
Capas 63 
Codificación de video 64 
Cuadros I, P, B, D 64 
Compensación de movimiento 65 
Codificación de audio 66 
Modelo psicoacústico 67 
Multiplexado y sincronización de audio y video 69 
4 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Trenes de programa y de transporte 69 
Tren de programa 69 
Tren de transporte 70 
Unidades de presentación y de acceso 70 
Trenes elementales empaquetados (PES) 71 
Multiplexado del tren de programa 72 
Multiplexado del tren de transporte 72 
Encabezado del paquete de transporte 73 
Información específica de programa (PSI) 73 
Buffers del codificador y del decodificador 74 
Estampillas de tiempo y referencias de reloj 75 
Estampilla de tiempo de presentación (PTS) 77 
Estampilla de tiempo de decodificación (DTS) 77 
Asignación de estampillas de tiempo 78 
Librerías de reproducción de video MPEG 78 
Librería SMPEG 79 
Bibliografía 82 
5 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
INTRODUCCIÓN 
Históricamente la representación de la información ha sido una de las áreas 
que ha generado mucho interés. En los comienzos de la computación, las 
limitaciones en los medios de almacenamiento convirtieron en una tarea crucial la 
representación óptima de la información. Técnicas de compresión como la 
codificación de Lempel-Ziv, de Huffman, o la aritmética, permitieron representar la 
información con mucho menor cantidad de datos. 
En las tres técnicas anteriormente mencionadas se procesan los datos de 
modo tal de evitar almacenar información redundante. Si la información 
recuperada luego del proceso de descompresión es exactamente igual a la 
original, decimos que es un proceso de compresión sin pérdida, en caso contrario 
se dice que es un proceso de compresión con pérdida. 
La primera de las alternativas se basa en la redundancia estadística (entropía) 
de los datos y es de un uso muy general, ya que no pierde información. La 
segunda puede lograr relaciones de compresión mucho mejores, pero lo hace 
mediante la eliminación de información. Cuanto más información se elimine, mayor 
será la relación de compresión, pero la calidad de la información recuperada será 
menor. Debido a esto entra en juego la noción de calidad —que es inversamente 
proporcional a la relación de compresión. 
La compresión con pérdida sin embargo, sólo puede utilizarse para datos con 
forma específica, pues en algunos casos los datos son intolerantes a la pérdida de 
información. La compresión de imágenes, sonido y video son áreas de gran interés 
que, basándose en la percepción humana, descartan información irrelevante para 
poder lograr su cometido. 
Afortunadamente la tecnología de almacenamiento ha evolucionado de un 
modo considerable, no obstante el problema persiste. Áreas como la televisión 
satelital, teleconferencias, telefonía visual, la industria cinematográfica, grandes 
bases de datos multimedia, etc., no podrían existir —incluso aprovechando la 
actual tecnología de almacenamiento disponible— si no fuera por la posibilidad de 
compresión de datos. 
PERCEPCIÓN 
El ser humano posee muy buenos sensores que le permiten obtener una 
representación del mundo exterior. Esto lo logra a través del sentido de la vista, del 
oído, del tacto, del olfato y del gusto. Al tratarse de una investigación sobre 
compresión de imágenes y de video, nosotros sólo nos concentraremos en el 
sentido de la vista y del oído. Tanto el ojo como el oído tienen sus características 
especiales y sus limitaciones. El estudio detallado de éstas ha hecho posible el 
desarrollo de técnicas de compresión —tanto de sonido como de imágenes y 
video— que permiten ponderar la información, de manera tal de priorizar los datos 
de mayor relevancia para nuestros órganos. Primero analizaremos brevemente la 
visión humana, luego la audición. 
6 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
El sistema visual 
La vista es uno de los cinco sentidos corporales, por el que se percibe la luz y 
que da a conocer el color, la forma, la distancia, el tamaño y el movimiento de los 
cuerpos. 
La visión contribuye a informarnos de nuestra posición y mantiene conexiones 
con los centros que rigen el equilibrio postural. Es el resultado de una serie de 
fenómenos sucesivos que se producen de modo coordinado: 1) formación de la 
imagen en la retina; 2) estimulación de las células receptoras de la retina; 3) 
conducción al cerebro del impulso elaborado por dichas células; 4) formación de la 
imagen en el cerebro. 
El ojo 
El ojo le transmite la información al cerebro a través del nervio óptico. Esta 
información se propaga por impulsos de naturaleza electroquímica, cuya velocidad 
está comprendida entre diez y cien metros por segundo. 
Cuando los ojos están abiertos, la luz entra por la pupila, que es una abertura 
del iris. El diámetro de la pupila puede modificarse: se agranda cuando desciende 
la luminosidad y se contrae a plena luz, y ello de modo automático, obedeciendo a 
un reflejo nervioso. 
Detrás de la pupila se encuentra el cristalino, que concentra la luz sobre el 
fondo del ojo. El cristalino es regulable, permitiendo así ver con claridad tanto los 
objetos próximos como los lejanos. 
En el fondo del ojo se halla situada la retina. La retina esta formada por capas 
de células nerviosas sensibles a la luz. 
La córnea esta situada en la parte anterior del ojo y es, al igual que el cristalino, 
una superficie que contribuye a concentrar los rayos luminosos sobre la retina. El 
cristalino —y, en cierta medida, también la córnea— desvía los rayos de tal forma 
que la imagen se proyecta invertida sobre la retina. 
La retina 
La retina está compuesta por fotorreceptores que convierten la intensidad y el 
color de la luz en señales nerviosas que son procesadas por el cerebro. La retina 
contiene dos clases de fotorreceptores, bastones y conos. Los bastones son más 
numerosos —alrededor de 120 millones— y son más sensitivos a la luz que los 
conos. Sin embargo, los bastones no son sensibles al color. Los conos —entre 6 y 
7 millones— son quienes proveen al ojo de sensitividad al color, y están 
mayormente concentrados en la mácula. En el centro de esta región se encuentra 
la fóvea —un área de 0.3 mm de diámetro—, donde no existen bastones y la 
concentración de conos es muy grande. 
7 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Los conos 
Las experiencias empíricas sugieren que dentro del conjunto de los conos 
existen tres clases distintas de receptores de color, y se han establecido las curvas 
de respuesta para cada tipo de cono (figura 1) [CRRE]. Basándose en estas 
curvas de respuesta se pudieron clasificar los conos en "rojos" (64%), "verdes" 
(32%) y "azules" (2%) [NAVE2005]. Los conos verdes y rojos están concentrados 
en la fóvea, mientras que la sensitividad de los conos azules se encuentra 
mayormente fuera de esta zona. 
Los conos azules merecen un estudio particular debido a que constituyen tan 
sólo un 2% del total y se encuentran fuera de la fóvea. Se los identifica en la curva 
de respuesta a la luz en un pico aproximadamente a los 445 nm. Si bien son 
mucho más sensitivos a la luz que los conos verdes y rojos, no es suficiente para 
contrarrestar su poco porcentaje en cantidad. Sin embargo, la sensitividad al color 
azul en nuestra percepción visual final es comparable a la de los colores verde y 
rojo. Esto sugiere que nuestro cerebro posee un "amplificador azul". 
La percepción visual de los objetos intensamente azules es menos precisa que 
la percepción de objetos rojos o verdes. Esta reducción de agudeza visual se 
atribuye a dos efectos. Primero, los conos azules se encuentran fuera de la fóvea, 
donde los conos dispuestos muy cerca unos de otros pueden brindar la mayor 
resolución. Segundo, el índice de refracción para la luz azul es lo suficientemente 
diferente del índice de refracción de la luz roja y verde como para que cuando el 
rojo y el verde estén en foco, el azul se vaya ligeramente de foco. 
Los conos son los responsables de la visión de alta definición. El ojo se mueve 
continuamente para que la luz reflejada por el objeto en interés se concentre en la 
fóvea, donde reside la mayor cantidad de conos. 
Figura 1: Curvas de respuesta de los conos. 
8 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Los bastones 
Si bien anteriormente mencionamos que la presencia de bastones es nula 
dentro de la fóvea, éstos se encuentran concentrados en todo el resto de la 
superficie de la retina. Son los encargados de la visión nocturna, de la detección 
de los movimientos y de la visión periférica. 
Los bastones son fotorreceptores increíblemente eficientes —mas de mil veces 
más sensitivos que los conos. Tal es así que, bajo condiciones óptimas, pueden 
activarse tan sólo por fotones individuales. La visión adaptada a la oscuridad se 
alcanza en su totalidad luego de un período de oscuridad considerable (alrededor 
de 30 minutos). Esto se debe a que el proceso de adaptación de los bastones es 
mucho más lento que el de los conos. 
Mientras que la agudeza o resolución visual es mucho mejor con los conos, los 
bastones son mejores sensores de movimiento. Debido a que los bastones 
predominan en la visión periférica, esta visión es más sensitiva a la luz, y por lo 
tanto podemos ver objetos menos brillantes con nuestra visión periférica. Por 
ejemplo, si vemos una estrella no muy brillante con nuestra visión periférica, al 
intentar mirarla directamente desaparecerá. Esto es debido a que estamos 
moviendo la imagen dentro de la región de la fóvea, la cual es rica en conos y 
pobre en bastones, y por lo tanto menos sensitiva a la luz. Por la misma razón es 
que se pueden detectar mejor los movimientos con la visión periférica. 
Psicofísica visual 
Una de las áreas en donde comenzó la psicología es en el campo de la 
psicofísica. La psicofísica intenta encontrar la "física del cuerpo humano". Consiste 
en aplicarle un estímulo a una persona, y luego obtener de esta persona la 
respuesta de la experiencia psicológica asociada al estímulo físico. 
Uno de los descubrimientos es la noción de threshold o umbral. Un umbral es 
un límite psicológico de la percepción. El umbral absoluto es la mínima cantidad de 
estimulación sensorial que se puede detectar el 50 % de las veces (el motivo por el 
cual el límite se fijó en el 50 % es la variabilidad de la capacidad humana). El 
umbral relativo es el menor incremento o decremento de un estímulo físico que 
puede detectarse el 50 % de las veces. La noción de umbral no es exclusiva del 
sentido de la vista, sino que se puede aplicar a cualquiera de los órganos 
sensoriales. Un ejemplo de umbral relativo aplicado al sentido de la vista podría 
ser decidir cuál de dos luces es más brillante. 
La relación entre la intensidad de la luz que entra al ojo y el brillo percibido no 
es una función lineal. Esto significa que a medida que la intensidad de una fuente 
luminosa cambia, el observador no percibirá un cambio igual en el brillo. La 
respuesta de la intensidad real del ojo es muy parecida a una respuesta 
logarítmica. De hecho, se ha mostrado experimentalmente que la intensidad de 
una fuente luminosa debe ser cercana al doble antes de que el ojo pueda detectar 
9 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
que ésta ha cambiado. Por lo tanto, los cambios ligeros en la intensidad en 
regiones oscuras de una imagen tienden a ser más perceptibles que los cambios 
iguales en regiones brillantes. Esta relación que hay entre la intensidad de la 
iluminación y el brillo percibido se conoce como Ley de Weber. 
Existen varios fenómenos que muestran que la iluminación percibida no es una 
función simple de la intensidad. Entre ellos se encuentra el contraste simultáneo, 
que es una ilusión por la cual el brillo percibido de una región depende de la 
intensidad del área circundante. En la figura 2 se observan cinco cuadrados 
dispuestos horizontalmente, cada uno de ellos sucesivamente más claro. Dentro 
de cada cuadrado se encuentra un círculo exactamente igual, sin embargo cuanto 
más claro es el cuadrado que lo contiene, más oscuro parece verse. 
Figura 2: Contraste simultáneo. 
Otro fenómeno a tener en cuenta es el de las bandas de Mach, que es una 
ilusión por la cual el sistema visual acentúa los cambios importantes de intensidad. 
El sistema visual tiende a sobrevalorar o infravalorar la intensidad en las 
proximidades de los límites de dos regiones con intensidades diferentes. De este 
modo, el ojo incrementa el realce en los contornos de las transiciones de 
intensidad, y gracias a esto se puede obtener una agudeza visual muy buena. Si 
se observa la figura 3 de izquierda a derecha, cada banda pareciera hacerse más 
oscura justo antes de la transición. Si la figura 3 se observa de derecha a 
izquierda, cada banda pareciera hacerse más clara justo antes de la transición. 
Esto provoca la ilusión de que la transición sea de mayor amplitud de lo que es en 
realidad. 
Figura 3: Bandas de Mach. 
El sistema visual también tiene problemas en cuanto a la respuesta en 
10 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
frecuencia. El ojo tiene problemas para resolver detalles finos, o transiciones de 
intensidad. Generalmente, la respuesta en frecuencia del ojo disminuye a medida 
que las transiciones de intensidad se vuelven cada vez más finas. El contraste es 
otro factor a tener en cuenta. Cuanto más alto es el contraste, más fino es el 
detalle que el ojo puede resolver. Por lo tanto, cuando las transiciones son 
demasiado finas o el contraste es demasiado bajo, el ojo ya no puede resolverlos 
satisfactoriamente. En estos casos el ojo sólo puede percibir un promedio del nivel 
de gris del área en cuestión. En la figura 4 se puede apreciar un patrón que 
incrementa la frecuencia de izquierda a derecha y disminuye el contraste de abajo 
hacia arriba [MS]. 
Figura 4: Patrón de frecuencia y contraste. 
El sistema auditivo 
Este es el sistema mediante el cual podemos percibir los sonidos. Las 
cualidades del sonido percibidas por el oído son el tono, la intensidad y el timbre. 
El tono depende de la frecuencia de las vibraciones: una frecuencia elevada 
provoca tonos agudos y una frecuencia baja tonos graves. La frecuencia se mide 
en Hertz —Hz.— y se refiere a la cantidad de ciclos por segundo de una onda 
periódica. La intensidad con que se percibe un sonido depende de la amplitud de 
la vibración y del tono. Psicológicamente se lo percibe como volumen y se mide en 
decibeles —dB. El timbre permite distinguir sonidos de la misma intensidad y 
frecuencia, pero con distintas armónicas de la frecuencia del tono fundamental; es 
decir, con distinta forma de onda —por este motivo es que podemos diferenciar 
una misma nota en distintos instrumentos musicales. 
El sonido puede ser medido con gran exactitud, sin embargo entender cómo se 
recibe y se transforma en pensamientos dentro del cerebro no es nada trivial. La 
audición es el resultado de una serie de procesos acústicos, mecánicos, nerviosos 
11 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
y mentales que nos da la impresión de sonido. 
El oído 
En la estructura física del oído se pueden distinguir tres zonas: el oído externo, 
el oído medio y el oído interno. 
El oído externo comprende el pabellón de la oreja, en forma de embudo, y el 
conducto auditivo externo, obturado en su extremo por el tímpano. 
El oído medio se halla constituido por la caja del tímpano, cavidad que contiene 
la cadena de huesecillos: martillo, yunque y estribo. Estos huesecillos transmiten 
las vibraciones desde el tímpano hasta la ventana oval. 
El oído interno está constituido por una serie de cavidades alojadas en el hueso 
temporal, y consta de tres partes: el vestíbulo, la cóclea y los conductos 
semicirculares. En el vestíbulo se encuentra la ventana oval, por la que el oído 
interno comunica con el medio. Al vestíbulo le sigue la cóclea, un tubo diminuto 
que se enrolla dos veces y media sobre sí mismo. El interior de la cóclea está 
dividido en tres conductos mediante dos membranas que lo recorren 
longitudinalmente. Sobre una de ellas se encuentra el órgano de Corti, que es el 
órgano de la audición propiamente dicho y que está formado por unas 25.000 
células sensitivas. 
Las vibraciones sonoras transmitidas por las partículas del aire son canalizadas 
por el pabellón de la oreja hacia el conducto auditivo externo, hasta llegar al 
tímpano. Por medio de la cadena de huesecillos el tímpano comunica las 
vibraciones a la ventana oval y a la cóclea. La presión originada en la cóclea por 
las vibraciones sonoras hace vibrar a la membrana basilar. Durante el paso de la 
onda, el órgano de Corti también oscila, friccionando la membrana tectorial y 
excitando las células sensoriales, que estimulan el cerebro. 
La membrana basilar 
La membrana basilar se encuentra dentro de la cóclea y la recorre en toda su 
extensión. Esta membrana varía en masa y rigidez a lo largo de su longitud. Sobre 
el extremo más próximo a la ventana oval la membrana es rígida y liviana, y 
debido a esto su frecuencia de resonancia es alta. Sobre el extremo más lejano la 
membrana es blanda y pesada, y es por esto que su frecuencia de resonancia es 
baja. El rango de las frecuencias de resonancia disponibles en la membrana 
determina el rango de frecuencias de la audición humana. El oído humano puede 
distinguir entre 16 y 20.000 vibraciones por segundo (entre 16 Hz. y 20 kHz.), pero 
la mayoría de las personas sólo puede distinguir sonidos que se encuentran dentro 
del rango de los 20 Hz. hasta los 15 kHz. La membrana basilar transforma cada 
frecuencia en impulsos nerviosos en una región distinta, de manera que la 
percepción del tono depende del oído y no del sistema nervioso central. Además, 
esta membrana posee pequeños músculos que actúan como si fuera un sistema 
de realimentación positiva que mejora el factor Q de resonancia [TEKTRONIX97]. 
12 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Psicofísica auditiva 
La psicofísica auditiva o psicoacústica es el estudio de la percepción subjetiva 
de los sonidos en los seres humanos. En otras palabras, es el estudio de la 
psicología de la percepción acústica. 
Ya mencionamos en la sección de psicofísica visual que la noción de umbral no 
es exclusiva de ningún sentido. Para el oído, el umbral relativo del tono sobre el 
rango medio de audición es aproximadamente de 2 Hz. Es decir que se pueden 
percibir cambios de tono no menores a 2 Hz. No obstante, bajo ciertas 
condiciones, se puede llegar a percibir variaciones menores [WIKIPEDIA2005]. 
El límite inferior para el umbral absoluto de la intensidad de cualquier sonido 
audible está a 0 dB. El límite superior no está tan claramente definido. Se podría 
definir como la intensidad máxima sin que dañe físicamente al oído. Pero este no 
es un límite fijo, pues depende del tiempo de exposición. Por ejemplo, 
exposiciones de cortos períodos de sonidos de 120 dB. podrían ser inofensivas 
para el oído, sin embargo largas exposiciones de sonidos de 80 dB. podrían 
dañarlo. 
Un estudio más riguroso de los límites inferiores de audibilidad determina que 
el umbral mínimo para el cual se puede oír un sonido es dependiente de la 
frecuencia del mismo. Por medio de mediciones de tonos de la menor intensidad 
audible y a distintas frecuencias, se puede establecer una curva de respuesta de 
umbral absoluto de audición (figura 5) [TEKTRONIX97]. El oído posee un pico de 
sensitividad (un mínimo en la curva) dentro del rango de 1 kHz. hasta 5 kHz., y 
cabe destacar que la voz humana cae dentro de este mismo rango. 
Figura 5: Curva del umbral en silencio. 
Bandas críticas 
Los sonidos con distintas frecuencias causan que vibren áreas diferentes de la 
membrana basilar, excitando a unas u otras células sensitivas. Las señales de los 
13 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
sonidos son contínuas, y por lo tanto existen sonidos de infinitas frecuencias 
diferentes. Por supuesto que no puede existir una relación biunívoca entre cada 
frecuencia posible con un área distinta de la membrana basilar, por lo tanto habrán 
sonidos de frecuencias similares que excitarán a las mismas células nerviosas. 
Debido a esto, si dos sonidos con el mismo volumen que se encuentran dentro de 
la misma banda crítica suenan simultáneamente, el sonido no será percibido el 
doble de fuerte, sino que levemente más fuerte que cualquiera de ellos por 
separado. Para que dos sonidos se encuentren dentro de la misma banda crítica, 
es necesario que sus frecuencias sean similares. Si los sonidos hubieran sido de 
frecuencias lo suficientemente distintas como para estar dentro de distintas 
bandas críticas, el sonido percibido hubiera sido considerablemente mas fuerte. 
Esto se debe a que no se solapan las células sensitivas excitadas en la membrana 
basilar. En las frecuencias audibles más bajas, el ancho de las bandas críticas es 
de aproximadamente 100 Hz. A medida que se incrementa la frecuencia, el ancho 
de las bandas críticas se hace más grande, superando los 3 kHz. en las 
frecuencias más altas. 
Enmascaramiento frecuencial 
Bajo determinadas condiciones, un sonido que es claramente audible puede 
ser enmascarado por otro sonido. Por ejemplo, se complicaría mucho mantener 
una conversación si hay mucho ruido en el ambiente. A este fenómeno se lo llama 
enmascaramiento frecuencial. Un sonido débil es enmascarado si se hace 
inaudible con la presencia de otro más fuerte. Si un sonido se encuentra cercano 
en frecuencia al sonido fuerte será más fácilmente enmascarado que si se 
encuentra apartado de su frecuencia. En la figura 6 se puede apreciar cómo un 
único tono afecta al umbral [TEKTRONIX97]. El umbral se incrementa tanto hacia 
las frecuencias bajas como hacia las altas, pero el incremento hacia las 
frecuencias altas es un poco más acentuado. En presencia de un espectro 
complejo, como el de la música, el umbral se incrementaría en la mayoría del 
rango. Es por esto que el zumbido de un cassette analógico sólo se puede oír 
durante los espacios en blanco. 
14 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 6: Enmascaramiento frecuencial. 
Enmascaramiento temporal 
El comportamiento resonante de la membrana basilar es análogo al 
comportamiento de un analizador de transformadas. De acuerdo a la teoría de las 
transformadas, cuanto más exacto se conoce el dominio de la frecuencia de una 
señal, menos exactitud se dispondrá en el dominio del tiempo —y viceversa. Es 
decir que cuanto más pueda distinguir una transformada entre dos frecuencias, 
menor será su capacidad para discriminar entre dos eventos. En el oído humano 
se observa un compromiso de modo de equilibrar la incerteza en ambos dominios, 
y por lo tanto no es perfecto en ninguno de ellos. La imperfección al discriminar 
entre frecuencias es lo que produce el mencionado enmascaramiento frecuencial. 
La imperfección en la discriminación del tiempo se debe a la respuesta 
resonante del oído. El factor Q es tal que un determinado sonido debe estar 
presente por al menos un milisegundo para que pueda ser audible. Debido a esta 
lenta respuesta, el enmascaramiento puede producirse aún cuando las señales 
involucradas no son simultáneas. El preenmascaramiento y postenmascaramiento 
se producen cuando el sonido enmascarante continúa enmascarando sonidos más 
débiles antes y después de la duración real del sonido enmascarante (figura 7) 
[TEKTRONIX97]. 
15 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 7: Enmascaramiento temporal. 
COMPRESIÓN 
La compresión de datos reduce la cantidad de bytes necesarios para 
representar la información. Es decir, reduce la cantidad de memoria necesaria 
para almacenar la información. Del mismo modo, también reduce la cantidad de 
tiempo requerido para transmitir información a una tasa de transmisión dada. 
Como ya mencionamos, podemos clasificar los métodos de compresión en: 
 Compresión sin pérdida. 
 Compresión con pérdida. 
Como los métodos de compresión con pérdida son muy dependientes del área 
en cuestión —audio, imágenes, video, etc.—, en esta sección solamente nos 
ocuparemos de la compresión sin pérdida. 
Hay una gran cantidad de aplicaciones en las que no es posible realizar una 
compresión con pérdida debido a que la mínima pérdida de la información original 
sería intolerable —archivos de texto, ejecutables, etc. En estos casos la única 
alternativa es la compresión sin pérdida. Pero de todos modos, en los casos en 
que sí se puede aplicar compresión con pérdida, la mayoría de las veces también 
se realiza (como último paso) una compresión sin pérdida. El hecho de aplicar una 
compresión sin pérdida luego de haber realizado toda la compresión con pérdida 
comprime aún mas los datos, sin mas efectos adversos que un incremento en el 
tiempo de los procesos de compresión-descompresión. 
Existen muchas técnicas de compresión sin pérdida, entre las más importantes 
se encuentran la codificación de Huffman y la codificación aritmética. Estas 
técnicas se basan en la codificación entrópica. La entropía es la cantidad de 
información presente en los datos, y un codificador de entropía codifica un 
conjunto de símbolos con la menor cantidad de bits necesarios para 
representarlos. 
Codificación de Huffman 
La codificación de Huffman es un método de codificación entrópica de longitud 
variable que asocia un valor específico con un único código. La codificación de 
16 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Huffman se conoce como una codificación de prefijo debido a que ningún código 
es prefijo de otro más largo. Esta propiedad hace que un código Huffman sea 
decodificable unívocamente. 
La codificación de Huffman es general, es por esto que la compresión debe 
pensarse sobre símbolos abstractos, siendo por ejemplo las letras del alfabeto un 
caso particular. En un archivo de texto simple, cada caracter está representado por 
ocho bits. Esta representación no es óptima si tenemos en cuenta que 
estadísticamente algunos caracteres están presentes mucho más frecuentemente 
que otros. La codificación de Huffman ordena los símbolos más frecuentes en 
secuencias cortas de bits, y por lo tanto los símbolos menos frecuentes estarán 
representados por secuencias más largas. 
Las frecuencias relativas de todos los símbolos pueden ser conocidas —por 
medio de estudios estadísticos— o pueden calcularse en cada caso en particular. 
Por ejemplo, existen tablas que indican los valores probabilísticos de ocurrencia de 
cada letra en un texto —cada idioma posee su propia tabla. Entonces, para 
comprimir un texto se puede utilizar una codificación de Huffman siguiendo la tabla 
correspondiente —que no necesariamente será cien por cien exacta— o calcular la 
probabilidad real de cada símbolo que se encuentra en ese texto en particular. 
Cada alternativa tiene sus ventajas y sus desventajas. El hecho de utilizar una 
tabla facilita mucho la implementación del compresor —el descompresor utiliza la 
misma tabla para llevar a cabo la tarea de descompresión—, pues de lo contrario 
habría que contar las apariciones de cada caracter dentro del texto. Por esta 
misma razón también puede ser —si el texto es extenso— que el compresor 
resulte más eficiente. Por otro lado, si se calcula la probabilidad exacta de 
aparición de cada símbolo, intuitivamente podríamos pensar que el texto acabaría 
ocupando menos datos debido a que la representación de la información 
terminaría siendo la óptima. Si bien esto es cierto, no debemos olvidarnos que 
junto al texto comprimido debe estar también la tabla con la cual se llevó a cabo la 
compresión, de lo contrario el proceso no sería reversible. Por lo tanto veremos 
una ganancia al calcular las probabilidades reales sólo en aquellos textos tal que 
su tamaño sea considerable respecto de lo que ocupa su tabla correspondiente 
—a menos que la tabla estándar se ajuste muy bien al texto. 
Generalmente las tablas no indican los valores probabilísticos, sino que 
directamente muestran el código correspondiente. En el caso en que sólo se 
disponga de las probabilidades —ya sea porque es la única información que brinda 
la tabla o porque se desea utilizar una tabla ad hoc— habrá que construir una tabla 
que indique el código que representa a cada símbolo. A continuación veremos un 
ejemplo de cómo calcular las probabilidades reales de un texto y otro de cómo 
construir una tabla de símbolos con sus respectivos códigos. 
Supongamos el siguiente texto: "este es un texto de ejemplo". Primero 
determinaremos el alfabeto, luego contaremos la cantidad de apariciones dentro 
del texto. La longitud de nuestro texto es de 27 caracteres, por lo tanto la 
probabilidad de cada símbolo será la cantidad de apariciones dividido 27. 
17 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Símbolo Apariciones Probabilidad 
’d’ 1 1 
27 
’e’ 7 7 
27 
’j’ 1 1 
27 
’l’ 1 1 
27 
’m’ 1 1 
27 
’n’ 1 1 
27 
’o’ 2 2 
27 
’p’ 1 1 
27 
’s’ 2 2 
27 
’t’ 3 3 
27 
’u’ 1 1 
27 
’x’ 1 1 
27 
’ ’ (espacio) 5 5 
27 
Tabla 1: Cálculo de probabilidades. 
Ahora veremos cómo construir una tabla de símbolos con sus respectivos 
códigos, teniendo como dato sus probabilidades. Supongamos la siguiente tabla 
[LIOU2001]: 
Símbolo Probabilidad 
a0 0.4 
a1 0.3 
a2 0.2 
a3 0.04 
a4 0.04 
a5 0.02 
Tabla 2: Probabilidades para construir una tabla de códigos Huffman. 
El procedimiento es el siguiente: 
Repetir mientras haya mas de una probabilidad 
Ordenar las probabilidades en orden descendiente. 
Combinar las dos probabilidades más pequeñas. 
Asignarle "0" al miembro superior y "1" al miembro inferior de cada par (o viceversa). 
18 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Seguir el camino de cada símbolo hasta llegar al final (probabilidad 1) registrando los unos y 
ceros. 
Asignarle a cada símbolo la secuencia registrada, de derecha a izquierda. 
Gráficamente (figura 8): 
Figura 8: Codificación de Huffman. 
Finalmente la tabla es la siguiente: 
Símbolo Código (Codeword) Longitud 
a0 1 1 
a1 00 2 
a2 010 3 
a3 0111 4 
a4 01100 5 
a5 01101 5 
Tabla 3: Tabla de símbolos con sus respectivos códigos Huffman. 
Codificación aritmética 
La codificación aritmética se basa en secuencias de símbolos. En vez de 
asignarle un código único a cada símbolo, esta técnica genera una serie de 
valores que corresponden con una única secuencia de datos. Para producir la 
codificación se utiliza la probabilidad de ocurrencia de los símbolos individuales. 
Esta técnica representa cada símbolo como un segmento de la recta real entre 
0 y 1. La codificación de una secuencia de símbolos se logra seleccionando un 
segmento de reales y transmitiendo un número específico dentro de ese 
segmento. 
Veamos un ejemplo para poder comprender mejor el método [LIOU2001]. 
Consideremos los siguientes símbolos con sus respectivas probabilidades de 
ocurrencia: 
19 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Símbolo Probabilidad 
A 0.50 
C 0.30 
G 0.15 
T 0.5 
Tabla 4: Probabilidades de codificación aritmética. 
Gráficamente (figura 9) se explica cómo codificar la secuencia de símbolos 
"CAT". 
Figura 9: Codificación aritmética. 
Cualquier número en el rango de 0.6425 a 0.65 representa la cadena "CAT". 
La codificación aritmética puede comprimir desde un 5% hasta un 10% mas 
que la codificación de Huffman. Lamentablemente no sólo es más compleja de 
comprender y de implementar, sino que además está sujeta a patentes 
pertenecientes a IBM, AT&T y Mitsubishi. 
COMPRESIÓN DE IMÁGENES 
La mayoría de las imágenes poseen una característica en común: los pixeles 
cercanos están correlacionados, y por lo tanto contienen información redundante. 
Entonces es primordial encontrar la representación menos correlacionada de la 
imagen. En las imágenes tenemos dos tipos de redundancia: 
 Redundancia espacial (o correlación entre pixeles cercanos). 
 Redundancia espectral (o correlación entre los distintos planos de 
color o bandas espectrales). 
Las investigaciones en compresión de imágenes buscan reducir el número de 
bits necesarios para representar una imagen por medio de la reducción de la 
redundancia espacial y espectral tanto como sea posible. Además de reducir la 
20 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
redundancia, en una imagen también es muy útil reducir la irrelevancia. Con esto 
último nos referimos a omitir información que de todos modos ninguna persona 
podrá distinguir (percepción). 
Compresión de imágenes con pérdida 
Todos los métodos de compresión de imágenes con pérdidas involucran la 
eliminación de información de la imagen original. La gran ventaja de estos 
esquemas es que pueden comprimir una imagen con un factor de compresión 
mucho más alto que los esquemas de compresión sin pérdidas. Este factor de 
compresión puede ser de 10:1 sin degradaciones visuales notables, pero si se 
toleran algunas degradaciones visuales se pueden lograr factores de compresión 
de hasta 100:1. 
Existen en la actualidad muchos métodos de compresión de imágenes con 
pérdidas. A continuación analizaremos los más utilizados. 
Submuestreo (subsampling) 
La forma más sencilla de reducir la cantidad de datos que ocupa una imagen 
es directamente descartando pixeles. Si por ejemplo, eliminamos con regularidad 
un pixel y el siguiente no, estaríamos comprimiendo la imagen a la mitad. Un 
posible proceso de descompresión podría ser simplemente mediante replicación 
de pixeles. Otra técnica más refinada podría ser realizar una interpolación de los 
pixeles disponibles para obtener aquellos que habían sido descartados. Es muy 
común encontrar en las imágenes que los pixeles adyacentes estén 
correlacionados. Si este fuera el caso, la imagen reconstruida no será muy 
diferente a la original. 
Si bien la técnica anteriormente mencionada es válida, es un tanto agresiva y 
puede producir degradaciones visuales intolerables para determinadas 
aplicaciones. Es sabido que el ojo humano es más sensible a la luminancia (brillo) 
que a la crominancia (color) —debido a que el ojo humano posee muchos mas 
bastones que conos. Es por esto que los cambios graduales de color se ven como 
un único color, y esto se puede utilizar para nuestro propósito. 
Generalmente a las imágenes se las representa con el espacio de color RGB, 
que es una tripla que define el color de cada pixel por medio de la combinación de 
los tres colores primarios —rojo, verde y azul. En lugar de representar a una 
imagen por medio de la adición de los colores primarios, podemos realizar una 
conversión de espacios de color para poder representarla por medio de los 
siguientes tres canales: 
 Y: Luminancia (brillo). 
 Cb: Crominancia (azul). 
 Cr: Crominancia (roja). 
En las figuras 10, 11 y 12 se puede ver una imagen en color junto con sus 
respectivos canales RGB y YCbCr. 
21 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 10: Imagen en color. 
Figura 11: Canales RGB. 
Figura 12: Canales YCbCr. 
Dada una imagen representada con el espacio de color RGB, podemos 
convertirlo al espacio de color YCbCr mediante las siguientes expresiones: 
Y  0.299R  0.587G  0.114B [1.1] 
Cb  −0.1687R − 0.3313G  0.5B [1.2] 
Cr  0.5R − 0.4187G − 0.0813B [1.3] 
Cabe destacar que esta conversión es levemente diferente a la utilizada para la 
codificación de video [JACK2001]. Además hay que tener en cuenta que los 
cálculos se realizarán utilizando una precisión determinada. Debido a esto se 
incurrirá en pequeños errores de redondeo que llevarán a una transformación con 
pérdida, independientemente del método de muestreo que se utilice. 
Una vez que hemos realizado la conversión al espacio de color YCbCr 
22 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
podemos comprimir la imagen llevando a cabo un submuestreo de los canales Cb 
y Cr, dejando intacto el canal Y —debido a que el ojo humano es menos sensible a 
los canales cromáticos que al del brillo. Casi ningún ojo humano es capaz de 
detectar esto, y el tamaño del archivo se verá reducido en un porcentaje muy alto 
—dependiendo del modo en que se realice el muestreo. Existen estándares que 
aconsejan sobre el modo de realizar el muestreo [JACK2001]. 
Este paso produce que sucesivas compresiones se vean cada vez un poco 
peor, pues este paso no es reversible. Además, las fotos naturales son más 
propensas a contener cambios graduales de color que las imágenes producidas 
por los humanos. Es por esto que no se recomienda utilizar esta técnica sobre 
imágenes que puedan incluir textos o bloques grandes de un único color. 
Formatos de muestreo de YCbCr 
La figura 13 ilustra la posición de las muestras de YCbCr para el formato 4:4:4. 
Cada muestra posee un valor de Y, de Cb y de Cr. Cada componente de la 
muestra es generalmente de 8 bits, por lo tanto cada muestra será de 24 bits. 
La figura 14 ilustra la posición de las muestras de YCbCr para el formato 4:2:2. 
Por cada dos muestras horizontales de la componente Y se toma una de Cb y de 
Cr. Cada componente de la muestra es generalmente de 8 bits, por lo tanto cada 
muestra será de 16 bits. 
La figura 15 ilustra la posición de las muestras de YCbCr para el formato 4:1:1 
(también conocido como YUV12). Por cada cuatro muestras horizontales de la 
componente Y se toma una de Cb y de Cr. Cada componente de la muestra es 
generalmente de 8 bits, por lo tanto cada muestra será de 12 bits. 
En lugar de la única reducción horizontal de 2:1 de las componentes Cb y Cr 
utilizada en el formato 4:2:2, el formato 4:2:0 implementa una reducción de 2:1 en 
las componentes Cb y Cr tanto horizontalmente como verticalmente. Existen cinco 
formatos de muestreo 4:2:0 distintos; en la figura 16 se ilustran dos de ellos. 
Para mostrar datos que se encuentren en el formato 4:2:2 o 4:1:1 o 4:2:0, 
primero es necesario realizar una conversión al formato 4:4:4, utilizando 
interpolación para generar las muestras faltantes de Cb y Cr. 
Figura 13: Formato 4:4:4. Figura 14: Formato 4:2:2. Figura 15: Formato 4:1:1. 
23 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 16: Formatos 4:2:0. 
Transformada discreta del coseno (DCT) 
Existen muchas transformaciones matemáticas que transforman un conjunto de 
datos de un sistema de medición a otro. En algunos casos la representación de los 
datos en el nuevo sistema posee propiedades que facilitan la compresión de los 
mismos. La transformada discreta del coseno (Discrete Cosine Transform - DCT 
de aquí en mas) es una de las transformaciones más importantes en el área de la 
compresión de imágenes digitales. 
La DCT transforma un bloque de datos en un nuevo conjunto de valores. La 
DCT inversa invierte este proceso, recuperando los valores originales de los datos. 
En la teoría, en el proceso de transformación y antitransformación no se pierde 
nada de información. Sin embargo, en la práctica, existe una pequeña pérdida de 
información debido a los dos siguientes factores: 
 Los valores del coseno no se pueden calcular exactos. 
 Los resultados finales de los cálculos se ven afectados por los errores 
de redondeo debido a la limitada precisión en la representación de los 
datos. 
Las diferencias entre los datos recuperados y los originales son generalmente 
pequeñas, pero depende del método utilizado para calcular la DCT. 
La DCT se puede aplicar a bloques de datos de cualquier tamaño, pero lo más 
usual es utilizar bloques de 8  8. Esto se debe a que, desde el punto de vista de la 
implementación, un bloque de 8  8 no demanda grandes requisitos de memoria. 
Además, la complejidad algorítmica para tales bloques es asequible en la mayoría 
de las plataformas. Por otro lado, desde el punto de vista del factor de compresión, 
si utilizamos bloques mayores no obtendremos grandes mejoras. 
La definición de la DCT está dada por: 
DCTu, v  2 
nm 
CuCv 
m−1 
Σ pixelx, y cos 2x  1u 
Σ 
y0 
n−1 
x0 
2n cos 2y  1v 
2m [2.1] 
La definición de la DCT inversa está dada por: 
pixelx, y  2 
nm 
m−1 
Σ CuCvDCTu, v cos 2x  1u 
Σ 
y0 
n−1 
x0 
2n cos 2y  1v 
2m [2.2] 
Donde, para ambos casos: 
24 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
u  0, . . . ,n 
v  0, . . . ,m 
C  
1 
2 ,   0 
1,  ≠ 0 
La DCT puede implementarse siguiendo su definición, pero existen métodos 
incrementales más veloces [RY1990], [GHANBARI2003]. 
Puede no resultar intuitivo de su definición, pero cada valor calculado en el 
proceso de transformación involucra una matriz de transformación (función base) 
distinta —de n  m componentes. Para el caso más común de bloques de 8  8, se 
cuenta con 64 matrices de transformación, cada una de 8  8. 
Cada función base representa una combinación de frecuencias de la forma de 
onda del coseno en dos dimensiones. La idea es determinar cuánto de cada 
patrón de frecuencia hay en el bloque de datos a transformar. Esto se logra 
realizando el producto interno de la entrada y su función base correspondiente. Es 
decir, cada término de una función base específica se multiplica por su término 
correspondiente en el bloque de datos. Luego, todos estos productos se suman 
para formar un único valor. Este único valor representa la cantidad de la frecuencia 
contenida en el bloque de datos. Básicamente, la DCT cambia los valores 
originales que representan intensidades de color en valores que representan 
frecuencias del coseno. En la figura 17 se observan las funciones base canónicas 
y base DCT para un bloque de datos de 8  8. 
Figura 17: Funciones base canónicas y base DCT. 
Algunos ejemplos nos ayudarán a entender estos conceptos. En los siguientes 
ejemplos se transformarán bloques de datos de 8  8 utilizando una 
implementación sencilla —la utilizada en el caso de estudio COMPRESSLIB— de 
25 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
la DCT. Los valores de los datos originales representan intensidades de color en el 
rango de 0 a 255. Cabe destacar que la DCT produce mejores valores para la 
compresión si los datos originales están centrados en 0, por lo tanto, previo a la 
transformación propiamente dicha se le resta 128 a cada componente —para 
obtener valores en el rango de -128 a 127. Asimismo, luego de realizar la 
antitransformación se debe sumar 128 a cada componente para recuperar los 
valores originales. 
Primero consideremos un bloque de datos que representa una región toda del 
mismo color y su respectiva transformada (figura 18). En el bloque de datos no hay 
frecuencias —pues es todo del mismo color—, y consecuentemente todos los 
términos de la transformada excepto el superior izquierdo (DCT0,0), son cero. Si 
observamos la matriz superior izquierda de las funciones base DCT en la figura 17, 
veremos que es una superficie uniforme (todos sus valores son iguales). Esta 
función base es especial debido a que representa el caso particular de frecuencia 
cero. Al término DCT0,0 se lo denomina coeficiente DC. El nombre DC (Direct 
Current) proviene del área de la electricidad y significa corriente continua —la 
corriente continua no varía en el tiempo, por lo tanto no tiene frecuencia. Al resto 
de los términos se los denomina coeficientes AC (Alternating Current) y significa 
corriente alterna. A los datos transformados de la figura 18 se los puede comprimir 
almacenando solamente el coeficiente DC y algún código especial para indicar que 
el resto de los términos son cero. 
Figura 18: Transformación de un bloque uniforme. 
Consideremos ahora otro ejemplo. En la figura 19 se puede observar un bloque 
de datos que representa una superficie donde el color cambia suavemente. Nótese 
que todos los valores no nulos resultantes de la transformación se encuentran en 
la esquina superior izquierda (y a lo largo de la primera fila y la primera columna). 
Estos términos no nulos corresponden a las frecuencias bajas de los datos 
originales. Estos datos pueden comprimirse —mediante algún recorrido específico 
de la matriz— intentando almacenar solamente los términos no nulos, de modo 
análogo al ejemplo anterior. 
26 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 19: Transformación de un bloque en degrade. 
Analizaremos un último ejemplo. Los datos originales de la figura 20 son 
aleatorios, esto lleva a que en los datos transformados no haya casi ningún valor 
nulo, y parecieran no estar mejorados para poder comprimirlos. La clave es que ha 
cambiado la importancia de cada valor. Examinemos nuevamente las funciones 
base DCT de la figura 17: las funciones base que se encuentran en la esquina 
superior izquierda capturan frecuencias bajas, mientras que las que se encuentran 
en la esquina inferior derecha capturan frecuencias más altas. Las frecuencias 
más altas capturan el "ruido" y el detalle fino dentro de un bloque de datos, 
mientras que las frecuencias más bajas capturan la "esencia" del bloque de datos 
—debido a la respuesta logarítmica del ojo; la percepción humana del ruido en las 
imágenes depende de la frecuencia espacial. En algunos casos, el ruido contenido 
en un bloque de datos puede ser eliminado completamente sin degradaciones 
visuales. La cantidad de ruido que eliminemos al comprimir un bloque de datos 
determinará la calidad de la imagen. Más específicamente, el conjunto de 
coeficientes obtenido debe ser cuantificado. Es decir, cada coeficiente es dividido 
por un valor almacenado en una tabla —tabla de cuantificación— de modo tal de 
reducir su valor numérico. Estos nuevos valores se deben redondear —o 
truncar—, y en el caso de obtener un cero, sencillamente se estaría descartando 
esa información. Si el nuevo valor no resultara ser cero, de todos modos 
estaríamos obteniendo una mejora, ya que cuanto menor sea el valor, menor será 
la cantidad de bits que serán necesarios para representarlo. El factor de 
compresión obtenido utilizando este método depende de los valores de los 
elementos de la tabla de cuantificación. Cuantos mas elementos en la tabla 
posean valores grandes, mayor será la cantidad de coeficientes que quedarán 
nulos, y por lo tanto mayor será el factor de compresión. Por supuesto que esto 
incrementará la pérdida de información, y por lo tanto la calidad de la imagen será 
menor. Para reconstruir la imagen se debe revertir todo el proceso. 
27 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 20: Transformación de un bloque aleatorio. 
Wavelet 
Como ya mencionamos, las variaciones suaves en el color se corresponden 
con variaciones de baja frecuencia y las variaciones fuertes de color se 
corresponden con variaciones de alta frecuencia. La transformación del espacio de 
intensidades de color al espacio frecuencial se puede llevar a cabo de muchos 
modos. Uno de los posibles es la anteriormente presentada DCT. Otra de las 
posibles técnicas es la descomposición de una imagen por medio de la 
Transformada Discreta Wavelet o Discrete Wavelet Transform (DWT), la cual 
analizaremos brevemente a continuación. 
La forma general de una transformada wavelet unidimensional (1-D) se puede 
apreciar en la figura 21. Aquí una señal pasa a través de un filtro pasa bajos y de 
otro pasa altos, l y h (de lowpass y highpass, en inglés) respectivamente, y luego 
se submuestrea en un factor de dos —esto causa un proceso con pérdida—, 
logrando una transformada de un nivel. Se pueden realizar múltiples niveles 
repitiendo los procesos de filtrado y eliminación (submuestreo), únicamente sobre 
la rama del filtro pasa bajos. Este proceso se lleva a cabo para un número K finito 
de niveles, obteniendo los coeficientes wavelet: di1n, i ∈ 1, . . . ,K y dK0n. 
Cuando no se necesita tener conocimiento de la escala o de la frecuencia, el 
conjunto entero de coeficientes wavelet se expresa como wn. 
Figura 21: Descomposición de una wavelet de 1-D, de K niveles. 
La transformada wavelet de 1-D puede extenderse a una transformada wavelet 
bidimensional (2-D) utilizando filtros wavelet separables. Con los filtros separables, 
la transformada 2-D puede calcularse aplicando una transformada 1-D a cada fila 
28 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
de los datos de entrada, y luego aplicándola a cada columna de los datos de 
entrada. Utilizando la imagen original de la figura 22 [USEVITCH2001], la figura 23 
muestra un ejemplo de transformada wavelet 2-D de un nivel (K1), con su 
correspondiente esquema de descomposición en la figura 24. El mismo ejemplo, 
pero para un nivel de 3, se ve en las figuras 25 y 26. 
Figura 22: Imagen original. 
Figura 23: Wavelet de un nivel. Figura 24: Descomposición de 1 nivel. 
29 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 25: wavelet de 3 niveles. Figura 26: Descomposición de 3 niveles. 
Así como la transformada wavelet se utiliza para separar una imagen en varias 
clases de importancia, la antitransformada se utiliza para reensamblar las distintas 
clases de datos, y de este modo poder reconstruir la imagen. Aquí también se 
utiliza un filtro pasa bajos y otro pasa altos, pero el filtrado se realiza en forma 
opuesta. Es decir, se comienza desde el nivel más alto, aplicando primero los 
filtros por columna y luego por fila, hasta llegar al primer nivel. 
La codificación basada en wavelet ha mejorado considerablemente durante los 
últimos años. Un gran progreso fue la introducción de la codificación EZW 
(embedded zero-tree), de Shapiro. Este algoritmo es capaz de aprovechar las 
propiedades de multiresolución de la transformada wavelet y es muy eficiente. 
Formato de imagen JPEG 
En la actualidad existe una cantidad muy grande de formatos de imagen. Cada 
uno con sus respectivos puntos fuertes y débiles, según sea la aplicación para la 
cual fueron diseñados —calidad, razón de compresión, eficiencia, costos 
(patentes, licencias, etc.), estándares, etc. 
A mediados de 1980, miembros de la ITU —International Telecommunication 
Union (Unión Internacional de Telecomunicaciones)— y de la ISO —International 
Standards Organisation (Organización Internacional de Estándares)— se 
asociaron para llevar a cabo un estándar para la compresión de imágenes en 
escala de grises y en colores. Este estándar se llamó JPEG: Joint Photographic 
Experts Group (Grupo de Expertos Fotográficos Asociados). 
Unos años más tarde, el comité de JPEG decide desarrollar otro estándar para 
la compresión de imágenes, llamado JPEG2000. Esto fue en respuesta a las 
demandas cada vez mayores de multimedia, internet y una gran variedad de 
aplicaciones de imágenes digitales. Sin embargo, en términos de la metodología 
de compresión, estos dos estándares son muy distintos —mientras que el JPEG 
original está basado en la DCT, el JPEG2000 está basado en la DWT. 
30 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Las imágenes JPEG pueden ser de cualquier resolución y espacio de color, 
tanto con algoritmos con pérdida como sin pérdida. El estándar JPEG es de 
propósito general, y posee muchas características y posibilidades. Por ejemplo, 
por medio del ajuste de parámetros, se puede tomar una decisión de compromiso 
entre la calidad de la imagen y su factor de compresión. El rango de compresión 
es muy amplio: desde aproximadamente 100:1 —con degradaciones visuales 
importantes— hasta aproximadamente 3:1 —indistinguible de la imagen original. 
Generalmente, el umbral del factor de compresión para percibir diferencias entre la 
imagen original y la reconstruida, se encuentra dentro del rango de 10:1 a 20:1 
—dependiendo de la imagen original. 
Si bien el formato JPEG se desarrolló con la intención de comprimir imágenes, 
ha resultado satisfactorio para la compresión de video, principalmente si se trata 
de video en tiempo real —pues es más eficiente en términos computacionales que 
otras soluciones, como el formato MPEG. También resultó útil en la tarea de 
edición. Sin embargo, el factor de compresión que logra no es muy alto, ya que no 
aprovecha la redundancia temporal entre cuadros. Una vez que ha finalizado el 
proceso de edición, el video puede convertirse a un formato más apropiado para 
obtener una compresión mayor. 
El formato JPEG define cuatro modos de operación distintos: sin pérdida, 
secuencial, progresivo y jerárquico. La codificación sin pérdida se basa en un 
algoritmo espacial, en el dominio de los pixeles. Se lleva a cabo una predicción del 
valor de una muestra, teniendo en cuenta hasta tres muestras vecinas. Luego, al 
valor real se le resta el valor de la predicción y la diferencia se codifica sin pérdida 
utilizando codificación de Huffman o aritmética. La compresión sin pérdida logra un 
factor de compresión de aproximadamente 2:1. 
Los otros tres modos de compresión se basan en la DCT. El esquema 
secuencial puede utilizar tanto codificación de Huffman (la opción por defecto de 
JPEG - baseline sequential scheme) como codificación aritmética. Cuando la 
imagen se reconstruye, cada fila (bloques de 8  8 pixeles) se decodifica —de 
izquierda a derecha y de arriba hacia abajo— y se presenta secuencialmente con 
toda su exactitud y resolución. 
El esquema progresivo presenta la imagen en múltiples pasos. Cuando la 
imagen se decodifica, inmediatamente se obtiene una mera aproximación de la 
imagen completa. Progresivamente se va mejorando la calidad, hasta lograr su 
exactitud total. Esto es ideal para aplicaciones de búsqueda en bases de datos de 
imágenes o exploración de sitios web. Se puede utilizar selección espectral, 
aproximación sucesiva, o ambas. La selección espectral codifica los coeficientes 
de baja frecuencia de la DCT al principio (para obtener la imagen rápidamente), 
seguido de los coeficientes de alta frecuencia (para añadir los detalles). La 
aproximación sucesiva codifica los bits más significativos de los coeficientes de la 
DCT, seguido de los bits menos significativos. 
Por último, el modo jerárquico representa a una imagen en múltiples 
resoluciones. Por ejemplo, supongamos que existen tres versiones de una imagen: 
512  521, 1024  1024 y 2048  2048. Las imágenes con mejor resolución se 
31 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
codifican como diferencias de la siguiente imagen más chica, requiriendo menos 
bits de los que necesitaría si se almacenara individualmente. Por supuesto, el 
número total de bits es mayor al requerido para almacenar solamente la imagen de 
mayor resolución. Cabe destacar que las imágenes individuales en una secuencia 
jerárquica pueden ser codificadas progresivamente. 
Esquema secuencial (baseline) 
Aquí estudiaremos las distintas etapas del pipeline de 
compresión-descompresión del esquema secuencial. Primero comentaremos 
brevemente cada uno de los pasos, y luego se profundizará en aquellos que lo 
requieran. Las técnicas que ya hayan sido analizadas con anterioridad serán 
mencionadas superficialmente. En la figura 27 se puede apreciar un diagrama 
esquemático de un compresor. 
Figura 27: Diagrama esquemático de un compresor (secuencial) JPEG. 
Si la imagen que se desea comprimir es en colores, entonces el primer paso es 
convertir esta imagen al espacio de colores YCbCr —el estándar JPEG no define 
un espacio de color específico para la imagen de entrada. Luego, es posible 
realizar algún submuestreo de los canales Cb y Cr. El estándar JPEG permite 
cualquiera de los formatos de muestreo de YCbCr; para la correcta 
descompresión, en el encabezado se almacena información del factor de muestreo 
vertical y horizontal. Luego, cada plano del espacio de color se discretiza en 
32 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
bloques de 8  8 pixeles —en caso de tratarse de una imagen en escala de grises, 
esta imagen se discretiza sin ningún preprocesamiento. 
El siguiente paso es realizar un corrimiento de los valores de las componentes 
de cada bloque, pues la DCT produce mejores valores para la compresión si los 
datos originales están centrados en 0. Como el rango original es de 0 a 255, al 
restarle 128 el nuevo rango será de -128 a 127. 
A continuación, a cada bloque se le aplica la DCT. Luego, cada bloque se 
cuantifica teniendo en cuenta una tabla de cuantificación. Una vez cuantificado, se 
recorre el bloque en zigzag, de modo tal de acumular la mayor cantidad posible de 
ceros al final del recorrido. Después, los coeficientes DC de los bloques se 
codifican mediante DPCM; los coeficientes AC se codifican mediante RLC. Luego 
de esta primer codificación, cada conjunto se codifica independientemente por 
segunda vez, en este caso mediante un codificador entrópico —codificación de 
Huffman, pues es la única posibilidad en el esquema secuencial baseline. Una vez 
terminados estos procesos, se cuenta con toda la información comprimida, lista 
para almacenar o transmitir. 
Para descomprimir una imagen, simplemente se invierte todo el proceso. Se 
utilizan decodificadores entrópicos, un decodificador RLC, un decodificador DPCM, 
se reconstruyen los bloques, se descuantifican, se antitransforman y finalmente se 
obtiene la imagen recuperada. 
Cuantificación 
En este proceso se reduce la precisión de los coeficientes, consecuentemente 
el número de bits necesarios para representarlos será menor. Esto se lleva a cabo 
dividiendo cada valor en el bloque por un único divisor (entre 1 y 256) que está 
almacenado en una tabla —tabla de cuantificación. Debido a la percepción 
humana, generalmente las frecuencias más altas se dividen por factores mayores, 
por lo tanto muchos coeficientes finalizan siendo cero. Matemáticamente la 
cuantificación es una operación de división, sin embargo si los factores de 
cuantificación se restringen a potencias de dos, esto se puede realizar muy 
eficientemente realizando corrimientos. 
La cantidad de precisión que se puede reducir sin involucrar pérdidas visuales 
considerables es dependiente de los datos. Es por esto que el estándar JPEG no 
impone ninguna tabla de cuantificación, sino que lo deja abierto para que cada 
aplicación defina la más conveniente para sus propósitos. No obstante, existen 
tablas de propósito general. Es usual que haya una tabla para la luminancia y otra 
—con coeficientes mayores— para las crominancias. Además, al comprimir 
utilizando estas tablas estándar, se puede almacenar en el encabezado un 
parámetro de escalamiento. Esto le brinda flexibilidad a las tablas, pues 
dependiendo del factor de escalamiento se podrá incrementar o disminuir la 
calidad de la imagen —inversamente proporcional al factor de compresión. En la 
figura 28 se muestra una tabla de cuantificación para luminancia y en la 29 una 
para crominancias, ambas de propósito general [GHANBARI2003]. 
33 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
El proceso de decodificación restaura las magnitudes de los términos, pero por 
supuesto que no la precisión original. Esto se lleva a cabo invirtiendo la operación, 
es decir multiplicando por el mismo número que anteriormente se había dividido. 
Por lo tanto, un conjunto de datos sólo podrá ser decodificado satisfactoriamente si 
el codificador y el decodificador utilizan las mismas tablas. Las tablas pueden estar 
incluidas en el conjunto de datos comprimidos —tablas ad hoc, almacenadas en el 
encabezado— o pueden ser tablas predefinidas —almacenadas tanto en el 
compresor como en el descompresor. El análisis de cuál de las dos alternativas es 
más conveniente es análogo al realizado con las tablas de probabilidad en la 
codificación de Huffman. Es posible que al utilizar tablas específicas se logre un 
mejor desempeño, pero hay que tener en cuenta que estas tablas deberán formar 
parte de la imagen comprimida. Si la imagen es muy grande con respecto al costo 
asociado de almacenar las tablas, probablemente convenga utilizar esta opción. 
Por otro lado, si la imagen a comprimir es muy pequeña, es posible que el hecho 
de almacenar las tablas en la misma imagen comprimida represente un porcentaje 
considerable del tamaño total, con lo cual sería conveniente utilizar las tablas 
estándar. Otros factores que afectan son los de la eficiencia y complejidad de 
implementación. Es muy probable que el factor de más relevancia a la hora de 
decidir cuál decisión tomar sea el de la eficiencia. Es cierto que el objetivo 
primordial de la compresión de imágenes es reducir la cantidad de datos que las 
representan, pero en muy pocas ocasiones el hecho de guardar las tablas de 
cuantificación representará un costo importante. Observemos que una tabla de 
cuantificación es una matriz de 8  8 componentes, y en la mayoría de las 
aplicaciones se trabaja con imágenes de varios órdenes de magnitud mayor a 8  8 
pixeles. 
Figura 28: Tabla de cuantificación para Y. 
34 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 29: Tabla de cuantificación para Cb y Cr. 
Recorrido en zigzag 
Luego de la cuantificación, es muy probable que muchos términos que se 
encuentran en la esquina inferior derecha se redondeen —o trunquen— a cero. 
Será más eficiente almacenar la cantidad de ceros que almacenarlos 
individualmente. Mas aún, cuando sólo queden elementos nulos por codificar, se 
podrá almacenar un símbolo que indique esta situación. 
El recorrido en zigzag es una técnica que reagrupa los términos de los bloques 
en un arreglo lineal, de modo tal de incrementar la probabilidad de que los 
elementos no nulos se encuentren al principio, agrupando los ceros al final. Esto 
se logra recorriendo los bloques en zigzag a 45 grados, comenzando por el 
extremo superior derecho y finalizando en el extremo inferior izquierdo, como se 
muestra en la figura 30. 
Figura 30: Recorrido en zigzag. 
Codificación RLC 
Una vez que se dispone del arreglo resultante del recorrido en zigzag, se lo 
codifica con RLC (Run Length Coding - codificación de longitud de cadenas), en 
series de pares (longitud, valor). La componente longitud indica la cantidad de 
coeficientes nulos y la componente valor indica el siguiente coeficiente no nulo en 
35 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
el arreglo. Cabe destacar que la componente longitud utilizará sólo cuatro bits, por 
lo tanto su rango será de 0 a 15. Por lo tanto, si nos encontráramos con una 
secuencia de, por ejemplo, 20 ceros y a continuación un 8, esta cadena se 
representaría como: (15,0),(4,8). Es decir, el primer par indica que hay 15 ceros y 
a continuación un cero —en total 16 ceros—; el primer término del segundo par 
debe completar los 20 ceros, por lo tanto es 4, y finalmente le sigue el 8. Cuando 
se detecta que el bloque lo termina una cadena de ceros, se codifica como (0,0). 
Como muchas veces los arreglos quedan con largas cadenas de ceros 
consecutivos, esta codificación elimina mucha redundancia. 
Veamos un ejemplo completo, considerando el siguiente bloque: 
-800 -73 0 -7 0 -2 0 -1 
-73 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
-7 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
-2 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
-1 0 0 0 0 0 0 0 
Recorrido en zigzag: 
-800,-73,-73,0,0,0,-7,0,0,-7,0,0,0, 
0,0,-2,0,0,0,0,-2,0,0,0,0,0,0,0,-1, 
0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0, 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
RLC: 
(0,-800),(0,-73),(0,-73),(3,-7),(2,-7), 
(5,-2),(4,-2),(7,-1),(6,-1),(0,0) 
Codificación DPCM 
La codificación DPCM (Differential Pulse Code Molulation - codificación 
modulada de pulsos diferenciales) es un caso particular de la codificación 
predictiva. Se basa en la información ya disponible para predecir valores futuros, y 
lo que se codifica es la diferencia entre el valor real y el de la predicción. 
La idea es restarle al coeficiente DC actual el coeficiente DC anterior, y 
almacenar ese valor —excepto que se trate del primer coeficiente DC de la 
imagen, en cuyo caso se almacena el coeficiente DC original. A este valor lo 
llamaremos DC Diferencial, o simplemente Dif. Este tratamiento por separado de 
los coeficientes AC se realiza para explotar la correlación entre los valores DC de 
los bloques adyacentes. 
Por ejemplo, supongamos que los cuatro primeros bloques —ya 
cuantificados— poseen los siguientes coeficientes DC: 733, 708, 737 y 677. La 
codificación DPCM se observa en la figura 31. 
36 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 31: Codificación DPCM. 
Para decodificar una serie de coeficientes se realiza lo siguiente. Al coeficiente 
codificado se le suma el coeficiente que se ha decodificado anteriormente —a 
menos que sea el primer coeficiente por decodificar, en cuyo caso no se le suma 
nada. En la figura 31 se observa la decodificación DPCM del ejemplo anterior. 
Figura 32: Decodificación DPCM. 
Codificación entrópica 
Para reducir la cantidad de bits necesarios para representar los bloques 
cuantificados, tanto los coeficientes Dif. como los AC se codifican entrópicamente. 
Para esto se utilizan dos esquemas básicos: el VLC (Variable Length Coding - 
codificación de longitud variable) y el VLI (Variable Length Integer - entero de 
longitud variable). El VLC codifica la cantidad de bits utilizados por cada 
coeficiente, mientras que el VLI codifica los enteros signados. 
Aquí se utilizarán tablas de códigos Huffman predefinidas, sin embargo 
recordemos que el estándar JPEG permite especificar sus propios códigos en el 
encabezado. 
Codificación de los coeficientes DC Diferenciales 
La codificación de los coeficientes Dif. se lleva cabo mediante tres pasos 
[BOUMAN2001]. 
1. Determinar la cantidad m de bits necesarios para representar Difk sin 
signo. Por ejemplo, la representación binaria no signada del número −3 
es 11, por lo tanto m  2 bits. 
37 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
2. Utilizar la tabla 5 para codificar m. A esto se lo conoce como 
codificación VLC. 
3. Si Difk  0, entonces tomar los m menos significativos bits. Si 
Difk  0, entonces tomar el complemento a dos de la representación de 
Difk − 1 y tomar los m menos significativos bits. A este paso se lo conoce 
como codificación VLI. Se lleva a cabo para representar eficientemente 
los coeficientes, pues |Difk |  2m − 1. 
Por ejemplo, si m  2, Difk debe pertenecer al conjunto −3, −2, 2,3. 
Como los valores −1, 0,1 no son posibles, para no desperdiciar bits 
podemos remapear los valores enteros al rango 0, 1, 2,3. 
Consideremos el caso cuando Difk  −3. En este caso m  2. Como 
Difk  0, hay que tomar el complemento a dos de la representación de 
Difk − 1, el cual es 11111100. Tomando los m menos significativos bits 
nos queda 00. 
Ahora si Difk  3, entonces la representación de Difk en 
complemento a dos es 00000011, y tomando los m menos significativos 
bits nos queda 11. 
En la práctica, se debe utilizar aritmética de 16 bits para el 
complemento a dos, para poder trabajar con los doce bits de los valores 
signados de Difk. 
El resultado de esta codificación se presenta como una cadena de bits que 
contiene primero la parte VLC y luego la VLI. 
Rango de los valores de DC Difk Cantidad de bits (m) Código Huffman 
0 0 00 
-1,1 1 010 
-3,-2,2,3 2 011 
-7...-4,4...7 3 100 
-15...-8,8...15 4 101 
-31...-16,16...31 5 110 
-63...-32,32...63 6 1110 
-127...-64,64...127 7 11110 
-255...-128,128...255 8 111110 
-511...-256,256...511 9 1111110 
-1023...-512,512...1023 10 11111110 
-2047...-1024,1024...2047 11 111111110 
Tabla 5: Códigos Huffman para la representación de cada valor posible de m de los 
coeficientes Difk. 
Codificación de los coeficientes AC 
38 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Los coeficientes AC se codifican de modo similar a los coeficientes Difk, pero 
teniendo en cuenta que los coeficientes AC estarán representados por pares 
(longitud, valor). 
1. Teniendo en cuenta el par (longitud, valor), determinar el par 
(longitud, m), donde longitud es la cantidad de ceros que precede al valor 
no nulo y m es la cantidad de bits necesarios para representar la 
componente valor del primer par. A m se lo determina del mismo modo 
que en el paso 1 de la codificación de los coeficientes Dif. Entonces, por 
ejemplo el par (longitud, valor)  (3,-3) deberá representarse como 
(longitud, m)  (3,2). 
Al par (15,0) se lo representa con el símbolo ZRL. Al par (0,0) se lo 
representa con el símbolo EOB. 
2. Mapear la componente valor en una secuencia de m bits, del mismo 
modo que en el paso 3 de la codificación de los coeficientes Dif. A este 
paso se lo denomina codificación VLIac. 
3. Utilizar una tabla de códigos Huffman para coeficientes AC 
[BOUMAN2001], [GHANBARI2003] para mapear el par (longitud, m) en 
un código Huffman, denominado VLCac. 
4. Concatenar los códigos VLCac,VLIac para formar una cadena de bits 
que representa la codificación del par original (longitud, valor). 
Veamos un ejemplo que ilustre el procedimiento completo [BOUMAN2001]. 
Supongamos que el bloque a codificar es el primero de la imagen y que posee los 
siguientes valores: 
3 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 9 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
Los pares que resultan del recorrido 
en zigzag son los siguientes: 
(0,3),(15,0),(15,0),(15,0)(2,9),(0,0) 
La cadena de bits que representa la codificación entrópica se construye a 
continuación. 
39 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
011  VLC de m  2 del coeficiente DC del par (0,3) 
11  VLI del coeficiente DC 3 
11111111001  VLCac de ZRL —par (15,0) 
11111111001  VLCac de ZRL —par (15,0) 
11111111001  VLCac de ZRL —par (15,0) 
111111110100  VLCac de (2,4) —del par original (2,9) 
1001  VLIac del valor 9 —del par original (2,9) 
1010  VLCac de EOB —par (0,0) 
Al concatenar estos códigos obtenemos la siguiente cadena de bits: 
’011”11”111 
7F 
11111001’ 
F9 
’11111111 
FF 
001”11111 
3F 
111001”11 
E7 
11111101 
FD 
00”1001”10 
26 
10”?????? 
?? 
Las llaves denotan los límites de los bytes, y las comillas simples denotan 
grupos de bits asociados a los códigos. Es claro que la cadena de bits no siempre 
finalizará al final de un byte. Si el bloque actual no es el último de la imagen, 
entonces la cadena de bits que producirá la codificación del próximo bloque 
deberá concatenarse al final de la codificación del bloque actual. Si el bloque 
actual sí es el último de la imagen, entonces lo que se realiza es completar —si 
fuera necesario— el último byte con ceros, para asegurar un número entero de 
bytes. A esto se lo denomina padding de ceros. 
La segunda línea representa el valor hexadecimal del byte asociado. En la 
secuencia se ve el valor 0xFF, pero este valor está reservado para el encabezado 
JPEG. Entonces, lo que se realiza para evitar problemas es, ante la ocurrencia de 
un valor 0xFF, añadir a continuación un byte con el valor 0x00. A esto se lo llama 
byte stuffing. Teniendo en cuenta estos detalles, la secuencia correcta debería ser: 
7F F9 FF 00 3F E7 FD 26 ??. El verdadero valor del último byte será determinado 
al codificar el próximo bloque. 
Caso de estudio: COMPRESSLIB 
El propósito de este caso de estudio es ilustrar las diferentes etapas del 
pipeline de compresión-descompresión del esquema secuencial baseline del 
formato de imagen JPEG. Cabe aclarar que la intención de este caso de estudio 
no es realizar una implementación de un compresor-descompresor de imágenes 
JPEG. La idea es mostrar, mediante el desarrollo de un formato propio —formato 
BCI (Basic Compressed Image)—, cómo se pueden llevar a la práctica los distintos 
conceptos teóricos. Por este motivo es que se le ha dado mayor prioridad a la 
facilidad de comprensión de la implementación que a la eficiencia. 
Este desarrollo consiste de lo siguiente: 
 Una librería de compresión de imágenes (COMPRESSLIB), 
modularizada para poder acceder independientemente a cada una de las 
etapas de compresión-descompresión. 
40 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
 Una aplicación que ilustra el funcionamiento interno de cada una de 
las etapas de compresión-descompresión —Compress demo. 
 Una aplicación de compresión y visualización de imágenes —Image 
viewer. 
Librería de compresión de imágenes 
Aquí describiremos el funcionamiento general de la librería, analizando en 
detalle los temas que lo requieran. La librería COMPRESSLIB fue desarrollada en 
C y compilada a un archivo compressor.lib, que deberá ser incluido por 
cualquier aplicación que desee utilizarla. Esta librería utiliza otra librería, DevIL 
(Developer’s Image Library), que es una librería de imágenes Open Source basada 
en la licencia LGPL. Si bien la librería DevIL soporta muchos formatos de 
imágenes, sólo se la utiliza para cargar imágenes que luego serán comprimidas 
por COMPRESSLIB, o para almacenar imágenes en algún formato estándar. Por 
esta razón, las aplicaciones que utilicen la librería COMPRESSLIB, tendrán que 
incluir también (sólo en el caso que la aplicación requiera cargar o almacenar 
imágenes con formatos estándar) el archivo devil.dll. 
A continuación describiremos las capacidades y limitaciones del formato BCI. 
Este formato permite almacenar dos tipos de imágenes distintas: Imágenes en 
escala de grises —8 bits por pixel— e imágenes en color —24 bits por pixel—. 
Para las imágenes en color, se emplea el formato de muestreo 4:2:2. Utiliza tablas 
de cuantificación fijas —una para el canal Y y otra para los canales Cb y Cr—, 
almacenadas en un archivo de texto (quantization.tbl), que deberá residir en 
el mismo directorio que la aplicación. Estas tablas pueden modificarse 
simplemente editando el archivo y cambiando los valores de los coeficientes de las 
matrices. Además, en el encabezado se guarda un parámetro que indica el factor 
de calidad de la imagen, que determina el escalado de estas tablas. Para la 
codificación entrópica se adoptó la codificación de Huffman, y se utiliza una tabla 
de códigos sugerida por [BOUMAN2001] y [GHANBARI2003], almacenada en un 
archivo de texto (huffman.tbl) que debe hallarse en el mismo directorio que la 
aplicación. Al igual que con las tablas de cuantificación, los códigos podrían 
modificarse editando el archivo. 
En la figura 33 puede observarse un diagrama del encabezado del formato. 
Posee 6 campos: 
 Id (Identificador) - Es el identificador del formato. Este campo es fijo, y 
siempre debe contener los caracteres ’b’, ’c’, ’i’ y ’ ’(espacio) —4 datos 
de tipo char (en total 4 bytes). 
 L (Largo) - Este campo almacena el largo (o ancho) de la imagen, 
medido en pixeles. El tipo de datos que almacena es unsigned int 
—entero de 32 bits (o 4 bytes) no signado. 
 A (Alto) - Este campo almacena la altura de la imagen, medida en 
pixeles. El tipo de datos que almacena es unsigned int —entero de 
32 bits (o 4 bytes) no signado. 
41 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
 BPP (Bits Por Pixel) - Este campo almacena la cantidad de bits que 
son necesarios para representar un pixel de la imagen. Sólo puede ser 8 
(escala de grises) o 24 (color). Su tipo de datos es unsigned char 
—entero de 8 bits (o 1 byte) no signado. 
 C (Calidad) - Este campo almacena un número real entre 0 y 1, y se 
utiliza para definir el escalado de las tablas de cuantificación. Controla la 
calidad de la imagen, siendo 0 la peor calidad (factor de compresión más 
alto), 0.66 una calidad buena (sin escalado) y 1 la mejor calidad (factor 
de compresión más bajo). Su tipo de datos es float —real de 32 bits (o 
4 bytes). 
 T (Tamaño) - Este campo almacena la cantidad de bytes que ocupan 
los datos comprimidos propiamente dichos. Es el último campo del 
encabezado. El tipo de datos que emplea es unsigned int —entero 
de 32 bits (o 4 bytes) no signado. 
Figura 33: Encabezado del formato BCI. 
Ahora estudiaremos las distintas etapas del pipeline de 
compresión-descompresión. El diagrama esquemático de este pipeline puede 
observarse en la figura 34. Si bien el formato no especifica una implementación 
determinada, nosotros explicaremos cómo lo hace COMPRESSLIB. No 
explicaremos en detalle cada una de las clases, ya que esto superaría los 
alcances de este trabajo, no obstante sí se analizarán los extractos de código que 
sean relevantes. Para acceder a la documentación de COMPRESSLIB, referirse al 
archivo annotated.html, en la ruta 
programacionproyectofinal.cvscompressordocscompresslib. 
Dado que el funcionamiento general es análogo al del esquema secuencial del 
formato JPEG, comenzaremos inmediatamente a analizar cada una de las etapas. 
42 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Figura 34: Diagrama esquemático de un compresor BCI. 
Muestreo 
En esta etapa, para la compresión, se realiza un submuestreo de los canales 
YCbCr con el formato 4:2:2. 
A cada canal se lo representa como si fuera una imagen individual. Los datos 
están almacenados en un arreglo, por filas, de izquierda a derecha y de arriba 
hacia abajo. Entonces, luego de hacer la conversión de espacio de color a YCbCr 
4:4:4, tendremos una imagen que representa al canal Y, otra que representa al 
canal Cb y otra que representa al canal Cr; cada una de 8 bits por pixel y del 
mismo largo y alto que la original. Resta realizar el submuestreo de los canales Cb 
y Cr. Para esto, a cada canal hay que aplicarle el siguiente algoritmo: 
for ( UInt32 i  0; i  size; i ) 
{ 
alias[0]  dataChrominancePtr[0]; 
alias; 
dataChrominancePtr  2; 
}; 
 size es alto original  ancho original 
2 (la mitad de la cantidad de pixeles 
del canal Y). 
 dataChrominancePtr[] es un puntero (original) a una estructura que 
contiene los datos originales del canal Cb o Cr. 
 alias[] es un puntero (nuevo) a una estructura donde se almacenarán 
los datos del canal submuestreado. 
43 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Entonces, lo que se realiza es: 1) se copia el valor de un pixel del puntero 
original en el nuevo; 2) se adelanta una posición el puntero nuevo; 3) se adelanta 
dos posiciones el puntero original; 4) se repite el proceso hasta llegar al final del 
puntero original (size veces). 
Para la descompresión es necesario convertir del formato 4:2:2 a 4:4:4, 
realizando una interpolación. Es necesario seguir el siguiente algoritmo para los 
canales Cb y Cr. 
alias[0]  dataChrominancePtr[0]; 
dataChrominancePtr; 
for ( UInt32 i  0; i  ( size - 2 ); i  2 ) 
{ 
alias[2]  dataChrominancePtr[0]; 
temporalValue  floor ( ( ( alias[0]  alias[2] ) / 2 )  0.5 ); 
if ( temporalValue  255 ) 
temporalValue  255; 
else if ( temporalValue  0 ) 
temporalValue  0; 
alias[1]  temporalValue; 
alias  2; 
dataChrominancePtr; 
}; 
 alias[] es un puntero (nuevo) a una estructura donde se almacenarán 
los datos del canal Cb o Cr con las muestras faltantes reconstruidas. 
 dataChrominancePtr[] es un puntero (original) a una estructura donde se 
encuentran los datos originales del canal Cb o Cr submuestreado. 
 size es alto Cb o Cr  ancho Cb o Cr  2 (la cantidad de pixeles del 
canal Y). 
Entonces el procedimiento es: 1) antes de comenzar el ciclo, se copia en la 
primer componente del puntero nuevo, la primer componente del puntero original; 
2) se copia en la tercer componente del puntero nuevo, la segunda componente 
del puntero original; 3) se almacena en la segunda componente del puntero nuevo, 
un promedio de la primer y tercer componente; 4) se avanza en dos el puntero 
nuevo y en uno el puntero original; 5) se repiten los pasos 2), 3) y 4) hasta 
terminar el proceso. 
Aquí se ha presentado sólo un esquema general de la implementación. La 
implementación propiamente dicha se puede encontrar en el código fuente, en los 
archivos colorspacemanager.h y colorspacemanager.cpp, bajo la ruta 
programacionproyectofinal.cvscompressorsrccompressorutils 
44 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Discretización en bloques 
Hasta ahora, siempre se dijo que se deben discretizar las imágenes en bloques 
de 8  8, pero esto no siempre es posible. Si la imagen no tiene un largo o alto 
múltiplo de 8, entonces será imposible dividir a esta imagen en bloques de sólo 
8  8. No existe una única manera de afrontar este problema. Una posible solución 
es "agrandar" la imagen hasta alcanzar el múltiplo de 8 más cercano —en la 
dimensión que sea necesario—, y en el proceso de descompresión volver la 
imagen a su tamaño original. En el presente caso de estudio se adoptó otra 
solución, permitiendo bloques menores a 8  8. Supongamos que se dispone de 
una imagen de 50  35, entonces tendremos 24 bloques de 8  8, 4 de 2  8, 4 de 
8  3 y 1 de 2  3 (figura 35). Esta solución complica un poco la implementación de 
la transformada DCT, ya que no alcanza con realizar el caso particular de 8  8, 
sino que se debe llevar a cabo de modo general. 
Figura 35: Discretización en bloques no uniformes. 
Transformación DCT 
Dado que la DCT ya se ha analizado con suficiente rigurosidad, ahora sólo nos 
limitaremos a explicar cómo se ha implementado en este caso de estudio. A 
continuación se presenta la implementación del constructor de una matriz de 
transformación de rows  columns elementos. 
Real c, d; 
for ( UInt8 u  0; u  rows; u ) 
{ 
if ( u  0 ) 
c  1/sqrt( Real(2.0) ); 
else c  1; 
for ( UInt8 v  0; v  columns; v ) 
{ 
if ( v  0 ) 
d  1/sqrt( Real(2.0) ); 
else d  1; 
for ( UInt8 i  0; i  rows; i ) 
45 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
for ( UInt8 j  0; j  columns; j ) 
{ 
Real first  ( 2*c*d / sqrt( Real( rows * columns ) ) ); 
Real cos1  cos( ( 2*i  1 ) * u*PI / ( 2 * rows ) ); 
Real cos2  cos( ( 2*j  1 ) * v*PI / ( 2 * columns ) ); 
this-setComponent ( v  rows*u, j  columns*i, first * cos1 * cos2 ); 
}; 
}; 
}; 
Dado un bloque de datos de rows  columns componentes y una matriz de 
transformación conforme —de 
columns − 1  rows ∗ rows − 1  1  columns − 1  columns ∗ rows − 1  1 
elementos—, el siguiente algoritmo realiza la transformación DCT. 
IMatrixReal* auxMatrix  new IMatrixReal (rows, columns); 
for ( UInt8 u  0; u  rows; u ) 
for ( UInt8 v  0; v  columns; v ) 
for ( UInt8 i  0; i  rows; i ) 
for ( UInt8 j  0; j  columns; j ) 
{ 
Real uvAux  auxMatrix-getComponent (u, v); 
Int16 ijAux  ( input-getComponent (i, j) - 128 ); 
Real transfAux  transfMatrix-getComponent (v  rows*u, j  columns*i); 
auxMatrix-setComponent ( u, v, uvAux  (ijAux * transfAux) ); 
}; 
for ( UInt8 u  0; u  rows; u ) 
for ( UInt8 v  0; v  columns; v ) 
result-setComponent (u, v, floor ( auxMatrix-getComponent (u, v)  0.5) ); 
 auxMatrix es una matriz auxiliar de números reales, de rows  columns 
componentes, inicializada toda con ceros. 
 input es una matriz de rows  columns componentes, que contiene el 
bloque de datos a transformar. 
 transfMatrix es la matriz de transformación de input. 
En el proceso de descompresión se debe llevar a cabo una antitransformación 
de los datos. A continuación se lista el algoritmo para el constructor de una matriz 
de antitransformación de rows  columns elementos. 
Real c, d; 
for ( UInt8 u  0; u  rows; u ) 
for ( UInt8 v  0; v  columns; v ) 
for ( UInt8 i  0; i  rows; i ) 
46 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
{ 
if ( i  0 ) 
c  1/sqrt( Real(2.0) ); 
else c  1; 
for ( UInt8 j  0; j  columns; j ) 
{ 
if ( j  0 ) 
d  1/sqrt( Real(2.0) ); 
else d  1; 
Real first  ( 2*c*d / sqrt( Real( rows*columns ) ) ); 
Real cos1  cos( (2*u  1) * i*PI/( 2*rows ) ); 
Real cos2  cos( (2*v  1) * j*PI/( 2*columns ) ); 
this-setComponent (v  rows*u, j  columns*i, first * cos1 * cos2 ); 
}; 
}; 
Dado un bloque de rows  columns coeficientes DCT y una matriz de 
antitransformación conforme —de 
columns − 1  rows ∗ rows − 1  1  columns − 1  columns ∗ rows − 1  1 
elementos—, el siguiente algoritmo realiza la antitransformación DCT. 
IMatrixReal* auxMatrix  new IMatrixReal (rows, columns); 
for ( UInt8 u  0; u  rows; u ) 
for ( UInt8 v  0; v  columns; v ) 
for ( UInt8 i  0; i  rows; i ) 
for ( UInt8 j  0; j  columns; j ) 
{ 
Real uvAux  auxMatrix-getComponent (u, v); 
Int16 ijAux  input-getComponent (i, j); 
Real transfAux  transfMatrix-getComponent (v  rows*u, j  columns*i); 
auxMatrix-setComponent ( u, v, uvAux  ijAux * transfAux ); 
}; 
for ( UInt8 u  0; u  rows; u ) 
for ( UInt8 v  0; v  columns; v ) 
result-setComponent (u, v, floor ( auxMatrix-getComponent (u, v)  0.5)  128 ); 
 auxMatrix es una matriz auxiliar de números reales, de rows  columns 
componentes, inicializada toda con ceros. 
 input es una matriz de rows  columns componentes, que contiene el 
bloque de coeficientes DCT a antitransformar. 
 transfMatrix es la matriz de antitransformación de input. 
Para un análisis exhaustivo de los constructores de las matrices de 
transformación y antitransformación, referirse al código fuente de los archivos 
47 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
transformationmatrix.h y transformationmatrix.cpp, situados en el 
directorio 
programacionproyectofinal.cvscompressorsrccompressorcommon 
Si se desea profundizar en la implementación de la transformación DCT, 
recurrir a los archivos dcttransformer.h y dcttransformer.cpp. Para la 
antitransformación, a los archivos idcttransformer.h y 
idcttransformer.cpp. Todos estos archivos se encuentran en 
programacionproyectofinal.cvscompressorsrccompressorcodecs 
Cuantificación 
Para la cuantificación, se utiliza una tabla para la luminancia (canal Y) y otra 
para las crominancias (canales Cb y Cr). Por defecto, estas tablas son las 
sugeridas por [GHANBARI2003] —figuras 28 y 29—, pero al estar almacenadas 
en un archivo de texto (quantization.tbl) son fácilmente editables. Vale la 
pena aclarar que una imagen debe ser descomprimida con las mismas tablas que 
fue comprimida, por esta razón se recomienda tener especial cuidado al editarlas. 
Tanto para la cuantificación como para la descuantificación, se utiliza un 
parámetro C (Calidad) de escalado, que determina la calidad de la imagen. Este 
parámetro es un número real entre 0 y 1, siendo 0 la peor calidad (factor de 
compresión más alto), 0.66 una calidad buena (sin escalado) y 1 la mejor calidad 
(factor de compresión más bajo). Previo al escalamiento propiamente dicho, a este 
parámetro C se le realiza un preproceso. Notaremos como Coriginal y Cpreprocesado al 
parámetro C antes y después del preproceso respectivamente. El parámetro 
Cpreprocesado también será un número real, pero su rango es de 0.25 a 16. El 
preproceso es el siguiente: 
Cpreprocesado  21−Coriginal 6−2 
Esto mapea el mínimo de Coriginal al máximo de Cpreprocesado, y el máximo de 
Coriginal al mínimo de Cpreprocesado. 
Luego se cargan en memoria las tablas ya escaladas. El escalado es muy 
simple, consiste de multiplicar cada componente de cada una de las dos tablas 
originales por el factor de escalado Cpreprocesado. 
Para la cuantificación, se divide el elemento (i,j) del bloque de coeficientes DC 
por el elemento (i,j) de la tabla de cuantificación escalada. Para la 
descuantificación, se multiplica el elemento (i,j) del bloque de coeficientes DC 
cuantificados por el elemento (i,j) de la tabla de cuantificación escalada. 
Para mayores detalles referirse al código fuente de los archivos 
quantization.h y quantization.cpp, situados en 
programacionproyectofinal.cvscompressorsrccompressorcommon 
48 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 
Codificación DPCM 
La implementación de la codificación y decodificación DPCM es la traducción 
directa del método explicado en el esquema secuencial baseline de JPEG. Es 
decir, para la codificación, al coeficiente DC del bloque a codificar se le debe restar 
el coeficiente DC del bloque codificado previamente. Al resultado de esta resta lo 
llamaremos Dif. Se construye un nuevo bloque, al coeficiente DC se le asigna Dif, 
y al resto de los coeficientes AC se les asigna los mismos valores que los 
contenidos en el bloque original. Luego, se debe almacenar el valor DC del bloque 
original, para poder realizar la codificación del próximo bloque. El código que 
implementa esto es el siguiente: 
BlockMatrix* result  new BlockMatrix ( input.getRows (), input.getColumns () ); 
for ( UInt8 row  0; row  input.getRows (); row ) 
for ( UInt8 column  0; column  input.getColumns (); column ) 
result-setComponent ( row, column, input.getComponent ( row, column ) ); 
result-setComponent (0, 0, input.getComponent (0, 0) - this-previousEncodingDCValue); 
this-previousEncodingDCValue  input.getComponent (0, 0); 
return result; 
 result es una matriz inicializada toda con ceros, donde se almacenará 
el bloque de coeficientes DCT codificado con DPCM. 
 input es el bloque de coeficientes DCT a codificar con DPCM. 
 previousEncodingDCValue es el valor DC del bloque codificado previamente. 
Si fuera el primer bloque a codificar, previousEncodingDCValue es igual a cero. 
Para la decodificación, al coeficiente codificado se le suma el coeficiente que 
se ha decodificado anteriormente. Se construye un nuevo bloque y al coeficiente 
DC se le asigna este valor. Además, este valor se almacena para la correcta 
decodificación del próximo bloque. Al resto de los coeficientes AC del bloque 
recién creado se les asigna los valores contenidos en el bloque original. La 
implementación es la siguiente: 
BlockMatrix* result  new BlockMatrix ( input.getRows (), input.getColumns () ); 
for ( UInt8 row  0; row  input.getRows (); row ) 
for ( UInt8 column  0; column  input.getColumns (); column ) 
result-setComponent ( row, column, input.getComponent ( row, column ) ); 
result-setComponent (0, 0, input.getComponent (0, 0)  this-previousDecodingDCValue); 
this-previousDecodingDCValue  result-getComponent (0, 0); 
return result; 
 result es una matriz inicializada toda con ceros, donde se almacenará 
49 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video
Proyecto final   compresión de imágenes y video

Contenu connexe

Similaire à Proyecto final compresión de imágenes y video

Trabajo sobre inspeccion visual
Trabajo sobre inspeccion visualTrabajo sobre inspeccion visual
Trabajo sobre inspeccion visualAndres Solano
 
Factores humanos de IHC
Factores humanos de IHCFactores humanos de IHC
Factores humanos de IHCRafael
 
vsip.info_frostig-protocolo-y-manual-2-pdf-free.pdf
vsip.info_frostig-protocolo-y-manual-2-pdf-free.pdfvsip.info_frostig-protocolo-y-manual-2-pdf-free.pdf
vsip.info_frostig-protocolo-y-manual-2-pdf-free.pdfBerenizeAlejandro
 
Presentacion para compartir 1° técnico
Presentacion para compartir 1° técnicoPresentacion para compartir 1° técnico
Presentacion para compartir 1° técnicoJosué González
 
25458297 taller-de-electronica-1
25458297 taller-de-electronica-125458297 taller-de-electronica-1
25458297 taller-de-electronica-1ninguna
 
Historia y evolución de la pc wil,stefa y harry
Historia y evolución de la pc wil,stefa y harryHistoria y evolución de la pc wil,stefa y harry
Historia y evolución de la pc wil,stefa y harrytefadianis
 
IHM Unidad 2: Factores Humanos, Estilos y Dispositivos de interacción
IHM Unidad 2: Factores Humanos, Estilos y Dispositivos de interacciónIHM Unidad 2: Factores Humanos, Estilos y Dispositivos de interacción
IHM Unidad 2: Factores Humanos, Estilos y Dispositivos de interacciónFranklin Parrales Bravo
 
Landsat analisis-visual
Landsat analisis-visualLandsat analisis-visual
Landsat analisis-visualsenarap
 
Fisiología de la vision.ppt
Fisiología de la vision.pptFisiología de la vision.ppt
Fisiología de la vision.pptAndreSouzaNovais
 
Exposición sobre monitores
Exposición sobre monitoresExposición sobre monitores
Exposición sobre monitoresLaura Parra
 

Similaire à Proyecto final compresión de imágenes y video (20)

Trabajo sobre inspeccion visual
Trabajo sobre inspeccion visualTrabajo sobre inspeccion visual
Trabajo sobre inspeccion visual
 
Programa imason
Programa imasonPrograma imason
Programa imason
 
Factores humanos de IHC
Factores humanos de IHCFactores humanos de IHC
Factores humanos de IHC
 
4 video y-cinedigital
4 video y-cinedigital4 video y-cinedigital
4 video y-cinedigital
 
vsip.info_frostig-protocolo-y-manual-2-pdf-free.pdf
vsip.info_frostig-protocolo-y-manual-2-pdf-free.pdfvsip.info_frostig-protocolo-y-manual-2-pdf-free.pdf
vsip.info_frostig-protocolo-y-manual-2-pdf-free.pdf
 
Tallericso1
Tallericso1 Tallericso1
Tallericso1
 
CURSO OCT SPECTRAL DOMAIN
CURSO OCT SPECTRAL DOMAINCURSO OCT SPECTRAL DOMAIN
CURSO OCT SPECTRAL DOMAIN
 
Presentacion para compartir 1° técnico
Presentacion para compartir 1° técnicoPresentacion para compartir 1° técnico
Presentacion para compartir 1° técnico
 
Análisis de imagen
Análisis de imagenAnálisis de imagen
Análisis de imagen
 
Video
VideoVideo
Video
 
25458297 taller-de-electronica-1
25458297 taller-de-electronica-125458297 taller-de-electronica-1
25458297 taller-de-electronica-1
 
Historia y evolución de la pc wil,stefa y harry
Historia y evolución de la pc wil,stefa y harryHistoria y evolución de la pc wil,stefa y harry
Historia y evolución de la pc wil,stefa y harry
 
problemas
problemasproblemas
problemas
 
Parte1
 Parte1  Parte1
Parte1
 
IHM Unidad 2: Factores Humanos, Estilos y Dispositivos de interacción
IHM Unidad 2: Factores Humanos, Estilos y Dispositivos de interacciónIHM Unidad 2: Factores Humanos, Estilos y Dispositivos de interacción
IHM Unidad 2: Factores Humanos, Estilos y Dispositivos de interacción
 
Landsat analisis-visual
Landsat analisis-visualLandsat analisis-visual
Landsat analisis-visual
 
Dsp3
Dsp3Dsp3
Dsp3
 
Fisiología de la vision.ppt
Fisiología de la vision.pptFisiología de la vision.ppt
Fisiología de la vision.ppt
 
Exposición sobre monitores
Exposición sobre monitoresExposición sobre monitores
Exposición sobre monitores
 
anyi moncayo
anyi moncayoanyi moncayo
anyi moncayo
 

Dernier

Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionarmando_cardenas
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOSelenaCoronadoHuaman
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3AlexysCaytanoMelndez1
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfmasogeis
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...ITeC Instituto Tecnología Construcción
 

Dernier (7)

Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacion
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdf
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
 

Proyecto final compresión de imágenes y video

  • 1. PROYECTO FINAL DE CARRERA COMPRESIÓN DE IMÁGENES Y VIDEO (formato MPEG2) Fernando Martín Pap Director: Mg. Silvia Mabel Castro UNIVERSIDAD NACIONAL DEL SUR – BAHIA BLANCA – ARGENTINA Departamento de Ciencias e Ingeniería de la Computación Ingeniería en Sistemas de Computación x de abril de 2005
  • 2. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap AGRADECIMIENTOS A mis padres y hermanos, que siempre confiaron en mi, me han apoyado en todo momento y me dieron fuerzas para poder cumplir mi meta. A mi directora, por todo el tiempo que me dedicó, por sus recomendaciones y por haber confiado en mi. A todos aquellos que hicieron que mis años de estudio hayan sido realmente maravillosos. 2 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 3. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap ÍNDICE Introducción 6 Percepción 6 El sistema visual 7 El ojo 7 La retina 7 Los conos 8 Los bastones 9 Psicofísica visual 9 El sistema auditivo 11 El oído 12 La membrana basilar 12 Psicofísica auditiva 13 Bandas críticas 13 Enmascaramiento frecuencial 14 Enmascaramiento temporal 15 Compresión 16 Codificación de Huffman 16 Codificación aritmética 19 Compresión de imágenes 20 Compresión de imágenes con pérdida 21 Submuestreo (subsampling) 21 Formatos de muestreo de YCbCr 23 Transformada discreta del coseno (DCT) 24 Wavelet 28 Formato de imagen JPEG 30 Esquema secuencial (baseline) 32 Cuantificación 33 Recorrido en zigzag 35 Codificación RLC 35 3 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 4. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Codificación DPCM 36 Codificación entrópica 37 Codificación de los coeficientes DC Diferenciales 37 Codificación de los coeficientes AC 38 Caso de estudio: COMPRESSLIB 40 Librería de compresión de imágenes 41 Muestreo 43 Discretización en bloques 45 Transformación DCT 45 Cuantificación 48 Codificación DPCM 49 Recorrido en zigzag y codificación RLC 50 Codificación de Huffman 54 Compress demo 56 Image viewer 57 Compresión de video 59 Codificación temporal 60 Compensación de movimiento 60 Compresión de audio 61 Replicación de banda espectral (SBR) 61 Formato de video MPEG2 62 Perfiles y niveles 63 Capas 63 Codificación de video 64 Cuadros I, P, B, D 64 Compensación de movimiento 65 Codificación de audio 66 Modelo psicoacústico 67 Multiplexado y sincronización de audio y video 69 4 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 5. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Trenes de programa y de transporte 69 Tren de programa 69 Tren de transporte 70 Unidades de presentación y de acceso 70 Trenes elementales empaquetados (PES) 71 Multiplexado del tren de programa 72 Multiplexado del tren de transporte 72 Encabezado del paquete de transporte 73 Información específica de programa (PSI) 73 Buffers del codificador y del decodificador 74 Estampillas de tiempo y referencias de reloj 75 Estampilla de tiempo de presentación (PTS) 77 Estampilla de tiempo de decodificación (DTS) 77 Asignación de estampillas de tiempo 78 Librerías de reproducción de video MPEG 78 Librería SMPEG 79 Bibliografía 82 5 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 6. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap INTRODUCCIÓN Históricamente la representación de la información ha sido una de las áreas que ha generado mucho interés. En los comienzos de la computación, las limitaciones en los medios de almacenamiento convirtieron en una tarea crucial la representación óptima de la información. Técnicas de compresión como la codificación de Lempel-Ziv, de Huffman, o la aritmética, permitieron representar la información con mucho menor cantidad de datos. En las tres técnicas anteriormente mencionadas se procesan los datos de modo tal de evitar almacenar información redundante. Si la información recuperada luego del proceso de descompresión es exactamente igual a la original, decimos que es un proceso de compresión sin pérdida, en caso contrario se dice que es un proceso de compresión con pérdida. La primera de las alternativas se basa en la redundancia estadística (entropía) de los datos y es de un uso muy general, ya que no pierde información. La segunda puede lograr relaciones de compresión mucho mejores, pero lo hace mediante la eliminación de información. Cuanto más información se elimine, mayor será la relación de compresión, pero la calidad de la información recuperada será menor. Debido a esto entra en juego la noción de calidad —que es inversamente proporcional a la relación de compresión. La compresión con pérdida sin embargo, sólo puede utilizarse para datos con forma específica, pues en algunos casos los datos son intolerantes a la pérdida de información. La compresión de imágenes, sonido y video son áreas de gran interés que, basándose en la percepción humana, descartan información irrelevante para poder lograr su cometido. Afortunadamente la tecnología de almacenamiento ha evolucionado de un modo considerable, no obstante el problema persiste. Áreas como la televisión satelital, teleconferencias, telefonía visual, la industria cinematográfica, grandes bases de datos multimedia, etc., no podrían existir —incluso aprovechando la actual tecnología de almacenamiento disponible— si no fuera por la posibilidad de compresión de datos. PERCEPCIÓN El ser humano posee muy buenos sensores que le permiten obtener una representación del mundo exterior. Esto lo logra a través del sentido de la vista, del oído, del tacto, del olfato y del gusto. Al tratarse de una investigación sobre compresión de imágenes y de video, nosotros sólo nos concentraremos en el sentido de la vista y del oído. Tanto el ojo como el oído tienen sus características especiales y sus limitaciones. El estudio detallado de éstas ha hecho posible el desarrollo de técnicas de compresión —tanto de sonido como de imágenes y video— que permiten ponderar la información, de manera tal de priorizar los datos de mayor relevancia para nuestros órganos. Primero analizaremos brevemente la visión humana, luego la audición. 6 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 7. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap El sistema visual La vista es uno de los cinco sentidos corporales, por el que se percibe la luz y que da a conocer el color, la forma, la distancia, el tamaño y el movimiento de los cuerpos. La visión contribuye a informarnos de nuestra posición y mantiene conexiones con los centros que rigen el equilibrio postural. Es el resultado de una serie de fenómenos sucesivos que se producen de modo coordinado: 1) formación de la imagen en la retina; 2) estimulación de las células receptoras de la retina; 3) conducción al cerebro del impulso elaborado por dichas células; 4) formación de la imagen en el cerebro. El ojo El ojo le transmite la información al cerebro a través del nervio óptico. Esta información se propaga por impulsos de naturaleza electroquímica, cuya velocidad está comprendida entre diez y cien metros por segundo. Cuando los ojos están abiertos, la luz entra por la pupila, que es una abertura del iris. El diámetro de la pupila puede modificarse: se agranda cuando desciende la luminosidad y se contrae a plena luz, y ello de modo automático, obedeciendo a un reflejo nervioso. Detrás de la pupila se encuentra el cristalino, que concentra la luz sobre el fondo del ojo. El cristalino es regulable, permitiendo así ver con claridad tanto los objetos próximos como los lejanos. En el fondo del ojo se halla situada la retina. La retina esta formada por capas de células nerviosas sensibles a la luz. La córnea esta situada en la parte anterior del ojo y es, al igual que el cristalino, una superficie que contribuye a concentrar los rayos luminosos sobre la retina. El cristalino —y, en cierta medida, también la córnea— desvía los rayos de tal forma que la imagen se proyecta invertida sobre la retina. La retina La retina está compuesta por fotorreceptores que convierten la intensidad y el color de la luz en señales nerviosas que son procesadas por el cerebro. La retina contiene dos clases de fotorreceptores, bastones y conos. Los bastones son más numerosos —alrededor de 120 millones— y son más sensitivos a la luz que los conos. Sin embargo, los bastones no son sensibles al color. Los conos —entre 6 y 7 millones— son quienes proveen al ojo de sensitividad al color, y están mayormente concentrados en la mácula. En el centro de esta región se encuentra la fóvea —un área de 0.3 mm de diámetro—, donde no existen bastones y la concentración de conos es muy grande. 7 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 8. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Los conos Las experiencias empíricas sugieren que dentro del conjunto de los conos existen tres clases distintas de receptores de color, y se han establecido las curvas de respuesta para cada tipo de cono (figura 1) [CRRE]. Basándose en estas curvas de respuesta se pudieron clasificar los conos en "rojos" (64%), "verdes" (32%) y "azules" (2%) [NAVE2005]. Los conos verdes y rojos están concentrados en la fóvea, mientras que la sensitividad de los conos azules se encuentra mayormente fuera de esta zona. Los conos azules merecen un estudio particular debido a que constituyen tan sólo un 2% del total y se encuentran fuera de la fóvea. Se los identifica en la curva de respuesta a la luz en un pico aproximadamente a los 445 nm. Si bien son mucho más sensitivos a la luz que los conos verdes y rojos, no es suficiente para contrarrestar su poco porcentaje en cantidad. Sin embargo, la sensitividad al color azul en nuestra percepción visual final es comparable a la de los colores verde y rojo. Esto sugiere que nuestro cerebro posee un "amplificador azul". La percepción visual de los objetos intensamente azules es menos precisa que la percepción de objetos rojos o verdes. Esta reducción de agudeza visual se atribuye a dos efectos. Primero, los conos azules se encuentran fuera de la fóvea, donde los conos dispuestos muy cerca unos de otros pueden brindar la mayor resolución. Segundo, el índice de refracción para la luz azul es lo suficientemente diferente del índice de refracción de la luz roja y verde como para que cuando el rojo y el verde estén en foco, el azul se vaya ligeramente de foco. Los conos son los responsables de la visión de alta definición. El ojo se mueve continuamente para que la luz reflejada por el objeto en interés se concentre en la fóvea, donde reside la mayor cantidad de conos. Figura 1: Curvas de respuesta de los conos. 8 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 9. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Los bastones Si bien anteriormente mencionamos que la presencia de bastones es nula dentro de la fóvea, éstos se encuentran concentrados en todo el resto de la superficie de la retina. Son los encargados de la visión nocturna, de la detección de los movimientos y de la visión periférica. Los bastones son fotorreceptores increíblemente eficientes —mas de mil veces más sensitivos que los conos. Tal es así que, bajo condiciones óptimas, pueden activarse tan sólo por fotones individuales. La visión adaptada a la oscuridad se alcanza en su totalidad luego de un período de oscuridad considerable (alrededor de 30 minutos). Esto se debe a que el proceso de adaptación de los bastones es mucho más lento que el de los conos. Mientras que la agudeza o resolución visual es mucho mejor con los conos, los bastones son mejores sensores de movimiento. Debido a que los bastones predominan en la visión periférica, esta visión es más sensitiva a la luz, y por lo tanto podemos ver objetos menos brillantes con nuestra visión periférica. Por ejemplo, si vemos una estrella no muy brillante con nuestra visión periférica, al intentar mirarla directamente desaparecerá. Esto es debido a que estamos moviendo la imagen dentro de la región de la fóvea, la cual es rica en conos y pobre en bastones, y por lo tanto menos sensitiva a la luz. Por la misma razón es que se pueden detectar mejor los movimientos con la visión periférica. Psicofísica visual Una de las áreas en donde comenzó la psicología es en el campo de la psicofísica. La psicofísica intenta encontrar la "física del cuerpo humano". Consiste en aplicarle un estímulo a una persona, y luego obtener de esta persona la respuesta de la experiencia psicológica asociada al estímulo físico. Uno de los descubrimientos es la noción de threshold o umbral. Un umbral es un límite psicológico de la percepción. El umbral absoluto es la mínima cantidad de estimulación sensorial que se puede detectar el 50 % de las veces (el motivo por el cual el límite se fijó en el 50 % es la variabilidad de la capacidad humana). El umbral relativo es el menor incremento o decremento de un estímulo físico que puede detectarse el 50 % de las veces. La noción de umbral no es exclusiva del sentido de la vista, sino que se puede aplicar a cualquiera de los órganos sensoriales. Un ejemplo de umbral relativo aplicado al sentido de la vista podría ser decidir cuál de dos luces es más brillante. La relación entre la intensidad de la luz que entra al ojo y el brillo percibido no es una función lineal. Esto significa que a medida que la intensidad de una fuente luminosa cambia, el observador no percibirá un cambio igual en el brillo. La respuesta de la intensidad real del ojo es muy parecida a una respuesta logarítmica. De hecho, se ha mostrado experimentalmente que la intensidad de una fuente luminosa debe ser cercana al doble antes de que el ojo pueda detectar 9 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 10. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap que ésta ha cambiado. Por lo tanto, los cambios ligeros en la intensidad en regiones oscuras de una imagen tienden a ser más perceptibles que los cambios iguales en regiones brillantes. Esta relación que hay entre la intensidad de la iluminación y el brillo percibido se conoce como Ley de Weber. Existen varios fenómenos que muestran que la iluminación percibida no es una función simple de la intensidad. Entre ellos se encuentra el contraste simultáneo, que es una ilusión por la cual el brillo percibido de una región depende de la intensidad del área circundante. En la figura 2 se observan cinco cuadrados dispuestos horizontalmente, cada uno de ellos sucesivamente más claro. Dentro de cada cuadrado se encuentra un círculo exactamente igual, sin embargo cuanto más claro es el cuadrado que lo contiene, más oscuro parece verse. Figura 2: Contraste simultáneo. Otro fenómeno a tener en cuenta es el de las bandas de Mach, que es una ilusión por la cual el sistema visual acentúa los cambios importantes de intensidad. El sistema visual tiende a sobrevalorar o infravalorar la intensidad en las proximidades de los límites de dos regiones con intensidades diferentes. De este modo, el ojo incrementa el realce en los contornos de las transiciones de intensidad, y gracias a esto se puede obtener una agudeza visual muy buena. Si se observa la figura 3 de izquierda a derecha, cada banda pareciera hacerse más oscura justo antes de la transición. Si la figura 3 se observa de derecha a izquierda, cada banda pareciera hacerse más clara justo antes de la transición. Esto provoca la ilusión de que la transición sea de mayor amplitud de lo que es en realidad. Figura 3: Bandas de Mach. El sistema visual también tiene problemas en cuanto a la respuesta en 10 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 11. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap frecuencia. El ojo tiene problemas para resolver detalles finos, o transiciones de intensidad. Generalmente, la respuesta en frecuencia del ojo disminuye a medida que las transiciones de intensidad se vuelven cada vez más finas. El contraste es otro factor a tener en cuenta. Cuanto más alto es el contraste, más fino es el detalle que el ojo puede resolver. Por lo tanto, cuando las transiciones son demasiado finas o el contraste es demasiado bajo, el ojo ya no puede resolverlos satisfactoriamente. En estos casos el ojo sólo puede percibir un promedio del nivel de gris del área en cuestión. En la figura 4 se puede apreciar un patrón que incrementa la frecuencia de izquierda a derecha y disminuye el contraste de abajo hacia arriba [MS]. Figura 4: Patrón de frecuencia y contraste. El sistema auditivo Este es el sistema mediante el cual podemos percibir los sonidos. Las cualidades del sonido percibidas por el oído son el tono, la intensidad y el timbre. El tono depende de la frecuencia de las vibraciones: una frecuencia elevada provoca tonos agudos y una frecuencia baja tonos graves. La frecuencia se mide en Hertz —Hz.— y se refiere a la cantidad de ciclos por segundo de una onda periódica. La intensidad con que se percibe un sonido depende de la amplitud de la vibración y del tono. Psicológicamente se lo percibe como volumen y se mide en decibeles —dB. El timbre permite distinguir sonidos de la misma intensidad y frecuencia, pero con distintas armónicas de la frecuencia del tono fundamental; es decir, con distinta forma de onda —por este motivo es que podemos diferenciar una misma nota en distintos instrumentos musicales. El sonido puede ser medido con gran exactitud, sin embargo entender cómo se recibe y se transforma en pensamientos dentro del cerebro no es nada trivial. La audición es el resultado de una serie de procesos acústicos, mecánicos, nerviosos 11 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 12. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap y mentales que nos da la impresión de sonido. El oído En la estructura física del oído se pueden distinguir tres zonas: el oído externo, el oído medio y el oído interno. El oído externo comprende el pabellón de la oreja, en forma de embudo, y el conducto auditivo externo, obturado en su extremo por el tímpano. El oído medio se halla constituido por la caja del tímpano, cavidad que contiene la cadena de huesecillos: martillo, yunque y estribo. Estos huesecillos transmiten las vibraciones desde el tímpano hasta la ventana oval. El oído interno está constituido por una serie de cavidades alojadas en el hueso temporal, y consta de tres partes: el vestíbulo, la cóclea y los conductos semicirculares. En el vestíbulo se encuentra la ventana oval, por la que el oído interno comunica con el medio. Al vestíbulo le sigue la cóclea, un tubo diminuto que se enrolla dos veces y media sobre sí mismo. El interior de la cóclea está dividido en tres conductos mediante dos membranas que lo recorren longitudinalmente. Sobre una de ellas se encuentra el órgano de Corti, que es el órgano de la audición propiamente dicho y que está formado por unas 25.000 células sensitivas. Las vibraciones sonoras transmitidas por las partículas del aire son canalizadas por el pabellón de la oreja hacia el conducto auditivo externo, hasta llegar al tímpano. Por medio de la cadena de huesecillos el tímpano comunica las vibraciones a la ventana oval y a la cóclea. La presión originada en la cóclea por las vibraciones sonoras hace vibrar a la membrana basilar. Durante el paso de la onda, el órgano de Corti también oscila, friccionando la membrana tectorial y excitando las células sensoriales, que estimulan el cerebro. La membrana basilar La membrana basilar se encuentra dentro de la cóclea y la recorre en toda su extensión. Esta membrana varía en masa y rigidez a lo largo de su longitud. Sobre el extremo más próximo a la ventana oval la membrana es rígida y liviana, y debido a esto su frecuencia de resonancia es alta. Sobre el extremo más lejano la membrana es blanda y pesada, y es por esto que su frecuencia de resonancia es baja. El rango de las frecuencias de resonancia disponibles en la membrana determina el rango de frecuencias de la audición humana. El oído humano puede distinguir entre 16 y 20.000 vibraciones por segundo (entre 16 Hz. y 20 kHz.), pero la mayoría de las personas sólo puede distinguir sonidos que se encuentran dentro del rango de los 20 Hz. hasta los 15 kHz. La membrana basilar transforma cada frecuencia en impulsos nerviosos en una región distinta, de manera que la percepción del tono depende del oído y no del sistema nervioso central. Además, esta membrana posee pequeños músculos que actúan como si fuera un sistema de realimentación positiva que mejora el factor Q de resonancia [TEKTRONIX97]. 12 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 13. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Psicofísica auditiva La psicofísica auditiva o psicoacústica es el estudio de la percepción subjetiva de los sonidos en los seres humanos. En otras palabras, es el estudio de la psicología de la percepción acústica. Ya mencionamos en la sección de psicofísica visual que la noción de umbral no es exclusiva de ningún sentido. Para el oído, el umbral relativo del tono sobre el rango medio de audición es aproximadamente de 2 Hz. Es decir que se pueden percibir cambios de tono no menores a 2 Hz. No obstante, bajo ciertas condiciones, se puede llegar a percibir variaciones menores [WIKIPEDIA2005]. El límite inferior para el umbral absoluto de la intensidad de cualquier sonido audible está a 0 dB. El límite superior no está tan claramente definido. Se podría definir como la intensidad máxima sin que dañe físicamente al oído. Pero este no es un límite fijo, pues depende del tiempo de exposición. Por ejemplo, exposiciones de cortos períodos de sonidos de 120 dB. podrían ser inofensivas para el oído, sin embargo largas exposiciones de sonidos de 80 dB. podrían dañarlo. Un estudio más riguroso de los límites inferiores de audibilidad determina que el umbral mínimo para el cual se puede oír un sonido es dependiente de la frecuencia del mismo. Por medio de mediciones de tonos de la menor intensidad audible y a distintas frecuencias, se puede establecer una curva de respuesta de umbral absoluto de audición (figura 5) [TEKTRONIX97]. El oído posee un pico de sensitividad (un mínimo en la curva) dentro del rango de 1 kHz. hasta 5 kHz., y cabe destacar que la voz humana cae dentro de este mismo rango. Figura 5: Curva del umbral en silencio. Bandas críticas Los sonidos con distintas frecuencias causan que vibren áreas diferentes de la membrana basilar, excitando a unas u otras células sensitivas. Las señales de los 13 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 14. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap sonidos son contínuas, y por lo tanto existen sonidos de infinitas frecuencias diferentes. Por supuesto que no puede existir una relación biunívoca entre cada frecuencia posible con un área distinta de la membrana basilar, por lo tanto habrán sonidos de frecuencias similares que excitarán a las mismas células nerviosas. Debido a esto, si dos sonidos con el mismo volumen que se encuentran dentro de la misma banda crítica suenan simultáneamente, el sonido no será percibido el doble de fuerte, sino que levemente más fuerte que cualquiera de ellos por separado. Para que dos sonidos se encuentren dentro de la misma banda crítica, es necesario que sus frecuencias sean similares. Si los sonidos hubieran sido de frecuencias lo suficientemente distintas como para estar dentro de distintas bandas críticas, el sonido percibido hubiera sido considerablemente mas fuerte. Esto se debe a que no se solapan las células sensitivas excitadas en la membrana basilar. En las frecuencias audibles más bajas, el ancho de las bandas críticas es de aproximadamente 100 Hz. A medida que se incrementa la frecuencia, el ancho de las bandas críticas se hace más grande, superando los 3 kHz. en las frecuencias más altas. Enmascaramiento frecuencial Bajo determinadas condiciones, un sonido que es claramente audible puede ser enmascarado por otro sonido. Por ejemplo, se complicaría mucho mantener una conversación si hay mucho ruido en el ambiente. A este fenómeno se lo llama enmascaramiento frecuencial. Un sonido débil es enmascarado si se hace inaudible con la presencia de otro más fuerte. Si un sonido se encuentra cercano en frecuencia al sonido fuerte será más fácilmente enmascarado que si se encuentra apartado de su frecuencia. En la figura 6 se puede apreciar cómo un único tono afecta al umbral [TEKTRONIX97]. El umbral se incrementa tanto hacia las frecuencias bajas como hacia las altas, pero el incremento hacia las frecuencias altas es un poco más acentuado. En presencia de un espectro complejo, como el de la música, el umbral se incrementaría en la mayoría del rango. Es por esto que el zumbido de un cassette analógico sólo se puede oír durante los espacios en blanco. 14 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 15. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 6: Enmascaramiento frecuencial. Enmascaramiento temporal El comportamiento resonante de la membrana basilar es análogo al comportamiento de un analizador de transformadas. De acuerdo a la teoría de las transformadas, cuanto más exacto se conoce el dominio de la frecuencia de una señal, menos exactitud se dispondrá en el dominio del tiempo —y viceversa. Es decir que cuanto más pueda distinguir una transformada entre dos frecuencias, menor será su capacidad para discriminar entre dos eventos. En el oído humano se observa un compromiso de modo de equilibrar la incerteza en ambos dominios, y por lo tanto no es perfecto en ninguno de ellos. La imperfección al discriminar entre frecuencias es lo que produce el mencionado enmascaramiento frecuencial. La imperfección en la discriminación del tiempo se debe a la respuesta resonante del oído. El factor Q es tal que un determinado sonido debe estar presente por al menos un milisegundo para que pueda ser audible. Debido a esta lenta respuesta, el enmascaramiento puede producirse aún cuando las señales involucradas no son simultáneas. El preenmascaramiento y postenmascaramiento se producen cuando el sonido enmascarante continúa enmascarando sonidos más débiles antes y después de la duración real del sonido enmascarante (figura 7) [TEKTRONIX97]. 15 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 16. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 7: Enmascaramiento temporal. COMPRESIÓN La compresión de datos reduce la cantidad de bytes necesarios para representar la información. Es decir, reduce la cantidad de memoria necesaria para almacenar la información. Del mismo modo, también reduce la cantidad de tiempo requerido para transmitir información a una tasa de transmisión dada. Como ya mencionamos, podemos clasificar los métodos de compresión en:  Compresión sin pérdida.  Compresión con pérdida. Como los métodos de compresión con pérdida son muy dependientes del área en cuestión —audio, imágenes, video, etc.—, en esta sección solamente nos ocuparemos de la compresión sin pérdida. Hay una gran cantidad de aplicaciones en las que no es posible realizar una compresión con pérdida debido a que la mínima pérdida de la información original sería intolerable —archivos de texto, ejecutables, etc. En estos casos la única alternativa es la compresión sin pérdida. Pero de todos modos, en los casos en que sí se puede aplicar compresión con pérdida, la mayoría de las veces también se realiza (como último paso) una compresión sin pérdida. El hecho de aplicar una compresión sin pérdida luego de haber realizado toda la compresión con pérdida comprime aún mas los datos, sin mas efectos adversos que un incremento en el tiempo de los procesos de compresión-descompresión. Existen muchas técnicas de compresión sin pérdida, entre las más importantes se encuentran la codificación de Huffman y la codificación aritmética. Estas técnicas se basan en la codificación entrópica. La entropía es la cantidad de información presente en los datos, y un codificador de entropía codifica un conjunto de símbolos con la menor cantidad de bits necesarios para representarlos. Codificación de Huffman La codificación de Huffman es un método de codificación entrópica de longitud variable que asocia un valor específico con un único código. La codificación de 16 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 17. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Huffman se conoce como una codificación de prefijo debido a que ningún código es prefijo de otro más largo. Esta propiedad hace que un código Huffman sea decodificable unívocamente. La codificación de Huffman es general, es por esto que la compresión debe pensarse sobre símbolos abstractos, siendo por ejemplo las letras del alfabeto un caso particular. En un archivo de texto simple, cada caracter está representado por ocho bits. Esta representación no es óptima si tenemos en cuenta que estadísticamente algunos caracteres están presentes mucho más frecuentemente que otros. La codificación de Huffman ordena los símbolos más frecuentes en secuencias cortas de bits, y por lo tanto los símbolos menos frecuentes estarán representados por secuencias más largas. Las frecuencias relativas de todos los símbolos pueden ser conocidas —por medio de estudios estadísticos— o pueden calcularse en cada caso en particular. Por ejemplo, existen tablas que indican los valores probabilísticos de ocurrencia de cada letra en un texto —cada idioma posee su propia tabla. Entonces, para comprimir un texto se puede utilizar una codificación de Huffman siguiendo la tabla correspondiente —que no necesariamente será cien por cien exacta— o calcular la probabilidad real de cada símbolo que se encuentra en ese texto en particular. Cada alternativa tiene sus ventajas y sus desventajas. El hecho de utilizar una tabla facilita mucho la implementación del compresor —el descompresor utiliza la misma tabla para llevar a cabo la tarea de descompresión—, pues de lo contrario habría que contar las apariciones de cada caracter dentro del texto. Por esta misma razón también puede ser —si el texto es extenso— que el compresor resulte más eficiente. Por otro lado, si se calcula la probabilidad exacta de aparición de cada símbolo, intuitivamente podríamos pensar que el texto acabaría ocupando menos datos debido a que la representación de la información terminaría siendo la óptima. Si bien esto es cierto, no debemos olvidarnos que junto al texto comprimido debe estar también la tabla con la cual se llevó a cabo la compresión, de lo contrario el proceso no sería reversible. Por lo tanto veremos una ganancia al calcular las probabilidades reales sólo en aquellos textos tal que su tamaño sea considerable respecto de lo que ocupa su tabla correspondiente —a menos que la tabla estándar se ajuste muy bien al texto. Generalmente las tablas no indican los valores probabilísticos, sino que directamente muestran el código correspondiente. En el caso en que sólo se disponga de las probabilidades —ya sea porque es la única información que brinda la tabla o porque se desea utilizar una tabla ad hoc— habrá que construir una tabla que indique el código que representa a cada símbolo. A continuación veremos un ejemplo de cómo calcular las probabilidades reales de un texto y otro de cómo construir una tabla de símbolos con sus respectivos códigos. Supongamos el siguiente texto: "este es un texto de ejemplo". Primero determinaremos el alfabeto, luego contaremos la cantidad de apariciones dentro del texto. La longitud de nuestro texto es de 27 caracteres, por lo tanto la probabilidad de cada símbolo será la cantidad de apariciones dividido 27. 17 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 18. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Símbolo Apariciones Probabilidad ’d’ 1 1 27 ’e’ 7 7 27 ’j’ 1 1 27 ’l’ 1 1 27 ’m’ 1 1 27 ’n’ 1 1 27 ’o’ 2 2 27 ’p’ 1 1 27 ’s’ 2 2 27 ’t’ 3 3 27 ’u’ 1 1 27 ’x’ 1 1 27 ’ ’ (espacio) 5 5 27 Tabla 1: Cálculo de probabilidades. Ahora veremos cómo construir una tabla de símbolos con sus respectivos códigos, teniendo como dato sus probabilidades. Supongamos la siguiente tabla [LIOU2001]: Símbolo Probabilidad a0 0.4 a1 0.3 a2 0.2 a3 0.04 a4 0.04 a5 0.02 Tabla 2: Probabilidades para construir una tabla de códigos Huffman. El procedimiento es el siguiente: Repetir mientras haya mas de una probabilidad Ordenar las probabilidades en orden descendiente. Combinar las dos probabilidades más pequeñas. Asignarle "0" al miembro superior y "1" al miembro inferior de cada par (o viceversa). 18 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 19. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Seguir el camino de cada símbolo hasta llegar al final (probabilidad 1) registrando los unos y ceros. Asignarle a cada símbolo la secuencia registrada, de derecha a izquierda. Gráficamente (figura 8): Figura 8: Codificación de Huffman. Finalmente la tabla es la siguiente: Símbolo Código (Codeword) Longitud a0 1 1 a1 00 2 a2 010 3 a3 0111 4 a4 01100 5 a5 01101 5 Tabla 3: Tabla de símbolos con sus respectivos códigos Huffman. Codificación aritmética La codificación aritmética se basa en secuencias de símbolos. En vez de asignarle un código único a cada símbolo, esta técnica genera una serie de valores que corresponden con una única secuencia de datos. Para producir la codificación se utiliza la probabilidad de ocurrencia de los símbolos individuales. Esta técnica representa cada símbolo como un segmento de la recta real entre 0 y 1. La codificación de una secuencia de símbolos se logra seleccionando un segmento de reales y transmitiendo un número específico dentro de ese segmento. Veamos un ejemplo para poder comprender mejor el método [LIOU2001]. Consideremos los siguientes símbolos con sus respectivas probabilidades de ocurrencia: 19 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 20. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Símbolo Probabilidad A 0.50 C 0.30 G 0.15 T 0.5 Tabla 4: Probabilidades de codificación aritmética. Gráficamente (figura 9) se explica cómo codificar la secuencia de símbolos "CAT". Figura 9: Codificación aritmética. Cualquier número en el rango de 0.6425 a 0.65 representa la cadena "CAT". La codificación aritmética puede comprimir desde un 5% hasta un 10% mas que la codificación de Huffman. Lamentablemente no sólo es más compleja de comprender y de implementar, sino que además está sujeta a patentes pertenecientes a IBM, AT&T y Mitsubishi. COMPRESIÓN DE IMÁGENES La mayoría de las imágenes poseen una característica en común: los pixeles cercanos están correlacionados, y por lo tanto contienen información redundante. Entonces es primordial encontrar la representación menos correlacionada de la imagen. En las imágenes tenemos dos tipos de redundancia:  Redundancia espacial (o correlación entre pixeles cercanos).  Redundancia espectral (o correlación entre los distintos planos de color o bandas espectrales). Las investigaciones en compresión de imágenes buscan reducir el número de bits necesarios para representar una imagen por medio de la reducción de la redundancia espacial y espectral tanto como sea posible. Además de reducir la 20 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 21. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap redundancia, en una imagen también es muy útil reducir la irrelevancia. Con esto último nos referimos a omitir información que de todos modos ninguna persona podrá distinguir (percepción). Compresión de imágenes con pérdida Todos los métodos de compresión de imágenes con pérdidas involucran la eliminación de información de la imagen original. La gran ventaja de estos esquemas es que pueden comprimir una imagen con un factor de compresión mucho más alto que los esquemas de compresión sin pérdidas. Este factor de compresión puede ser de 10:1 sin degradaciones visuales notables, pero si se toleran algunas degradaciones visuales se pueden lograr factores de compresión de hasta 100:1. Existen en la actualidad muchos métodos de compresión de imágenes con pérdidas. A continuación analizaremos los más utilizados. Submuestreo (subsampling) La forma más sencilla de reducir la cantidad de datos que ocupa una imagen es directamente descartando pixeles. Si por ejemplo, eliminamos con regularidad un pixel y el siguiente no, estaríamos comprimiendo la imagen a la mitad. Un posible proceso de descompresión podría ser simplemente mediante replicación de pixeles. Otra técnica más refinada podría ser realizar una interpolación de los pixeles disponibles para obtener aquellos que habían sido descartados. Es muy común encontrar en las imágenes que los pixeles adyacentes estén correlacionados. Si este fuera el caso, la imagen reconstruida no será muy diferente a la original. Si bien la técnica anteriormente mencionada es válida, es un tanto agresiva y puede producir degradaciones visuales intolerables para determinadas aplicaciones. Es sabido que el ojo humano es más sensible a la luminancia (brillo) que a la crominancia (color) —debido a que el ojo humano posee muchos mas bastones que conos. Es por esto que los cambios graduales de color se ven como un único color, y esto se puede utilizar para nuestro propósito. Generalmente a las imágenes se las representa con el espacio de color RGB, que es una tripla que define el color de cada pixel por medio de la combinación de los tres colores primarios —rojo, verde y azul. En lugar de representar a una imagen por medio de la adición de los colores primarios, podemos realizar una conversión de espacios de color para poder representarla por medio de los siguientes tres canales:  Y: Luminancia (brillo).  Cb: Crominancia (azul).  Cr: Crominancia (roja). En las figuras 10, 11 y 12 se puede ver una imagen en color junto con sus respectivos canales RGB y YCbCr. 21 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 22. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 10: Imagen en color. Figura 11: Canales RGB. Figura 12: Canales YCbCr. Dada una imagen representada con el espacio de color RGB, podemos convertirlo al espacio de color YCbCr mediante las siguientes expresiones: Y  0.299R  0.587G  0.114B [1.1] Cb  −0.1687R − 0.3313G  0.5B [1.2] Cr  0.5R − 0.4187G − 0.0813B [1.3] Cabe destacar que esta conversión es levemente diferente a la utilizada para la codificación de video [JACK2001]. Además hay que tener en cuenta que los cálculos se realizarán utilizando una precisión determinada. Debido a esto se incurrirá en pequeños errores de redondeo que llevarán a una transformación con pérdida, independientemente del método de muestreo que se utilice. Una vez que hemos realizado la conversión al espacio de color YCbCr 22 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 23. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap podemos comprimir la imagen llevando a cabo un submuestreo de los canales Cb y Cr, dejando intacto el canal Y —debido a que el ojo humano es menos sensible a los canales cromáticos que al del brillo. Casi ningún ojo humano es capaz de detectar esto, y el tamaño del archivo se verá reducido en un porcentaje muy alto —dependiendo del modo en que se realice el muestreo. Existen estándares que aconsejan sobre el modo de realizar el muestreo [JACK2001]. Este paso produce que sucesivas compresiones se vean cada vez un poco peor, pues este paso no es reversible. Además, las fotos naturales son más propensas a contener cambios graduales de color que las imágenes producidas por los humanos. Es por esto que no se recomienda utilizar esta técnica sobre imágenes que puedan incluir textos o bloques grandes de un único color. Formatos de muestreo de YCbCr La figura 13 ilustra la posición de las muestras de YCbCr para el formato 4:4:4. Cada muestra posee un valor de Y, de Cb y de Cr. Cada componente de la muestra es generalmente de 8 bits, por lo tanto cada muestra será de 24 bits. La figura 14 ilustra la posición de las muestras de YCbCr para el formato 4:2:2. Por cada dos muestras horizontales de la componente Y se toma una de Cb y de Cr. Cada componente de la muestra es generalmente de 8 bits, por lo tanto cada muestra será de 16 bits. La figura 15 ilustra la posición de las muestras de YCbCr para el formato 4:1:1 (también conocido como YUV12). Por cada cuatro muestras horizontales de la componente Y se toma una de Cb y de Cr. Cada componente de la muestra es generalmente de 8 bits, por lo tanto cada muestra será de 12 bits. En lugar de la única reducción horizontal de 2:1 de las componentes Cb y Cr utilizada en el formato 4:2:2, el formato 4:2:0 implementa una reducción de 2:1 en las componentes Cb y Cr tanto horizontalmente como verticalmente. Existen cinco formatos de muestreo 4:2:0 distintos; en la figura 16 se ilustran dos de ellos. Para mostrar datos que se encuentren en el formato 4:2:2 o 4:1:1 o 4:2:0, primero es necesario realizar una conversión al formato 4:4:4, utilizando interpolación para generar las muestras faltantes de Cb y Cr. Figura 13: Formato 4:4:4. Figura 14: Formato 4:2:2. Figura 15: Formato 4:1:1. 23 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 24. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 16: Formatos 4:2:0. Transformada discreta del coseno (DCT) Existen muchas transformaciones matemáticas que transforman un conjunto de datos de un sistema de medición a otro. En algunos casos la representación de los datos en el nuevo sistema posee propiedades que facilitan la compresión de los mismos. La transformada discreta del coseno (Discrete Cosine Transform - DCT de aquí en mas) es una de las transformaciones más importantes en el área de la compresión de imágenes digitales. La DCT transforma un bloque de datos en un nuevo conjunto de valores. La DCT inversa invierte este proceso, recuperando los valores originales de los datos. En la teoría, en el proceso de transformación y antitransformación no se pierde nada de información. Sin embargo, en la práctica, existe una pequeña pérdida de información debido a los dos siguientes factores:  Los valores del coseno no se pueden calcular exactos.  Los resultados finales de los cálculos se ven afectados por los errores de redondeo debido a la limitada precisión en la representación de los datos. Las diferencias entre los datos recuperados y los originales son generalmente pequeñas, pero depende del método utilizado para calcular la DCT. La DCT se puede aplicar a bloques de datos de cualquier tamaño, pero lo más usual es utilizar bloques de 8  8. Esto se debe a que, desde el punto de vista de la implementación, un bloque de 8  8 no demanda grandes requisitos de memoria. Además, la complejidad algorítmica para tales bloques es asequible en la mayoría de las plataformas. Por otro lado, desde el punto de vista del factor de compresión, si utilizamos bloques mayores no obtendremos grandes mejoras. La definición de la DCT está dada por: DCTu, v  2 nm CuCv m−1 Σ pixelx, y cos 2x  1u Σ y0 n−1 x0 2n cos 2y  1v 2m [2.1] La definición de la DCT inversa está dada por: pixelx, y  2 nm m−1 Σ CuCvDCTu, v cos 2x  1u Σ y0 n−1 x0 2n cos 2y  1v 2m [2.2] Donde, para ambos casos: 24 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 25. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap u  0, . . . ,n v  0, . . . ,m C  1 2 ,   0 1,  ≠ 0 La DCT puede implementarse siguiendo su definición, pero existen métodos incrementales más veloces [RY1990], [GHANBARI2003]. Puede no resultar intuitivo de su definición, pero cada valor calculado en el proceso de transformación involucra una matriz de transformación (función base) distinta —de n  m componentes. Para el caso más común de bloques de 8  8, se cuenta con 64 matrices de transformación, cada una de 8  8. Cada función base representa una combinación de frecuencias de la forma de onda del coseno en dos dimensiones. La idea es determinar cuánto de cada patrón de frecuencia hay en el bloque de datos a transformar. Esto se logra realizando el producto interno de la entrada y su función base correspondiente. Es decir, cada término de una función base específica se multiplica por su término correspondiente en el bloque de datos. Luego, todos estos productos se suman para formar un único valor. Este único valor representa la cantidad de la frecuencia contenida en el bloque de datos. Básicamente, la DCT cambia los valores originales que representan intensidades de color en valores que representan frecuencias del coseno. En la figura 17 se observan las funciones base canónicas y base DCT para un bloque de datos de 8  8. Figura 17: Funciones base canónicas y base DCT. Algunos ejemplos nos ayudarán a entender estos conceptos. En los siguientes ejemplos se transformarán bloques de datos de 8  8 utilizando una implementación sencilla —la utilizada en el caso de estudio COMPRESSLIB— de 25 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 26. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap la DCT. Los valores de los datos originales representan intensidades de color en el rango de 0 a 255. Cabe destacar que la DCT produce mejores valores para la compresión si los datos originales están centrados en 0, por lo tanto, previo a la transformación propiamente dicha se le resta 128 a cada componente —para obtener valores en el rango de -128 a 127. Asimismo, luego de realizar la antitransformación se debe sumar 128 a cada componente para recuperar los valores originales. Primero consideremos un bloque de datos que representa una región toda del mismo color y su respectiva transformada (figura 18). En el bloque de datos no hay frecuencias —pues es todo del mismo color—, y consecuentemente todos los términos de la transformada excepto el superior izquierdo (DCT0,0), son cero. Si observamos la matriz superior izquierda de las funciones base DCT en la figura 17, veremos que es una superficie uniforme (todos sus valores son iguales). Esta función base es especial debido a que representa el caso particular de frecuencia cero. Al término DCT0,0 se lo denomina coeficiente DC. El nombre DC (Direct Current) proviene del área de la electricidad y significa corriente continua —la corriente continua no varía en el tiempo, por lo tanto no tiene frecuencia. Al resto de los términos se los denomina coeficientes AC (Alternating Current) y significa corriente alterna. A los datos transformados de la figura 18 se los puede comprimir almacenando solamente el coeficiente DC y algún código especial para indicar que el resto de los términos son cero. Figura 18: Transformación de un bloque uniforme. Consideremos ahora otro ejemplo. En la figura 19 se puede observar un bloque de datos que representa una superficie donde el color cambia suavemente. Nótese que todos los valores no nulos resultantes de la transformación se encuentran en la esquina superior izquierda (y a lo largo de la primera fila y la primera columna). Estos términos no nulos corresponden a las frecuencias bajas de los datos originales. Estos datos pueden comprimirse —mediante algún recorrido específico de la matriz— intentando almacenar solamente los términos no nulos, de modo análogo al ejemplo anterior. 26 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 27. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 19: Transformación de un bloque en degrade. Analizaremos un último ejemplo. Los datos originales de la figura 20 son aleatorios, esto lleva a que en los datos transformados no haya casi ningún valor nulo, y parecieran no estar mejorados para poder comprimirlos. La clave es que ha cambiado la importancia de cada valor. Examinemos nuevamente las funciones base DCT de la figura 17: las funciones base que se encuentran en la esquina superior izquierda capturan frecuencias bajas, mientras que las que se encuentran en la esquina inferior derecha capturan frecuencias más altas. Las frecuencias más altas capturan el "ruido" y el detalle fino dentro de un bloque de datos, mientras que las frecuencias más bajas capturan la "esencia" del bloque de datos —debido a la respuesta logarítmica del ojo; la percepción humana del ruido en las imágenes depende de la frecuencia espacial. En algunos casos, el ruido contenido en un bloque de datos puede ser eliminado completamente sin degradaciones visuales. La cantidad de ruido que eliminemos al comprimir un bloque de datos determinará la calidad de la imagen. Más específicamente, el conjunto de coeficientes obtenido debe ser cuantificado. Es decir, cada coeficiente es dividido por un valor almacenado en una tabla —tabla de cuantificación— de modo tal de reducir su valor numérico. Estos nuevos valores se deben redondear —o truncar—, y en el caso de obtener un cero, sencillamente se estaría descartando esa información. Si el nuevo valor no resultara ser cero, de todos modos estaríamos obteniendo una mejora, ya que cuanto menor sea el valor, menor será la cantidad de bits que serán necesarios para representarlo. El factor de compresión obtenido utilizando este método depende de los valores de los elementos de la tabla de cuantificación. Cuantos mas elementos en la tabla posean valores grandes, mayor será la cantidad de coeficientes que quedarán nulos, y por lo tanto mayor será el factor de compresión. Por supuesto que esto incrementará la pérdida de información, y por lo tanto la calidad de la imagen será menor. Para reconstruir la imagen se debe revertir todo el proceso. 27 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 28. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 20: Transformación de un bloque aleatorio. Wavelet Como ya mencionamos, las variaciones suaves en el color se corresponden con variaciones de baja frecuencia y las variaciones fuertes de color se corresponden con variaciones de alta frecuencia. La transformación del espacio de intensidades de color al espacio frecuencial se puede llevar a cabo de muchos modos. Uno de los posibles es la anteriormente presentada DCT. Otra de las posibles técnicas es la descomposición de una imagen por medio de la Transformada Discreta Wavelet o Discrete Wavelet Transform (DWT), la cual analizaremos brevemente a continuación. La forma general de una transformada wavelet unidimensional (1-D) se puede apreciar en la figura 21. Aquí una señal pasa a través de un filtro pasa bajos y de otro pasa altos, l y h (de lowpass y highpass, en inglés) respectivamente, y luego se submuestrea en un factor de dos —esto causa un proceso con pérdida—, logrando una transformada de un nivel. Se pueden realizar múltiples niveles repitiendo los procesos de filtrado y eliminación (submuestreo), únicamente sobre la rama del filtro pasa bajos. Este proceso se lleva a cabo para un número K finito de niveles, obteniendo los coeficientes wavelet: di1n, i ∈ 1, . . . ,K y dK0n. Cuando no se necesita tener conocimiento de la escala o de la frecuencia, el conjunto entero de coeficientes wavelet se expresa como wn. Figura 21: Descomposición de una wavelet de 1-D, de K niveles. La transformada wavelet de 1-D puede extenderse a una transformada wavelet bidimensional (2-D) utilizando filtros wavelet separables. Con los filtros separables, la transformada 2-D puede calcularse aplicando una transformada 1-D a cada fila 28 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 29. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap de los datos de entrada, y luego aplicándola a cada columna de los datos de entrada. Utilizando la imagen original de la figura 22 [USEVITCH2001], la figura 23 muestra un ejemplo de transformada wavelet 2-D de un nivel (K1), con su correspondiente esquema de descomposición en la figura 24. El mismo ejemplo, pero para un nivel de 3, se ve en las figuras 25 y 26. Figura 22: Imagen original. Figura 23: Wavelet de un nivel. Figura 24: Descomposición de 1 nivel. 29 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 30. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 25: wavelet de 3 niveles. Figura 26: Descomposición de 3 niveles. Así como la transformada wavelet se utiliza para separar una imagen en varias clases de importancia, la antitransformada se utiliza para reensamblar las distintas clases de datos, y de este modo poder reconstruir la imagen. Aquí también se utiliza un filtro pasa bajos y otro pasa altos, pero el filtrado se realiza en forma opuesta. Es decir, se comienza desde el nivel más alto, aplicando primero los filtros por columna y luego por fila, hasta llegar al primer nivel. La codificación basada en wavelet ha mejorado considerablemente durante los últimos años. Un gran progreso fue la introducción de la codificación EZW (embedded zero-tree), de Shapiro. Este algoritmo es capaz de aprovechar las propiedades de multiresolución de la transformada wavelet y es muy eficiente. Formato de imagen JPEG En la actualidad existe una cantidad muy grande de formatos de imagen. Cada uno con sus respectivos puntos fuertes y débiles, según sea la aplicación para la cual fueron diseñados —calidad, razón de compresión, eficiencia, costos (patentes, licencias, etc.), estándares, etc. A mediados de 1980, miembros de la ITU —International Telecommunication Union (Unión Internacional de Telecomunicaciones)— y de la ISO —International Standards Organisation (Organización Internacional de Estándares)— se asociaron para llevar a cabo un estándar para la compresión de imágenes en escala de grises y en colores. Este estándar se llamó JPEG: Joint Photographic Experts Group (Grupo de Expertos Fotográficos Asociados). Unos años más tarde, el comité de JPEG decide desarrollar otro estándar para la compresión de imágenes, llamado JPEG2000. Esto fue en respuesta a las demandas cada vez mayores de multimedia, internet y una gran variedad de aplicaciones de imágenes digitales. Sin embargo, en términos de la metodología de compresión, estos dos estándares son muy distintos —mientras que el JPEG original está basado en la DCT, el JPEG2000 está basado en la DWT. 30 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 31. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Las imágenes JPEG pueden ser de cualquier resolución y espacio de color, tanto con algoritmos con pérdida como sin pérdida. El estándar JPEG es de propósito general, y posee muchas características y posibilidades. Por ejemplo, por medio del ajuste de parámetros, se puede tomar una decisión de compromiso entre la calidad de la imagen y su factor de compresión. El rango de compresión es muy amplio: desde aproximadamente 100:1 —con degradaciones visuales importantes— hasta aproximadamente 3:1 —indistinguible de la imagen original. Generalmente, el umbral del factor de compresión para percibir diferencias entre la imagen original y la reconstruida, se encuentra dentro del rango de 10:1 a 20:1 —dependiendo de la imagen original. Si bien el formato JPEG se desarrolló con la intención de comprimir imágenes, ha resultado satisfactorio para la compresión de video, principalmente si se trata de video en tiempo real —pues es más eficiente en términos computacionales que otras soluciones, como el formato MPEG. También resultó útil en la tarea de edición. Sin embargo, el factor de compresión que logra no es muy alto, ya que no aprovecha la redundancia temporal entre cuadros. Una vez que ha finalizado el proceso de edición, el video puede convertirse a un formato más apropiado para obtener una compresión mayor. El formato JPEG define cuatro modos de operación distintos: sin pérdida, secuencial, progresivo y jerárquico. La codificación sin pérdida se basa en un algoritmo espacial, en el dominio de los pixeles. Se lleva a cabo una predicción del valor de una muestra, teniendo en cuenta hasta tres muestras vecinas. Luego, al valor real se le resta el valor de la predicción y la diferencia se codifica sin pérdida utilizando codificación de Huffman o aritmética. La compresión sin pérdida logra un factor de compresión de aproximadamente 2:1. Los otros tres modos de compresión se basan en la DCT. El esquema secuencial puede utilizar tanto codificación de Huffman (la opción por defecto de JPEG - baseline sequential scheme) como codificación aritmética. Cuando la imagen se reconstruye, cada fila (bloques de 8  8 pixeles) se decodifica —de izquierda a derecha y de arriba hacia abajo— y se presenta secuencialmente con toda su exactitud y resolución. El esquema progresivo presenta la imagen en múltiples pasos. Cuando la imagen se decodifica, inmediatamente se obtiene una mera aproximación de la imagen completa. Progresivamente se va mejorando la calidad, hasta lograr su exactitud total. Esto es ideal para aplicaciones de búsqueda en bases de datos de imágenes o exploración de sitios web. Se puede utilizar selección espectral, aproximación sucesiva, o ambas. La selección espectral codifica los coeficientes de baja frecuencia de la DCT al principio (para obtener la imagen rápidamente), seguido de los coeficientes de alta frecuencia (para añadir los detalles). La aproximación sucesiva codifica los bits más significativos de los coeficientes de la DCT, seguido de los bits menos significativos. Por último, el modo jerárquico representa a una imagen en múltiples resoluciones. Por ejemplo, supongamos que existen tres versiones de una imagen: 512  521, 1024  1024 y 2048  2048. Las imágenes con mejor resolución se 31 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 32. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap codifican como diferencias de la siguiente imagen más chica, requiriendo menos bits de los que necesitaría si se almacenara individualmente. Por supuesto, el número total de bits es mayor al requerido para almacenar solamente la imagen de mayor resolución. Cabe destacar que las imágenes individuales en una secuencia jerárquica pueden ser codificadas progresivamente. Esquema secuencial (baseline) Aquí estudiaremos las distintas etapas del pipeline de compresión-descompresión del esquema secuencial. Primero comentaremos brevemente cada uno de los pasos, y luego se profundizará en aquellos que lo requieran. Las técnicas que ya hayan sido analizadas con anterioridad serán mencionadas superficialmente. En la figura 27 se puede apreciar un diagrama esquemático de un compresor. Figura 27: Diagrama esquemático de un compresor (secuencial) JPEG. Si la imagen que se desea comprimir es en colores, entonces el primer paso es convertir esta imagen al espacio de colores YCbCr —el estándar JPEG no define un espacio de color específico para la imagen de entrada. Luego, es posible realizar algún submuestreo de los canales Cb y Cr. El estándar JPEG permite cualquiera de los formatos de muestreo de YCbCr; para la correcta descompresión, en el encabezado se almacena información del factor de muestreo vertical y horizontal. Luego, cada plano del espacio de color se discretiza en 32 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 33. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap bloques de 8  8 pixeles —en caso de tratarse de una imagen en escala de grises, esta imagen se discretiza sin ningún preprocesamiento. El siguiente paso es realizar un corrimiento de los valores de las componentes de cada bloque, pues la DCT produce mejores valores para la compresión si los datos originales están centrados en 0. Como el rango original es de 0 a 255, al restarle 128 el nuevo rango será de -128 a 127. A continuación, a cada bloque se le aplica la DCT. Luego, cada bloque se cuantifica teniendo en cuenta una tabla de cuantificación. Una vez cuantificado, se recorre el bloque en zigzag, de modo tal de acumular la mayor cantidad posible de ceros al final del recorrido. Después, los coeficientes DC de los bloques se codifican mediante DPCM; los coeficientes AC se codifican mediante RLC. Luego de esta primer codificación, cada conjunto se codifica independientemente por segunda vez, en este caso mediante un codificador entrópico —codificación de Huffman, pues es la única posibilidad en el esquema secuencial baseline. Una vez terminados estos procesos, se cuenta con toda la información comprimida, lista para almacenar o transmitir. Para descomprimir una imagen, simplemente se invierte todo el proceso. Se utilizan decodificadores entrópicos, un decodificador RLC, un decodificador DPCM, se reconstruyen los bloques, se descuantifican, se antitransforman y finalmente se obtiene la imagen recuperada. Cuantificación En este proceso se reduce la precisión de los coeficientes, consecuentemente el número de bits necesarios para representarlos será menor. Esto se lleva a cabo dividiendo cada valor en el bloque por un único divisor (entre 1 y 256) que está almacenado en una tabla —tabla de cuantificación. Debido a la percepción humana, generalmente las frecuencias más altas se dividen por factores mayores, por lo tanto muchos coeficientes finalizan siendo cero. Matemáticamente la cuantificación es una operación de división, sin embargo si los factores de cuantificación se restringen a potencias de dos, esto se puede realizar muy eficientemente realizando corrimientos. La cantidad de precisión que se puede reducir sin involucrar pérdidas visuales considerables es dependiente de los datos. Es por esto que el estándar JPEG no impone ninguna tabla de cuantificación, sino que lo deja abierto para que cada aplicación defina la más conveniente para sus propósitos. No obstante, existen tablas de propósito general. Es usual que haya una tabla para la luminancia y otra —con coeficientes mayores— para las crominancias. Además, al comprimir utilizando estas tablas estándar, se puede almacenar en el encabezado un parámetro de escalamiento. Esto le brinda flexibilidad a las tablas, pues dependiendo del factor de escalamiento se podrá incrementar o disminuir la calidad de la imagen —inversamente proporcional al factor de compresión. En la figura 28 se muestra una tabla de cuantificación para luminancia y en la 29 una para crominancias, ambas de propósito general [GHANBARI2003]. 33 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 34. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap El proceso de decodificación restaura las magnitudes de los términos, pero por supuesto que no la precisión original. Esto se lleva a cabo invirtiendo la operación, es decir multiplicando por el mismo número que anteriormente se había dividido. Por lo tanto, un conjunto de datos sólo podrá ser decodificado satisfactoriamente si el codificador y el decodificador utilizan las mismas tablas. Las tablas pueden estar incluidas en el conjunto de datos comprimidos —tablas ad hoc, almacenadas en el encabezado— o pueden ser tablas predefinidas —almacenadas tanto en el compresor como en el descompresor. El análisis de cuál de las dos alternativas es más conveniente es análogo al realizado con las tablas de probabilidad en la codificación de Huffman. Es posible que al utilizar tablas específicas se logre un mejor desempeño, pero hay que tener en cuenta que estas tablas deberán formar parte de la imagen comprimida. Si la imagen es muy grande con respecto al costo asociado de almacenar las tablas, probablemente convenga utilizar esta opción. Por otro lado, si la imagen a comprimir es muy pequeña, es posible que el hecho de almacenar las tablas en la misma imagen comprimida represente un porcentaje considerable del tamaño total, con lo cual sería conveniente utilizar las tablas estándar. Otros factores que afectan son los de la eficiencia y complejidad de implementación. Es muy probable que el factor de más relevancia a la hora de decidir cuál decisión tomar sea el de la eficiencia. Es cierto que el objetivo primordial de la compresión de imágenes es reducir la cantidad de datos que las representan, pero en muy pocas ocasiones el hecho de guardar las tablas de cuantificación representará un costo importante. Observemos que una tabla de cuantificación es una matriz de 8  8 componentes, y en la mayoría de las aplicaciones se trabaja con imágenes de varios órdenes de magnitud mayor a 8  8 pixeles. Figura 28: Tabla de cuantificación para Y. 34 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 35. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 29: Tabla de cuantificación para Cb y Cr. Recorrido en zigzag Luego de la cuantificación, es muy probable que muchos términos que se encuentran en la esquina inferior derecha se redondeen —o trunquen— a cero. Será más eficiente almacenar la cantidad de ceros que almacenarlos individualmente. Mas aún, cuando sólo queden elementos nulos por codificar, se podrá almacenar un símbolo que indique esta situación. El recorrido en zigzag es una técnica que reagrupa los términos de los bloques en un arreglo lineal, de modo tal de incrementar la probabilidad de que los elementos no nulos se encuentren al principio, agrupando los ceros al final. Esto se logra recorriendo los bloques en zigzag a 45 grados, comenzando por el extremo superior derecho y finalizando en el extremo inferior izquierdo, como se muestra en la figura 30. Figura 30: Recorrido en zigzag. Codificación RLC Una vez que se dispone del arreglo resultante del recorrido en zigzag, se lo codifica con RLC (Run Length Coding - codificación de longitud de cadenas), en series de pares (longitud, valor). La componente longitud indica la cantidad de coeficientes nulos y la componente valor indica el siguiente coeficiente no nulo en 35 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 36. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap el arreglo. Cabe destacar que la componente longitud utilizará sólo cuatro bits, por lo tanto su rango será de 0 a 15. Por lo tanto, si nos encontráramos con una secuencia de, por ejemplo, 20 ceros y a continuación un 8, esta cadena se representaría como: (15,0),(4,8). Es decir, el primer par indica que hay 15 ceros y a continuación un cero —en total 16 ceros—; el primer término del segundo par debe completar los 20 ceros, por lo tanto es 4, y finalmente le sigue el 8. Cuando se detecta que el bloque lo termina una cadena de ceros, se codifica como (0,0). Como muchas veces los arreglos quedan con largas cadenas de ceros consecutivos, esta codificación elimina mucha redundancia. Veamos un ejemplo completo, considerando el siguiente bloque: -800 -73 0 -7 0 -2 0 -1 -73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 Recorrido en zigzag: -800,-73,-73,0,0,0,-7,0,0,-7,0,0,0, 0,0,-2,0,0,0,0,-2,0,0,0,0,0,0,0,-1, 0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 RLC: (0,-800),(0,-73),(0,-73),(3,-7),(2,-7), (5,-2),(4,-2),(7,-1),(6,-1),(0,0) Codificación DPCM La codificación DPCM (Differential Pulse Code Molulation - codificación modulada de pulsos diferenciales) es un caso particular de la codificación predictiva. Se basa en la información ya disponible para predecir valores futuros, y lo que se codifica es la diferencia entre el valor real y el de la predicción. La idea es restarle al coeficiente DC actual el coeficiente DC anterior, y almacenar ese valor —excepto que se trate del primer coeficiente DC de la imagen, en cuyo caso se almacena el coeficiente DC original. A este valor lo llamaremos DC Diferencial, o simplemente Dif. Este tratamiento por separado de los coeficientes AC se realiza para explotar la correlación entre los valores DC de los bloques adyacentes. Por ejemplo, supongamos que los cuatro primeros bloques —ya cuantificados— poseen los siguientes coeficientes DC: 733, 708, 737 y 677. La codificación DPCM se observa en la figura 31. 36 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 37. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 31: Codificación DPCM. Para decodificar una serie de coeficientes se realiza lo siguiente. Al coeficiente codificado se le suma el coeficiente que se ha decodificado anteriormente —a menos que sea el primer coeficiente por decodificar, en cuyo caso no se le suma nada. En la figura 31 se observa la decodificación DPCM del ejemplo anterior. Figura 32: Decodificación DPCM. Codificación entrópica Para reducir la cantidad de bits necesarios para representar los bloques cuantificados, tanto los coeficientes Dif. como los AC se codifican entrópicamente. Para esto se utilizan dos esquemas básicos: el VLC (Variable Length Coding - codificación de longitud variable) y el VLI (Variable Length Integer - entero de longitud variable). El VLC codifica la cantidad de bits utilizados por cada coeficiente, mientras que el VLI codifica los enteros signados. Aquí se utilizarán tablas de códigos Huffman predefinidas, sin embargo recordemos que el estándar JPEG permite especificar sus propios códigos en el encabezado. Codificación de los coeficientes DC Diferenciales La codificación de los coeficientes Dif. se lleva cabo mediante tres pasos [BOUMAN2001]. 1. Determinar la cantidad m de bits necesarios para representar Difk sin signo. Por ejemplo, la representación binaria no signada del número −3 es 11, por lo tanto m  2 bits. 37 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 38. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 2. Utilizar la tabla 5 para codificar m. A esto se lo conoce como codificación VLC. 3. Si Difk  0, entonces tomar los m menos significativos bits. Si Difk  0, entonces tomar el complemento a dos de la representación de Difk − 1 y tomar los m menos significativos bits. A este paso se lo conoce como codificación VLI. Se lleva a cabo para representar eficientemente los coeficientes, pues |Difk |  2m − 1. Por ejemplo, si m  2, Difk debe pertenecer al conjunto −3, −2, 2,3. Como los valores −1, 0,1 no son posibles, para no desperdiciar bits podemos remapear los valores enteros al rango 0, 1, 2,3. Consideremos el caso cuando Difk  −3. En este caso m  2. Como Difk  0, hay que tomar el complemento a dos de la representación de Difk − 1, el cual es 11111100. Tomando los m menos significativos bits nos queda 00. Ahora si Difk  3, entonces la representación de Difk en complemento a dos es 00000011, y tomando los m menos significativos bits nos queda 11. En la práctica, se debe utilizar aritmética de 16 bits para el complemento a dos, para poder trabajar con los doce bits de los valores signados de Difk. El resultado de esta codificación se presenta como una cadena de bits que contiene primero la parte VLC y luego la VLI. Rango de los valores de DC Difk Cantidad de bits (m) Código Huffman 0 0 00 -1,1 1 010 -3,-2,2,3 2 011 -7...-4,4...7 3 100 -15...-8,8...15 4 101 -31...-16,16...31 5 110 -63...-32,32...63 6 1110 -127...-64,64...127 7 11110 -255...-128,128...255 8 111110 -511...-256,256...511 9 1111110 -1023...-512,512...1023 10 11111110 -2047...-1024,1024...2047 11 111111110 Tabla 5: Códigos Huffman para la representación de cada valor posible de m de los coeficientes Difk. Codificación de los coeficientes AC 38 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 39. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Los coeficientes AC se codifican de modo similar a los coeficientes Difk, pero teniendo en cuenta que los coeficientes AC estarán representados por pares (longitud, valor). 1. Teniendo en cuenta el par (longitud, valor), determinar el par (longitud, m), donde longitud es la cantidad de ceros que precede al valor no nulo y m es la cantidad de bits necesarios para representar la componente valor del primer par. A m se lo determina del mismo modo que en el paso 1 de la codificación de los coeficientes Dif. Entonces, por ejemplo el par (longitud, valor)  (3,-3) deberá representarse como (longitud, m)  (3,2). Al par (15,0) se lo representa con el símbolo ZRL. Al par (0,0) se lo representa con el símbolo EOB. 2. Mapear la componente valor en una secuencia de m bits, del mismo modo que en el paso 3 de la codificación de los coeficientes Dif. A este paso se lo denomina codificación VLIac. 3. Utilizar una tabla de códigos Huffman para coeficientes AC [BOUMAN2001], [GHANBARI2003] para mapear el par (longitud, m) en un código Huffman, denominado VLCac. 4. Concatenar los códigos VLCac,VLIac para formar una cadena de bits que representa la codificación del par original (longitud, valor). Veamos un ejemplo que ilustre el procedimiento completo [BOUMAN2001]. Supongamos que el bloque a codificar es el primero de la imagen y que posee los siguientes valores: 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Los pares que resultan del recorrido en zigzag son los siguientes: (0,3),(15,0),(15,0),(15,0)(2,9),(0,0) La cadena de bits que representa la codificación entrópica se construye a continuación. 39 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 40. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap 011  VLC de m  2 del coeficiente DC del par (0,3) 11  VLI del coeficiente DC 3 11111111001  VLCac de ZRL —par (15,0) 11111111001  VLCac de ZRL —par (15,0) 11111111001  VLCac de ZRL —par (15,0) 111111110100  VLCac de (2,4) —del par original (2,9) 1001  VLIac del valor 9 —del par original (2,9) 1010  VLCac de EOB —par (0,0) Al concatenar estos códigos obtenemos la siguiente cadena de bits: ’011”11”111 7F 11111001’ F9 ’11111111 FF 001”11111 3F 111001”11 E7 11111101 FD 00”1001”10 26 10”?????? ?? Las llaves denotan los límites de los bytes, y las comillas simples denotan grupos de bits asociados a los códigos. Es claro que la cadena de bits no siempre finalizará al final de un byte. Si el bloque actual no es el último de la imagen, entonces la cadena de bits que producirá la codificación del próximo bloque deberá concatenarse al final de la codificación del bloque actual. Si el bloque actual sí es el último de la imagen, entonces lo que se realiza es completar —si fuera necesario— el último byte con ceros, para asegurar un número entero de bytes. A esto se lo denomina padding de ceros. La segunda línea representa el valor hexadecimal del byte asociado. En la secuencia se ve el valor 0xFF, pero este valor está reservado para el encabezado JPEG. Entonces, lo que se realiza para evitar problemas es, ante la ocurrencia de un valor 0xFF, añadir a continuación un byte con el valor 0x00. A esto se lo llama byte stuffing. Teniendo en cuenta estos detalles, la secuencia correcta debería ser: 7F F9 FF 00 3F E7 FD 26 ??. El verdadero valor del último byte será determinado al codificar el próximo bloque. Caso de estudio: COMPRESSLIB El propósito de este caso de estudio es ilustrar las diferentes etapas del pipeline de compresión-descompresión del esquema secuencial baseline del formato de imagen JPEG. Cabe aclarar que la intención de este caso de estudio no es realizar una implementación de un compresor-descompresor de imágenes JPEG. La idea es mostrar, mediante el desarrollo de un formato propio —formato BCI (Basic Compressed Image)—, cómo se pueden llevar a la práctica los distintos conceptos teóricos. Por este motivo es que se le ha dado mayor prioridad a la facilidad de comprensión de la implementación que a la eficiencia. Este desarrollo consiste de lo siguiente:  Una librería de compresión de imágenes (COMPRESSLIB), modularizada para poder acceder independientemente a cada una de las etapas de compresión-descompresión. 40 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 41. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap  Una aplicación que ilustra el funcionamiento interno de cada una de las etapas de compresión-descompresión —Compress demo.  Una aplicación de compresión y visualización de imágenes —Image viewer. Librería de compresión de imágenes Aquí describiremos el funcionamiento general de la librería, analizando en detalle los temas que lo requieran. La librería COMPRESSLIB fue desarrollada en C y compilada a un archivo compressor.lib, que deberá ser incluido por cualquier aplicación que desee utilizarla. Esta librería utiliza otra librería, DevIL (Developer’s Image Library), que es una librería de imágenes Open Source basada en la licencia LGPL. Si bien la librería DevIL soporta muchos formatos de imágenes, sólo se la utiliza para cargar imágenes que luego serán comprimidas por COMPRESSLIB, o para almacenar imágenes en algún formato estándar. Por esta razón, las aplicaciones que utilicen la librería COMPRESSLIB, tendrán que incluir también (sólo en el caso que la aplicación requiera cargar o almacenar imágenes con formatos estándar) el archivo devil.dll. A continuación describiremos las capacidades y limitaciones del formato BCI. Este formato permite almacenar dos tipos de imágenes distintas: Imágenes en escala de grises —8 bits por pixel— e imágenes en color —24 bits por pixel—. Para las imágenes en color, se emplea el formato de muestreo 4:2:2. Utiliza tablas de cuantificación fijas —una para el canal Y y otra para los canales Cb y Cr—, almacenadas en un archivo de texto (quantization.tbl), que deberá residir en el mismo directorio que la aplicación. Estas tablas pueden modificarse simplemente editando el archivo y cambiando los valores de los coeficientes de las matrices. Además, en el encabezado se guarda un parámetro que indica el factor de calidad de la imagen, que determina el escalado de estas tablas. Para la codificación entrópica se adoptó la codificación de Huffman, y se utiliza una tabla de códigos sugerida por [BOUMAN2001] y [GHANBARI2003], almacenada en un archivo de texto (huffman.tbl) que debe hallarse en el mismo directorio que la aplicación. Al igual que con las tablas de cuantificación, los códigos podrían modificarse editando el archivo. En la figura 33 puede observarse un diagrama del encabezado del formato. Posee 6 campos:  Id (Identificador) - Es el identificador del formato. Este campo es fijo, y siempre debe contener los caracteres ’b’, ’c’, ’i’ y ’ ’(espacio) —4 datos de tipo char (en total 4 bytes).  L (Largo) - Este campo almacena el largo (o ancho) de la imagen, medido en pixeles. El tipo de datos que almacena es unsigned int —entero de 32 bits (o 4 bytes) no signado.  A (Alto) - Este campo almacena la altura de la imagen, medida en pixeles. El tipo de datos que almacena es unsigned int —entero de 32 bits (o 4 bytes) no signado. 41 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 42. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap  BPP (Bits Por Pixel) - Este campo almacena la cantidad de bits que son necesarios para representar un pixel de la imagen. Sólo puede ser 8 (escala de grises) o 24 (color). Su tipo de datos es unsigned char —entero de 8 bits (o 1 byte) no signado.  C (Calidad) - Este campo almacena un número real entre 0 y 1, y se utiliza para definir el escalado de las tablas de cuantificación. Controla la calidad de la imagen, siendo 0 la peor calidad (factor de compresión más alto), 0.66 una calidad buena (sin escalado) y 1 la mejor calidad (factor de compresión más bajo). Su tipo de datos es float —real de 32 bits (o 4 bytes).  T (Tamaño) - Este campo almacena la cantidad de bytes que ocupan los datos comprimidos propiamente dichos. Es el último campo del encabezado. El tipo de datos que emplea es unsigned int —entero de 32 bits (o 4 bytes) no signado. Figura 33: Encabezado del formato BCI. Ahora estudiaremos las distintas etapas del pipeline de compresión-descompresión. El diagrama esquemático de este pipeline puede observarse en la figura 34. Si bien el formato no especifica una implementación determinada, nosotros explicaremos cómo lo hace COMPRESSLIB. No explicaremos en detalle cada una de las clases, ya que esto superaría los alcances de este trabajo, no obstante sí se analizarán los extractos de código que sean relevantes. Para acceder a la documentación de COMPRESSLIB, referirse al archivo annotated.html, en la ruta programacionproyectofinal.cvscompressordocscompresslib. Dado que el funcionamiento general es análogo al del esquema secuencial del formato JPEG, comenzaremos inmediatamente a analizar cada una de las etapas. 42 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 43. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Figura 34: Diagrama esquemático de un compresor BCI. Muestreo En esta etapa, para la compresión, se realiza un submuestreo de los canales YCbCr con el formato 4:2:2. A cada canal se lo representa como si fuera una imagen individual. Los datos están almacenados en un arreglo, por filas, de izquierda a derecha y de arriba hacia abajo. Entonces, luego de hacer la conversión de espacio de color a YCbCr 4:4:4, tendremos una imagen que representa al canal Y, otra que representa al canal Cb y otra que representa al canal Cr; cada una de 8 bits por pixel y del mismo largo y alto que la original. Resta realizar el submuestreo de los canales Cb y Cr. Para esto, a cada canal hay que aplicarle el siguiente algoritmo: for ( UInt32 i  0; i  size; i ) { alias[0]  dataChrominancePtr[0]; alias; dataChrominancePtr  2; };  size es alto original  ancho original 2 (la mitad de la cantidad de pixeles del canal Y).  dataChrominancePtr[] es un puntero (original) a una estructura que contiene los datos originales del canal Cb o Cr.  alias[] es un puntero (nuevo) a una estructura donde se almacenarán los datos del canal submuestreado. 43 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 44. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Entonces, lo que se realiza es: 1) se copia el valor de un pixel del puntero original en el nuevo; 2) se adelanta una posición el puntero nuevo; 3) se adelanta dos posiciones el puntero original; 4) se repite el proceso hasta llegar al final del puntero original (size veces). Para la descompresión es necesario convertir del formato 4:2:2 a 4:4:4, realizando una interpolación. Es necesario seguir el siguiente algoritmo para los canales Cb y Cr. alias[0]  dataChrominancePtr[0]; dataChrominancePtr; for ( UInt32 i  0; i  ( size - 2 ); i  2 ) { alias[2]  dataChrominancePtr[0]; temporalValue  floor ( ( ( alias[0]  alias[2] ) / 2 )  0.5 ); if ( temporalValue  255 ) temporalValue  255; else if ( temporalValue  0 ) temporalValue  0; alias[1]  temporalValue; alias  2; dataChrominancePtr; };  alias[] es un puntero (nuevo) a una estructura donde se almacenarán los datos del canal Cb o Cr con las muestras faltantes reconstruidas.  dataChrominancePtr[] es un puntero (original) a una estructura donde se encuentran los datos originales del canal Cb o Cr submuestreado.  size es alto Cb o Cr  ancho Cb o Cr  2 (la cantidad de pixeles del canal Y). Entonces el procedimiento es: 1) antes de comenzar el ciclo, se copia en la primer componente del puntero nuevo, la primer componente del puntero original; 2) se copia en la tercer componente del puntero nuevo, la segunda componente del puntero original; 3) se almacena en la segunda componente del puntero nuevo, un promedio de la primer y tercer componente; 4) se avanza en dos el puntero nuevo y en uno el puntero original; 5) se repiten los pasos 2), 3) y 4) hasta terminar el proceso. Aquí se ha presentado sólo un esquema general de la implementación. La implementación propiamente dicha se puede encontrar en el código fuente, en los archivos colorspacemanager.h y colorspacemanager.cpp, bajo la ruta programacionproyectofinal.cvscompressorsrccompressorutils 44 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 45. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Discretización en bloques Hasta ahora, siempre se dijo que se deben discretizar las imágenes en bloques de 8  8, pero esto no siempre es posible. Si la imagen no tiene un largo o alto múltiplo de 8, entonces será imposible dividir a esta imagen en bloques de sólo 8  8. No existe una única manera de afrontar este problema. Una posible solución es "agrandar" la imagen hasta alcanzar el múltiplo de 8 más cercano —en la dimensión que sea necesario—, y en el proceso de descompresión volver la imagen a su tamaño original. En el presente caso de estudio se adoptó otra solución, permitiendo bloques menores a 8  8. Supongamos que se dispone de una imagen de 50  35, entonces tendremos 24 bloques de 8  8, 4 de 2  8, 4 de 8  3 y 1 de 2  3 (figura 35). Esta solución complica un poco la implementación de la transformada DCT, ya que no alcanza con realizar el caso particular de 8  8, sino que se debe llevar a cabo de modo general. Figura 35: Discretización en bloques no uniformes. Transformación DCT Dado que la DCT ya se ha analizado con suficiente rigurosidad, ahora sólo nos limitaremos a explicar cómo se ha implementado en este caso de estudio. A continuación se presenta la implementación del constructor de una matriz de transformación de rows  columns elementos. Real c, d; for ( UInt8 u  0; u  rows; u ) { if ( u  0 ) c  1/sqrt( Real(2.0) ); else c  1; for ( UInt8 v  0; v  columns; v ) { if ( v  0 ) d  1/sqrt( Real(2.0) ); else d  1; for ( UInt8 i  0; i  rows; i ) 45 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 46. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap for ( UInt8 j  0; j  columns; j ) { Real first  ( 2*c*d / sqrt( Real( rows * columns ) ) ); Real cos1  cos( ( 2*i  1 ) * u*PI / ( 2 * rows ) ); Real cos2  cos( ( 2*j  1 ) * v*PI / ( 2 * columns ) ); this-setComponent ( v  rows*u, j  columns*i, first * cos1 * cos2 ); }; }; }; Dado un bloque de datos de rows  columns componentes y una matriz de transformación conforme —de columns − 1  rows ∗ rows − 1  1  columns − 1  columns ∗ rows − 1  1 elementos—, el siguiente algoritmo realiza la transformación DCT. IMatrixReal* auxMatrix  new IMatrixReal (rows, columns); for ( UInt8 u  0; u  rows; u ) for ( UInt8 v  0; v  columns; v ) for ( UInt8 i  0; i  rows; i ) for ( UInt8 j  0; j  columns; j ) { Real uvAux  auxMatrix-getComponent (u, v); Int16 ijAux  ( input-getComponent (i, j) - 128 ); Real transfAux  transfMatrix-getComponent (v  rows*u, j  columns*i); auxMatrix-setComponent ( u, v, uvAux  (ijAux * transfAux) ); }; for ( UInt8 u  0; u  rows; u ) for ( UInt8 v  0; v  columns; v ) result-setComponent (u, v, floor ( auxMatrix-getComponent (u, v)  0.5) );  auxMatrix es una matriz auxiliar de números reales, de rows  columns componentes, inicializada toda con ceros.  input es una matriz de rows  columns componentes, que contiene el bloque de datos a transformar.  transfMatrix es la matriz de transformación de input. En el proceso de descompresión se debe llevar a cabo una antitransformación de los datos. A continuación se lista el algoritmo para el constructor de una matriz de antitransformación de rows  columns elementos. Real c, d; for ( UInt8 u  0; u  rows; u ) for ( UInt8 v  0; v  columns; v ) for ( UInt8 i  0; i  rows; i ) 46 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 47. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap { if ( i  0 ) c  1/sqrt( Real(2.0) ); else c  1; for ( UInt8 j  0; j  columns; j ) { if ( j  0 ) d  1/sqrt( Real(2.0) ); else d  1; Real first  ( 2*c*d / sqrt( Real( rows*columns ) ) ); Real cos1  cos( (2*u  1) * i*PI/( 2*rows ) ); Real cos2  cos( (2*v  1) * j*PI/( 2*columns ) ); this-setComponent (v  rows*u, j  columns*i, first * cos1 * cos2 ); }; }; Dado un bloque de rows  columns coeficientes DCT y una matriz de antitransformación conforme —de columns − 1  rows ∗ rows − 1  1  columns − 1  columns ∗ rows − 1  1 elementos—, el siguiente algoritmo realiza la antitransformación DCT. IMatrixReal* auxMatrix  new IMatrixReal (rows, columns); for ( UInt8 u  0; u  rows; u ) for ( UInt8 v  0; v  columns; v ) for ( UInt8 i  0; i  rows; i ) for ( UInt8 j  0; j  columns; j ) { Real uvAux  auxMatrix-getComponent (u, v); Int16 ijAux  input-getComponent (i, j); Real transfAux  transfMatrix-getComponent (v  rows*u, j  columns*i); auxMatrix-setComponent ( u, v, uvAux  ijAux * transfAux ); }; for ( UInt8 u  0; u  rows; u ) for ( UInt8 v  0; v  columns; v ) result-setComponent (u, v, floor ( auxMatrix-getComponent (u, v)  0.5)  128 );  auxMatrix es una matriz auxiliar de números reales, de rows  columns componentes, inicializada toda con ceros.  input es una matriz de rows  columns componentes, que contiene el bloque de coeficientes DCT a antitransformar.  transfMatrix es la matriz de antitransformación de input. Para un análisis exhaustivo de los constructores de las matrices de transformación y antitransformación, referirse al código fuente de los archivos 47 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 48. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap transformationmatrix.h y transformationmatrix.cpp, situados en el directorio programacionproyectofinal.cvscompressorsrccompressorcommon Si se desea profundizar en la implementación de la transformación DCT, recurrir a los archivos dcttransformer.h y dcttransformer.cpp. Para la antitransformación, a los archivos idcttransformer.h y idcttransformer.cpp. Todos estos archivos se encuentran en programacionproyectofinal.cvscompressorsrccompressorcodecs Cuantificación Para la cuantificación, se utiliza una tabla para la luminancia (canal Y) y otra para las crominancias (canales Cb y Cr). Por defecto, estas tablas son las sugeridas por [GHANBARI2003] —figuras 28 y 29—, pero al estar almacenadas en un archivo de texto (quantization.tbl) son fácilmente editables. Vale la pena aclarar que una imagen debe ser descomprimida con las mismas tablas que fue comprimida, por esta razón se recomienda tener especial cuidado al editarlas. Tanto para la cuantificación como para la descuantificación, se utiliza un parámetro C (Calidad) de escalado, que determina la calidad de la imagen. Este parámetro es un número real entre 0 y 1, siendo 0 la peor calidad (factor de compresión más alto), 0.66 una calidad buena (sin escalado) y 1 la mejor calidad (factor de compresión más bajo). Previo al escalamiento propiamente dicho, a este parámetro C se le realiza un preproceso. Notaremos como Coriginal y Cpreprocesado al parámetro C antes y después del preproceso respectivamente. El parámetro Cpreprocesado también será un número real, pero su rango es de 0.25 a 16. El preproceso es el siguiente: Cpreprocesado  21−Coriginal 6−2 Esto mapea el mínimo de Coriginal al máximo de Cpreprocesado, y el máximo de Coriginal al mínimo de Cpreprocesado. Luego se cargan en memoria las tablas ya escaladas. El escalado es muy simple, consiste de multiplicar cada componente de cada una de las dos tablas originales por el factor de escalado Cpreprocesado. Para la cuantificación, se divide el elemento (i,j) del bloque de coeficientes DC por el elemento (i,j) de la tabla de cuantificación escalada. Para la descuantificación, se multiplica el elemento (i,j) del bloque de coeficientes DC cuantificados por el elemento (i,j) de la tabla de cuantificación escalada. Para mayores detalles referirse al código fuente de los archivos quantization.h y quantization.cpp, situados en programacionproyectofinal.cvscompressorsrccompressorcommon 48 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación
  • 49. Compresión de imágenes y video (formato MPEG2) Fernando Martín Pap Codificación DPCM La implementación de la codificación y decodificación DPCM es la traducción directa del método explicado en el esquema secuencial baseline de JPEG. Es decir, para la codificación, al coeficiente DC del bloque a codificar se le debe restar el coeficiente DC del bloque codificado previamente. Al resultado de esta resta lo llamaremos Dif. Se construye un nuevo bloque, al coeficiente DC se le asigna Dif, y al resto de los coeficientes AC se les asigna los mismos valores que los contenidos en el bloque original. Luego, se debe almacenar el valor DC del bloque original, para poder realizar la codificación del próximo bloque. El código que implementa esto es el siguiente: BlockMatrix* result  new BlockMatrix ( input.getRows (), input.getColumns () ); for ( UInt8 row  0; row  input.getRows (); row ) for ( UInt8 column  0; column  input.getColumns (); column ) result-setComponent ( row, column, input.getComponent ( row, column ) ); result-setComponent (0, 0, input.getComponent (0, 0) - this-previousEncodingDCValue); this-previousEncodingDCValue  input.getComponent (0, 0); return result;  result es una matriz inicializada toda con ceros, donde se almacenará el bloque de coeficientes DCT codificado con DPCM.  input es el bloque de coeficientes DCT a codificar con DPCM.  previousEncodingDCValue es el valor DC del bloque codificado previamente. Si fuera el primer bloque a codificar, previousEncodingDCValue es igual a cero. Para la decodificación, al coeficiente codificado se le suma el coeficiente que se ha decodificado anteriormente. Se construye un nuevo bloque y al coeficiente DC se le asigna este valor. Además, este valor se almacena para la correcta decodificación del próximo bloque. Al resto de los coeficientes AC del bloque recién creado se les asigna los valores contenidos en el bloque original. La implementación es la siguiente: BlockMatrix* result  new BlockMatrix ( input.getRows (), input.getColumns () ); for ( UInt8 row  0; row  input.getRows (); row ) for ( UInt8 column  0; column  input.getColumns (); column ) result-setComponent ( row, column, input.getComponent ( row, column ) ); result-setComponent (0, 0, input.getComponent (0, 0)  this-previousDecodingDCValue); this-previousDecodingDCValue  result-getComponent (0, 0); return result;  result es una matriz inicializada toda con ceros, donde se almacenará 49 U. N. S. – Depto. de Cs. e Ing. de la Computación – Ing. en Sistemas de Computación