Post on 30-Jul-2020
Formato de compresión JPEG Higa, UTN FRBA
Página 1 de 18
FORMATO DE COMPRESIÓN JPEG
Déborah Valeria Higa Sistemas de TV y Técnicas Audiovisuales, UTN FRBA
1 INTRODUCCIÓN
“Una imagen vale más que mil
palabras” deja de ser una frase metafórica
cuando se analiza la cantidad de
información que realmente una imagen
contiene. Por ejemplo, la imagen de la
Figura 1 tiene un tamaño de 512x512
pixeles, donde cada pixel está representado
por tres canales de colores: R (rojo), G
(verde) y B (azul); y donde cada canal está
cuantificado de 0 a 255 (un byte). Entonces,
la imagen debería pesar 512x512x3x1 bytes
= 786432 bytes (casi 787Kb). Sin embargo, en formato JPEG pesa 131Kb.
Figura 1. “Sailboat on lake” de USC-SIPI Image
Database.
Para lograr esta reducción de peso se
debió descartar información y es por eso
que al formato JPEG se lo llama lossy
compression. No obstante, si se compara
una imagen JPEG contra la misma pero en
un formato tipo lossless, como el TIFF, la
información eliminada resulta
imperceptible a simple vista, como se observa en la Figura 2.
Formato: TIFF Peso:
768KB
Formato: JPEG Peso: 131KB
Figura 2. Comparación de peso entre formatos.
El formato JPEG es un estándar de
compresión y codificación de imágenes fijas
y son las siglas correspondientes a su comité
creador, Joint Photographic Experts Group.
Para realizar la compresión, se toma ventaja
de las limitaciones del ojo humano y
descarta aquello que no se percibe con
facilidad. Una vez realizado esto, los datos
finalmente se codifican para reducir aún
más su tamaño. Es decir, no solo se trata de
reducir información, sino de representarla
de una manera óptima, para que una
imagen “contenga menos palabras, pero
valga el mismo significado”.
Formato de compresión JPEG Higa, UTN FRBA
Página 2 de 18
2 CONVERSIÓN A YCBCR
Limitación #1 del ojo humano: percibe
mejor las diferencias de luz que de colores
Esto significa que gran parte de la
información a descartar serán los colores y
se le dará mayor importancia a la
luminosidad (se apreciará más en el paso de Cuantización).
En el formato RGB, cada pixel de la
imagen está representado por tres canales:
R (rojo), G (verde) y B (azul). Esto quiere
decir que, como se observa en la Figura 3,
en términos matriciales, la imagen es una matriz de 3 dimensiones.
Figura 3. División de la imagen en sus canales R, G y B (con color agregado).
Si se representa un pixel
de color como: color = (R, G, B)
Donde R, G y B varían de 0 a 255, los siguientes colores se representarían
de esta manera: rojo = (255, 0, 0) verde = (0, 255, 0) azul = (0, 0, 255) negro = (0, 0, 0) blanco = (255, 255,255)
Cuando se representan los colores en forma separada, las zonas más
claras indican mayor presencia del color
correspondiente y las zonas más oscuras, menor presencia.
Figura 4. División de la imagen en sus canales R, G y B.
La imagen de la Figura 3 se dividió en
sus 3 submatrices R, G y B y se las
representaron con sus respectivos colores
pero, en realidad, cada una de ellas al ser de
2 dimensiones, no tienen canales de color,
solo se representan por su intensidad y se
ven en escala de grises, como se observa en
la Figura 4.
Este formato, sin embargo, se centra
en la información de color y no brinda
información de luminosidad de manera
directa. Es por eso que se convierte la
imagen al formato YCbCr, donde Y es el
canal luminancia y Cb y Cr los canales
crominancia diferencia azul y rojo,
respectivamente. De esta manera se
obtiene el canal luminancia totalmente aislado de los canales crominancia.
Formato de compresión JPEG Higa, UTN FRBA
Página 3 de 18
La conversión se realiza utilizando la Ecuación 1.
[𝑌𝐶𝑏𝐶𝑟
] = [0
128128
] + [0.299 0.587 0.114
−0.169 −0.331 0.5000.500 −0.419 −0.081
] [𝑅𝐺𝐵
]
𝑌 = 0.299𝑅 + 0.587𝐺 + 0.114𝐵 𝐶𝑏 = 128 − 0.169𝑅 − 0.331𝐺 + 0.500𝐵 𝐶𝑟 = 128 + 0.500𝑅 − 0.419𝐺 − 0.081𝐵
Ecuación 1. Fórmula para la conversión de RGB a YCbCr.
El canal luminancia Y es un promedio
ponderado (0.299+0.587+0.114=1) de R, G y
B, donde G es el que tiene mayor peso ya
que el ojo humano lo percibe más brillante
de lo que es, a diferencia de lo que ocurre
con el azul. Es decir, se lo pondera de tal
manera que la conversión dé igual a lo que realmente se percibe.
El canal crominancia Cb es la diferencia
del azul con el neutro. El neutro ocurre
cuando R, G y B tienen el mismo valor
(pueden variar de 0 a 255 pero los tres
juntos, en una escala de grises) y cuando
esto sucede, Cb es nulo ya que B está
ponderado con 0.5 y R y G con -0.169 y -
0.331 (-0.5). Lo mismo ocurre con Cr, que es
la crominancia diferencia del rojo con el
neutro. Cuanto mayor sea la diferencia,
mayores serán las crominancias y más colorida resultará la imagen.
A modo de ejemplo, en la Figura 5, se representan tres colores en RGB e YCbCr.
R 255 Y 111
Mayor contenido de rojo, mayor Cr.
G 50 Cb 97
B 50 Cr 218
R 50 Y 162
Mayor contenido de verde, Cb y Cr más próximos entre s í.
La i luminancia es mayor con el verde. G 255 Cb 68
B 50 Cr 52
R 50 Y 79
Mayor contenido de azul,
mayor Cb. G 50 Cb 218
B 255 Cr 113
Figura 5. Ejemplo de representación de 3 colores en RGB e YCbCr.
Formato de compresión JPEG Higa, UTN FRBA
Página 4 de 18
Finalmente, este es el resultado que se obtiene al convertir la imagen a YCbCr.
Nuevamente, se dividió la imagen en sus 3 submatrices Y, Cb y Cr y luego a cada una se las representó con sus colores característicos.
Figura 6. División de la imagen en sus canales Y, Cb y Cr.
Las imágenes de esta sección se
obtuvieron con el código rgb2ycbcr_generator.m.
3 SUBMUESTREO DE
CROMINANCIA
El submuestreo de crominancia
(chroma subsampling) consiste en
muestrear la información de crominancia a
una menor frecuencia que la de iluminancia.
El esquema de submuestreo se representa de la forma:
𝐽: 𝑎: 𝑏
donde
J: muestreo horizontal de referencia (usualmente 4)
a: cantidad de muestras de crominancia en
la primera fila.
b: cantidad de cambios de las muestras de crominancia entre la primera y segunda fila.
Algunos tipos de submuestreo son:
4:4:4
La resolución de la información de
crominancia se mantiene a la misma
relación que la de la iluminancia. Se conoce
también como submuestreo 1x1 o submuestreo deshabilitado.
4:2:2
Se conserva la mitad de la información
horizontal de la crominancia, mientras que
la resolución en la dirección vertical se
mantiene a la misma relación que la de la
iluminancia. Se conoce también como
submuestreo 2x1.
4:1:1
Se conserva un cuarto de la
información horizontal de la crominancia,
mientras que la resolución en la dirección
Formato de compresión JPEG Higa, UTN FRBA
Página 5 de 18
vertical se mantiene a la misma relación que
la de la iluminancia.
4:2:0
La resolución se reduce a la mitad
respecto a la de la iluminancia tanto en
dirección horizontal como vertical. Se conoce también como submuestreo 2x2.
Figura 7. Tipos de submuestreo de crominancia.
A lo largo del informe, se utilizará 4:4:4,
es decir, no se realizará un chroma subsampling.
Luego de este submuestreo (o la
conversión RGB a YCbCr si no se
submuestrea), la imagen se divide en
bloques de 8x8 pixeles para posteriormente
procesar uno por uno con los dos siguientes
procesos: DCT: Discrete Cosine Transform y
Cuantización. Se utiliza este tamaño de
bloque ya que tamaños más grandes
podrían resultar difíciles de procesar y
tamaños más chicos podrían no contener suficiente información.
4 DCT: DISCRETE COSINE
TRANSFORM
Limitación #2 del ojo humano: tiene
dificultades para diferenciar detalles que se
encuentran muy próximos entre sí.
Esto significa que otra gran parte de la
información a descartar serán las altas frecuencias.
El método más conocido para pasar
una señal al plano de las frecuencias es la
transformada de Fourier, que en este caso
se aplicaría en su versión Transformada
Discreta de Fourier en 2D (DFT). Sin
embargo, para el análisis de imágenes
conviene utilizar la Transformada Discreta
de Coseno en 2D (DCT). En la Tabla 1 se
muestran las DFT y DCT al canal Y de la
imagen, obtenidas a partir del código
dft_dct.m; se comparan los resultados y se
resaltan las ventajas de la DCT.
Formato de compresión JPEG Higa, UTN FRBA
Página 6 de 18
DFT 2D DCT 2D
𝑋𝑘,𝑙 =
1
𝑀𝑁∑ ∑ 𝑥𝑛,𝑚𝑒
−2𝜋𝑖(𝑛𝑘𝑁
+𝑚𝑙𝑀
)
𝑁−1
𝑛=0
𝑀−1
𝑚=0
𝑋𝑘,𝑙 =
∑ ∑ 𝑥𝑛,𝑚 cos [𝑘𝜋(𝑛 + 1 2⁄ )
𝑁]cos [
𝑙𝜋(𝑚 +1 2⁄ )
𝑀]
𝑀−1
𝑚=0
𝑁−1
𝑛=0
En ambos casos, el resultado de la DFT y la DCT es una matriz de MxN (en este caso M=N=512).
La componente de continua (f=0) se encuentra en el centro y las altas frecuencias en los extremos.
Es periódica en MxN.
La componente de continua (f=0) se encuentra en el extremo superior izquierdo y las frecuencias altas en el extremo inferior derecho. Esto hace más sencillo su
fi l trado.
La energía de la imagen transformada se encuentra dispersa.
La información se encuentra más compactada, ya que la energía se concentra en menos componentes (principalmente las componentes de menor frecuencia). Esto también facilita el filtrado.
Tabla 1. Comparación entre la DFT y DCT de la imagen.
N/2
M/2
N-1
N-1
M-1
Formato de compresión JPEG Higa, UTN FRBA
Página 7 de 18
En la Figura 8, se muestra la DCT del
canal Y de la imagen. En la zona remarcada
en azul se concentran las bajas frecuencias
y se pueden observar varias componentes
de ellas. En la zona remarcada en rojo se
encuentran las altas frecuencias y se
pueden observar componentes tipo
“deltas”.
Figura 8. DCT del canal Y de la imagen.
Si las componentes de alta frecuencia se eliminan de manera drástica con el código dct_hfilter.m, no se perciben diferencias a simple vista como se observa en la Figura 9.
Figura 9. Resultado de aplicar el código dct_hfilter.m.
En el código dct_filter.m, en vez de
remover frecuencias, se parte de una matriz
vacía y se van tomando porciones cada vez
más grandes de la DCT, partiendo desde la
frecuencia de continua hasta llegar a la
máxima. Si se corre este código, se podrá
ver cómo progresivamente se va
construyendo la imagen. A modo de
ejemplo, en el Resultado 1 se observan dos resultados.
Formato de compresión JPEG Higa, UTN FRBA
Página 8 de 18
n = 50
n = 200
Resultado 1. Resultados del código dct_filter.m.
Con una pequeña porción de 200x200
en la zona de bajas frecuencias de DCT ya se
puede visualizar una imagen casi sin
diferencias de la original. Esto demuestra la
propiedad de la DCT de tener la información compacta en las primeras componentes.
Estos ejemplos se realizaron para
comprender esta transformada, sin
embargo, durante la compresión a JPEG, la
DCT no se aplica a toda la imagen sino que,
como ya se mencionó anteriormente, cada
canal de la imagen se divide en bloques de
8x8 pixeles y a cada uno de ellos se le aplica la DCT.
5 CUANTIZACIÓN
Este paso consiste en hacer uso de las
limitaciones del ojo humano mencionadas
anteriormente: hacer enfoque en la
luminancia, descartar información de los colores y filtrar las altas frecuencias.
Esto se consigue dividiendo a cada bloque de 8x8 pixeles 𝐹𝑖 ,𝑗 con una matriz de
cuantización 𝑄𝑙 , para el caso de la
luminancia y 𝑄𝑐 , para los casos de
crominancia, según la Ecuación 2.
𝐹𝑖,𝑗 =𝐹𝑖,𝑗
𝑄
Ecuación 2. Ecuación de cuantización.
Se pueden observar:
Valores cada vez más grandes en la parte
de altas frecuencias de la DCT.
Valores más grandes (en promedio) en la
matriz de crominancia que en la de luminancia.
Formato de compresión JPEG Higa, UTN FRBA
Página 9 de 18
Mientras más grande sea el valor de la
matriz de cuantización, con mayor
probabilidad será anulada la componente
de DCT correspondiente; y mientras menor
sea el valor, con mayor probabilidad será retenida.
Además, debido a que esta es la etapa
más decisiva, se agrega un factor de calidad
𝑞 de 1 a 100 que permite graduar cuán
agresiva va a ser la compresión, según la Ecuación 3.
Se puede observar que con q=50 se
usan las tablas de cuantización de
referencia, q mayores hacen que las tablas
contengan valores más chicos y q menores hacen que contengan valores más grandes.
Estas tablas de cuantización fueron
diseñadas tal que para q=75 la compresión
no tenga pérdida perceptual, de modo que
no tiene sentido utilizar valores mayores a
este.
6 APLICACIÓN: CONVERSIÓN A
YCBCR, DCT Y
CUANTIZACIÓN
El código JPEG_encode_decode.m,
realiza los pasos de compresión y
descompresión detallados hasta este
punto.
A modo de ejemplo, se realiza un paso a paso sobre el bloque 𝑓64,1 (extremo
inferior izquierdo) del canal Y, trabajando
con q=30 (baja calidad) para ver más pronunciados los efectos.
En la Figura 10, se observa el resultado
de la conversión de RGB a YCbCr de un
bloque de 8x8 pixeles y la obtención de su canal Y.
Figura 10. Conversión RGB a YCbCr y obtención del canal Y de un bloque de 8x8.
Luego de aplicar DCT, se obtuvo como resultado la matriz del Resultado 2.
𝑀 =
[ 384.2500 −11.3131 −3.1447 −9.5693 −11.7500 −12.2652 4.8204 9.354410.6324 −4.9820 −2.4462 3.1557 3.5492 11.3633 −1.4770 10.77605.8631 −1.6359 −1.8195 4.1391 5.9424 1.5790 −7.7641 −1.3314
−2.0416 2.6126 2.4767 0.0453 −3.6516 0.8102 1.8970 −2.36601.0000 −5.7430 2.8045 −2.8591 −0.5000 8.0332 1.5443 3.68260.4355 −1.6895 −0.4139 0.1408 −3.8143 5.7528 0.6504 4.73601.0892 −4.3737 −0.0141 −1.0972 −0.0260 2.6875 2.0695 2.0298
−0.6852 2.6066 −2.2208 1.0132 3.1456 −4.7889 −10.1895 6.1839 ]
Resultado 2. Resultado de aplicar la DCT al bloque de 8x8 del ejemplo.
𝐹𝑖 ,𝑗 =
𝐹𝑖,𝑗
𝛼𝑄
Ecuación 3. Ecuación de cuantización con factor de calidad.
RGB → YCbCr YCbCr → Y
Formato de compresión JPEG Higa, UTN FRBA
Página 10 de 18
Luego de aplicar la Cuantización, se obtuvo como resultado la matriz del Resultado 3.
𝑀 =
[ 14 −1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0]
Resultado 3. Resultado de aplicar la Cuantización al bloque de 8x8 del ejemplo.
7 ZIGZAG
Se transforma el bloque de 8x8 a un
vector de 1x64, mapeando cada elemento
según un patrón de zigzag como se muestra
en Figura 11. Esto se realiza con el fin de
aproximadamente ordenar dentro del
vector las componentes desde las de menor frecuencia hasta las de mayor frecuencia.
𝐴 =
[ 1 2 6 7 15 16 28 293 5 8 14 17 27 30 434 9 13 18 26 31 42 4410 12 19 25 32 41 45 5411 20 24 33 40 46 53 5521 23 34 39 47 52 56 6122 35 38 48 51 57 60 6236 37 49 50 58 59 63 64]
Figura 11. Patrón de Zigzag para un bloque de 8x8.
La matriz A de 8x8 representa la posición en la que debe ir cada elemento en el vector de 1x64.
8 CODIFICACIÓN
8.1 COMPONENTES DE DC: DPCM
Debido a que el primer elemento del
vector, la componente de DC, suele ser de
un valor grande y además suele ser cercano
a la componente de DC del anterior bloque
(correlación espacial). se codifica mediante DPCM (Differential Pulse Code Modulation).
DPCM consiste en calcular la diferencia
entre los valores DC del actual y del anterior
bloque. Este resultado (value) se codifica
según la Tabla 2 en un par (category, code)
y según la tabla de Huffman para las
componentes de DC para la iluminancia o
crominancia (Tabla 3 y Tabla 4,
respectivamente) se codifica category a un nuevo code.
El principio de toda esta codificación es
utilizar la menor cantidad de bits para
codificar datos que ocurren con mayor
frecuencia. Esta es una compresión tipo
lossless ya que no se pierde información al
realizar esto.
Formato de compresión JPEG Higa, UTN FRBA
Página 11 de 18
Por ejemplo, si la diferencia entre
componentes de DC de iluminancia es:
𝐷𝑖𝑓𝑓 = −511
Según la Tabla 2, como la categoría es “9” y el código “000000000”, se codifica a:
𝐷𝑖𝑓𝑓 = (9,000000000)
Según la Tabla 3, como la categoría es
“9” su código es “1111110” y entonces se codifica a:
𝐷𝑖𝑓𝑓 = 1111110 000000000
8.2 COMPONENTES DE AC: RLE
Debido a que el resto de las 63
componentes del vector, las componentes
de AC, contienen una gran cantidad de
ceros (como se observa en Resultado 3), se
codifica mediante RLE (Run Lenght Encoding).
RLE consiste en codificar las series de
ceros como un par (run length, value) donde
run length es el número de ceros y value es
el próximo valor distinto de cero. Se sigue el
mismo criterio visto anteriormente
utilizando la Tabla 2 para codificar value al
par (category, code). Y finalmente según la
tabla de Huffman para las componentes de
AC para la iluminancia o crominancia (Tabla
5 y Tabla 6, respectivamente) se codifica el par (run length, category) a un nuevo code.
Por ejemplo, si se tuviera esta situación:
57, 0,0,0, 0,23,0,−30, −8,0, . . . , 0
el resultado de la RLE sería:
(0, 57); (4,23); (1,−30); (0,−8); (0,0)
El par (0,0) se utiliza para indicar el EOB
(End Of Block) si se llega a un punto en el
que luego se tienen ceros hasta el final del
vector.
Según la Tabla 2, los values se codifican
a:
(0, 6,111001); (4, 5,10111);
(1, 5,00001); (0, 4,0111); (0,0)
Según la Tabla 5, los pares (run length,
category) se codifican a:
1111000 111001 1111111110011000 10111
11111110110 00001 1011 0111 1010
Las tablas de Huffman pueden ser
distintas a las descriptas en las Tabla 3 a
Tabla 6. Cada archivo JPEG puede estar
codificado con tablas distintas. Estas se
describen en el encabezado DHT, que se
describirá en la siguiente sección.
Antes de finalizar con el último paso
que es el Armado del archivo, se describirán
los modos de operación de JPEG dado que
en un encabezado del archivo se deben configurar.
9 MODOS DE OPERACIÓN DE
JPEG
JPEG tiene 4 modos de operación:
secuencial, loseless, jerárquico y
progresivo.
Modo secuencial
Consiste en codificar las componentes
de izquierda a derecha y de arriba hacia
abajo. Un ejemplo es el descripto en este informe.
Figura 12. Modo secuencial.
Formato de compresión JPEG Higa, UTN FRBA
Página 12 de 18
Modo losless
No utiliza ni la DCT ni la cuantización
(quienes son las fuentes de pérdidas) sino
que utiliza un método de codificación
predictivo que permite que no haya
pérdidas de información.
Modo jerárquico
Consiste en codificar la imagen en
distintas resoluciones y luego transmitir
comenzando desde la de menor y finalizando con la de mayor resolución.
Modo progresivo
Permite obtener rápidamente al
principio una imagen de baja calidad pero
que va mejorando con las sucesivas
transmisiones. Es muy utilizado en las
páginas web donde las imágenes suelen
tardar en cargarse. Hay 2 maneras de realizarlo y es a través de:
Selección espectral
Las componentes de DCT se agrupan
en bandas espectrales y se envían primero
las de menor frecuencia. A medida que se
envían más bandas, más componentes se obtienen y mejora la imagen.
Aproximación sucesiva
Se transmiten todas las componentes
de la DCT pero primero los MSB (Most
Significant Bits) de cada una y luego los LSB
(Least Significant Bits).
Estos modos se configuran en el
header SOS: Start Of Scan que se describirá en la siguiente sección.
Figura 13. Modo progresivo.
10 ARMADO DEL ARCHIVO
10.1 SOI: START OF IMAGE
Descripción
Primeros 2 bytes de cualquier archivo JPEG.
Esctructura
Marker: 0xFFD8
10.2 APPN: APPLICATION DATA N
Descripción
APPn describe información del archivo
que no se encuentra definido en el estándar
oficial de JPEG. Puede ser de APP0 a APP15.
El APP0 particularmente es el que define
información específica a las
implementaciones de JFIF (JPEG File
Interchange Format) y EXIF (Exchangeable
Image Format) de JPEG. En el ejemplo se utiliza JFIF.
JFIF define algunos detalles que no
están definidos en JPEG, como por ejemplo,
la resolución y la relación de aspecto, que se
describen en APP0, y la codificación de color, establecido en YCbCr.
Esctructura
Marker: 0xFFE0 – 0xFFEF
Tamaño (2 bytes)
Identificador
Puede ser “JFIF\x00” o “EXIF”. En el
ejemplo se utiliza el primero.
Versión (2 bytes)
El byte más significativo se utiliza para
las revisiones mayores y el menos
significativo para las revisiones menores. En el ejemplo es 1 1.
Unidades de las densidades en x e y (1
byte)
Formato de compresión JPEG Higa, UTN FRBA
Página 13 de 18
0: sin unidades (x e y definen la relación de
aspecto). Este valor es el usado en el ejemplo.
1: la unidad es de puntos por pulgada.
2: la unidad es de puntos por cm.
Densidad de pixeles horizontal y vertical
(2 bytes cada uno)
Tamaño del thumbnail en x e y (1 byte
cada uno)
En el ejemplo, ambos son 0, indicando que no hay thumbnail.
Thumbnail (3*tamaño del thumbnail, debido a los 3 canales en RGB)
10.3 DQT: DEFINE QUANTIZATION
TABLE
Descripción
Dentro del header DQT se describen las
tablas de cuantización, las cuales deben
estar ordenadas según el patrón zigzag descripto en la sección Zigzag.
Estructura
Marker: 0xFFDB
Tamaño (2 bytes)
A partir de este punto se describe cada
tabla de cuantización con los siguientes campos:
ID de la tabla de cuantización (1 byte)
Los 4 bits más significativos
determinan cuántos bytes ocupa cada
elemento (0: 1 byte, 1: 2 bytes). Los otros 4
bits menos significativos son el identificador correspondiente a la tabla (1 a 3)
Tabla de cuantización (64 o 128bytes
dependiendo del tamaño descripto anteriormente)
En el ejemplo se guardan las tablas QL
y QC modificadas por un factor de calidad
q=10, como se describe en la sección
Cuantización.
10.4 SOF: START OF FRAME
Descripción
Indica el inicio de un frame.
Estructura
Marker: 0xFFC0
Tamaño (2 bytes)
Precisión (1 byte)
Puede ser de 8 o 12bits.
Alto y ancho en pixeles (2 bytes cada
uno)
Número de componentes (1 byte)
En el ejemplo son 3 ya que se usan los 3 canales de YCbCr.
A partir de este punto se describe cada componente con los siguientes campos:
ID del componente (1 byte)
JFIF al manejar YCbCr se restringe en 1,
2 y 3.
Muestreo horizontal y vertical (4 bits cada uno)
Pueden ser 1, 2, 3 o 4. En el ejemplo
son 1 ya que no se realizó ningún método de “chroma subsampling”.
ID de la tabla de cuantización utilizada en el componente (1 byte).
Formato de compresión JPEG Higa, UTN FRBA
Página 14 de 18
0000-0010: FF D8 FF E0-00 10 4A 46-49 46 00 01-01 00 00 01
0000-0020: 00 01 00 00-FF DB 00 84-00 50 37 3C-46 3C 32 50
...
0000-00A0: FF FF FF FF-FF FF FF FF-FF FF FF C0-00 11 08 02
0000-00B0: 00 02 00 03-01 11 00 02-11 01 03 11-01 FF C4 01
Resultado 4. Hexdump de las secciones SOI, APP0, DQT y SOF del JPEG obtenido.
10.5 DHT: DEFINE HUFFMAN TABLES
Descripción
Dentro del header DHT se describen las tablas de Huffman utilizadas.
Estructura
Marker: 0xFFC4
Tamaño (2 bytes)
A partir de este punto se describe cada
tabla de Huffman con los siguientes campos:
ID de la tabla de Huffman (1 byte)
Los 4 bits más significativos
determinan la clase (0: DC, 1: AC). Los otros
4 bits menos significativos son el
identificador correspondiente a la tabla (1 a 3)
Cantidad de code words para cada code length (16 bytes)
Si se toma de ejemplo a la Tabla 3.
Tabla de Huffman para las componentes de
DC de iluminancia., este campo sería:
0 0 1 5 1 1 1 1 1 1 0 0 0 0 0 0 0
ya que para los code lenghts 0, 1, 10, 11, 12,
13, 14 y 15 no hay ningún code word y, por
ejemplo, para el code length 3 hay 5 code words.
Categorías (16 bytes)
Continuando con el ejemplo anterior, las categorías son de la 0 a la 11.
10.6 SOS: START OF SCAN
Descripción
Este es el encabezado previo a la información de la imagen.
Estructura
Marker: 0xFFDA
Tamaño (2 bytes)
Cantidad de componentes (1 byte)
En el ejemplo son 3 ya que se usan los
3 canales de YCbCr.
Descripción de cada componente
ID de la componente (1 byte)
ID de las tablas de Huffman (1 byte,
los 4 bits más significativos son para
el ID del DC y los otros 4 bits menos significativos son para el ID del AC)
Configuración del modo progresivo
(descripto en Modos de operación de JPEG)
Inicio y el fin de la selección espectral (1 byte cada uno).
En ejemplo, son 0 y 63 (se envía la
componente entera) ya que no se utilizará este modo.
Aproximación sucesiva (1 byte)
Está compuesto por dos pares de 4bits
que determinan los parámetros bit position
high y low de este modo, respectivamente.
En ejemplo son 0, ya que no se utiliza este modo.
Formato de compresión JPEG Higa, UTN FRBA
Página 15 de 18
10.7 EOI: END OF IMAGE
Descripción
Últimos 2 bytes de cualquier archivo JPEG.
Esctructura
Marker: 0xFFD9
0000-00B0: 00 02 00 03-01 11 00 02-11 01 03 11-01 FF C4 01
0000-00C0: A2 00 00 01-05 01 01 01-01 01 01 00-00 00 00 00
0000-00D0: 00 00 00 01-02 03 04 05-06 07 08 09-0A 0B 10 00
...
0000-0260: FA FF DA 00-0C 03 01 00-02 11 03 11-00 3F 00 62
...
0000-4040: B3 11 28 00-A0 02 80 0A-00 43 D2 93-D8 6B FF D9
Resultado 5. Hexdump de las secciones DHT, SOS, Imagen y EOI del JPEG obtenido. Se observa que finaliza en
0x403F (16,5KBytes aproximadamente)
11 RESULTADO
Finalmente, en el código JPEG_encoder.m se pueden apreciar todos los pasos de la
compresión y codificación de JPEG descriptos en este informe y en la Figura 14 se compara el
resultado obtenido con la imagen original. Si se realiza un zoom, se logran ver los bloques de
8x8 pixels con los que se estuvo trabajando para la compresión.
Figura 14. Comparación de la imagen antes y después de la compresión JPEG.
Formato de compresión JPEG Higa, UTN FRBA
Página 16 de 18
12 ANEXO
Category Value Bit code representation 0 0 -
1 -1,1 0,1 2 -3,-2,2,3 00,01,10,11
3 -7,-6,-5,-4,4,5,6,7 000,001,010,011,100,101,110,111 4 -15,...,-8,8,...,15 0000,...,0111,1000,...,1111
5 -31,...,-16,16,...31 00000,...,01111,10000,...,11111
6 -63,...,-32,32,...63 000000,...,011111,100000,...,111111 7 -127,...,-64,64,...,127 0000000,...,0111111,1000000,...,1111111
8 -255,..,-128,128,..,255 ... 9 -511,..,-256,256,..,511 ...
10 -1023,..,-512,512,..,1023 ...
11 -2047,..,-1024,1024,..,2047 ...
Tabla 2. Tabla de codificación (value) -> (category, bitcode).
Category Code length Code word
0 2 00
1 3 010
2 3 011
3 3 100
4 3 101
5 3 110
6 4 1110
7 5 11110
8 6 111110
9 7 1111110
10 8 11111110
11 9 111111110
Tabla 3. Tabla de Huffman para las componentes de DC de iluminancia.
Category Code length Code word
0 2 00
1 2 01
2 2 10
3 3 110
4 4 1110
5 5 11110
6 6 111110
7 7 1111110
8 8 11111110
9 9 111111110
10 10 1111111110
11 11 11111111110
Tabla 4. Tabla de Huffman para las componentes de DC de crominancia.
Formato de compresión JPEG Higa, UTN FRBA
Página 17 de 18
Run length/Category Code length Code word
0/0 (EOB) 4 1010
...
0/6 7 1111000
...
0/10 16 1111111110000011
1/1 4 1100
...
4/5 16 1111111110011000
...
16/11 16 1111111111111110
Tabla 5. Tabla de Huffman para las componentes de AC de la iluminancia.
Run length/Category Code length Code word
0/0 (EOB) 2 00
...
0/6 6 111000
...
0/10 12 111111110100
1/1 4 1011
...
4/5 16 1111111110011001
...
16/11 16 1111111111111110
Tabla 6. Tabla de Huffman para las componentes de AC de crominancia.
Formato de compresión JPEG Higa, UTN FRBA
Página 18 de 18
13 BIBLIOGRAFIA
Cursos:
“Image Compression using Matlab”, The Learning Square.
http://www.thelearningsquare.in/
“Image and Video Processing: From Mars to Hollywood with a Stop at the Hospital”,
Guillermo Sapiro, Coursera.
https://es.coursera.org/
“Lecture 108 - 7.6* The JPEG compression algorithm”, Paolo Prandoni y Martin Vetterli,
Coursera.
https://www.coursera.org/learn/dsp/lecture/Q6hgv/7-6-the-jpeg-compression-algorithm
Web:
https://www.quora.com/What-is-the-best-image-compression-algorithm
http://www.ams.org/samplings/feature-column/fcarc-image-compression
http://www.dspguide.com/ch27/6.htm
http://www.impulseadventure.com/photo/jpeg-compression.html
https://petapixel.com/2015/05/30/jpeg-compression-test-google-photos-vs-jpegmini/
https://behindthesciences.com/coding/zigzag-codification-and-huffman-coding-in-jpeg-
matlab-code
http://sep.stanford.edu/sep/jon/family/jos/webtv/developer3/design/satcolor/
Libros:
Image Processing and Analysis, Stan Birchfield.
JPEG: Still Image Data Compression Standard, William B. Pennebaker, Joan L. Mitchell.
Application Notes:
JPEG Algortihm baseline on embedded systems.