JPEG

De Freepedia, la enciclopedia libre.

JPEG (Joint Photographic Experts Group) es un algoritmo diseñado para comprimir imágenes con 24 bits de profundidad o en escala de grises. JPEG es también el formato de fichero que utiliza este algoritmo para comprimir imágenes. JPEG sólo trata imágenes fijas, pero existe un estándar relacionado llamado MPEG para videos. El formato de archivos JPEG se abrevia frecuentemente JPG debido a que algunos sistemas operativos sólo aceptan tres letras de extensión.

JPEG es un algoritmo de compresión con pérdida. Esto significa que al descomprimir la imagen no obtenemos exactamente la misma imagen que teníamos antes de la compresión.

Una de las características que hacen muy flexible el JPEG es el poder ajustar el grado de compresión. Si especificamos una compresión muy alta se perderá una cantidad significativa de calidad, pero obtendremos ficheros pequeños. Con una cantidad de compresión baja obtenemos una calidad muy parecida a la del original, y un fichero extremadamente grande .

Esta pérdida de calidad se acumula. Esto significa que si comprime una imagen y la descomprime obtendrá una calidad de imagen, pero si vuelve a comprimirla y descomprimirla otra vez obtendrá una perdida mayor. Cada vez que comprima y descomprima la imagen esta perderá algo de calidad.

El formato de ficheros JPEG o JPG fue creado por un grupo independiente, llamado JFIF (JPEG File Interchange Format), quienes se encargan solo de la utilización del algoritmo JPEG para almacenar imágenes. Existen otros formatos de fichero que también utilizan el algoritmo JPEG, el más conocido de ellos es JNG.

JPEG/JFIF es el formato más utilizado para almacenar y transmitir archivos de fotos en la Web. Pero la compresión con pérdida del formato no conviene a diagramas que incluyen textos y líneas.

Tabla de contenidos

Codificación

Muchas de las opciones del estándar JPEG se usan poco. Esto es una descripción breve de uno de los muchos métodos comúnmente usados para comprimir imágenes cuando se aplican a una imágen de entrada con 24 bits por pixel (ocho por cada rojo, verde, y azul). Esta opción particular es un método de compresión con pérdida.

Transformación del espacio de color

Lo primero que se realiza es convertir la imágen desde su Modelo de color RGB a otro llamado YUV. Esste espcio de color es similar al que usan los sistemas de color para televisión PAL y NTSC, pero es mucho más parecido al sistema de televisión MAC.

Este espacio de color (YUV) tiene tres componentes:

  • La componente Y representa el brillo de cada pixel, es decir blanco y negro.
  • Las componentes U y V representan juntas el color (saturación y hue)

El resultado es una imágen en la que el brillo está separado de la crominancia.

Submuestreo

Una opción que se puede aplicar al guardar la imágen, es reducir la información del color respecto a la de brillo. Hay varios métodos: si este paso no se aplica, la imágen sigue en su espacio de color YUV, (este submuestreo se entiende como 4:4:4), con lo que la imágen no sufre pérdidas. Puede reducirse la información cromática a la mitad, 4:2:2 (reducir en un factor de 2 en dirección horizontal), con lo que el color tiene la mitad de resolución (en horizontal), y el brillo sigue intacto. Otro método, muy usado, es reducir el color a la cuarta parte, 4:2:0, en el que el color se reduce en un factor de 2 en ambas direcciones, horizontal y vertical. Si la imagen de partida estaba en escala de grises (blanco y negro), puede eliminarse por completo la información de color, quedando como 4:0:0.
Algunos programas que permiten el guardado de imágenes en JPEG (como el que usa GIMP) se refieren a estos métodos con 1×1,1×1,1×1 para YUV 4:4:4 (no perder color), 2×1,1×2,1×1 para YUV 4:2:2 y 2×2,1×1,1×1 para el último método, YUV 4:2:0.

Transformación discreta de coseno o DCT

Entonces, cada componente de la imágen se divide en pequeños bloques de 8×8 píxeles, que se procesan de forma casi independiente, de esto resulta la formación de los bloques, que se hace notable en imágenes guardadas con altas compresiones. Si la imágen sufrió un submuestreo del color, los colores quedarían en la imágen final en bloques de 8×16 y 16×16 pixeles, según fuese 4:2:2 o 4:2:0.

Después cada pequeño bloque se convierte al dominio de la frecuencia a través de la transformación discreta de coseno bidimensional, abreviadamente llamada DCT.

Un ejemplo de uno de esos pequeños bloques de 8×8 inicial es este:

<math>

\begin{bmatrix}

52 & 55 & 61 &  66 &  70 &  61 & 64 & 73 \\
63 & 59 & 55 &  90 & 109 &  85 & 69 & 72 \\
62 & 59 & 68 & 113 & 144 & 104 & 66 & 73 \\
63 & 58 & 71 & 122 & 154 & 106 & 70 & 69 \\
67 & 61 & 68 & 104 & 126 &  88 & 68 & 70 \\
79 & 65 & 60 &  70 &  77 &  68 & 58 & 75 \\
85 & 71 & 64 &  59 &  55 &  61 & 65 & 83 \\
87 & 79 & 69 &  68 &  65 &  76 & 78 & 94

\end{bmatrix} </math>

El siguiente proceso es restarles 128 para que queden números entorno al 0, entre -128 y 127.

<math>

\begin{bmatrix}

-76 & -73 & -67 & -62 & -58 & -67 & -64 & -55 \\
-65 & -69 & -73 & -38 & -19 & -43 & -59 & -56 \\
-66 & -69 & -60 & -15 &  16 & -24 & -62 & -55 \\
-65 & -70 & -57 &  -6 &  26 & -22 & -58 & -59 \\
-61 & -67 & -60 & -24 &  -2 & -40 & -60 & -58 \\
-49 & -63 & -68 & -58 & -51 & -60 & -70 & -53 \\
-43 & -57 & -64 & -69 & -73 & -67 & -63 & -45 \\
-41 & -49 & -59 & -60 & -63 & -52 & -50 & -34

\end{bmatrix} </math>

Se procede a la transformación por DCT de la matriz, y el redondeo de cada elemento al número entero más cercano.

<math>

\begin{bmatrix}

-415 & -30 & -61 &  27 &  56 & -20 & -2 &  0 \\
   4 & -22 & -61 &  10 &  13 &  -7 & -9 &  5 \\
 -47 &   7 &  77 & -25 & -29 &  10 &  5 & -6 \\
 -49 &  12 &  34 & -15 & -10 &   6 &  2 &  2 \\
  12 &  -7 & -13 &  -4 &  -2 &   2 & -3 &  3 \\
  -8 &   3 &   2 &  -6 &  -2 &   1 &  4 &  2 \\
  -1 &   0 &   0 &  -2 &  -1 &  -3 &  4 & -1 \\
   0 &   0 &  -1 &  -4 &  -1 &   0 &  1 &  2

\end{bmatrix} </math>

Nótese que el elemento más grande de toda la matriz aparece en la esquina superior izquierda, este es el coecifiente DC.

Cuantización

El ojo humano es muy bueno detectando pequeños cambios de brillo en áreas relativamente grandes, pero no cuando el brillo cambia rápidamente en pequeñas áreas (variación de alta frecuencia), esto permite eliminar las altas frecuencias, sin perder excesiva calidad visual. Esto se realiza dividiendo cada componente en el dominio de la frecuencia por una constante para ese componente, y redondeándolo a su número entero más cercano. Este es el proceso en el que se pierde la mayor parte de la información (y calidad) cuando una imágen es procesada por este algoritmo. El resultado de esto es que los componentes de las altas frecuencias, tienden a igualarse a cero, mientras que muchos de los demás, se convierten en números positivos y negativos pequeños.

Una matriz de cuantización típica es esta:

<math>

\begin{bmatrix}

16 & 11 & 10 & 16 & 24 & 40 & 51 & 61 \\
12 & 12 & 14 & 19 & 26 & 58 & 60 & 55 \\
14 & 13 & 16 & 24 & 40 & 57 & 69 & 56 \\
14 & 17 & 22 & 29 & 51 & 87 & 80 & 62 \\
18 & 22 & 37 & 56 & 68 & 109 & 103 & 77 \\
24 & 35 & 55 & 64 & 81 & 104 & 113 & 92 \\
49 & 64 & 78 & 87 & 103 & 121 & 120 & 101 \\
72 & 92 & 95 & 98 & 112 & 100 & 103 & 99

\end{bmatrix} </math>

Dividiendo cada coecifiente de la matriz de la imágen transformada entre cada coecifiente de la matriz de cuantización, se obtiene esta matriz, ya cuantizada:

<math>

\begin{bmatrix}

-26 & -3 & -6 &  2 &  2 & -1 & 0 & 0 \\
  0 & -3 & -4 &  1 &  1 &  0 & 0 & 0 \\
 -3 &  1 &  5 & -1 & -1 &  0 & 0 & 0 \\
 -4 &  1 &  2 & -1 &  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 &  0 & 0 & 0

\end{bmatrix} </math>

Por ejemplo, cuantizando el primer elemento, el coecifiente DC, sería así:

<math>

\mathrm{round} \left(

\frac{-415}{16}

\right) = \mathrm{round} \left(

-25.9375

\right) = -26 </math>

Codificación entrópica

La codificación entrópica es una forma especial de la compresión sin pérdida de datos. Para ello se cojen los elementos de la matriz siguiendo una forma de zig-zag, poniendo grupos con frecuencias similares juntos, e insertando ceros de codificación, y usando la Codificación Huffman para lo que queda. También se puede usar, la codificación aritmética, superior a la de Huffman, pero que rara vez se usa, ya que está cubierta por patentes, esta compresión produce archivos un 5% menores, pero a costa de un mayor tiempo de codificación y descodificación, esta pequeña ganancia, puede emplearse también en aplicar un menor grado de compresión a la imágen, y obtener más calidad para un tamaño parecido.

En la matriz anterior, la secuencia en zig-zag, es esta:
−26, −3, 0, −3, −3, −6, 2, −4, 1 −4, 1, 1, 5, 1, 2, −1, 1, −1, 2, 0, 0, 0, 0, 0, −1, −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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

JPEG tiene un codigo Huffman para cortar la cadena anterior en el punto en el que el resto de coecifientes sean ceros, y así, ahorrar espacio:
−26, −3, 0, −3, −3, −6, 2, −4, 1 −4, 1, 1, 5, 1, 2, −1, 1, −1, 2, 0, 0, 0, 0, 0, −1, −1, EOB

Ruido producido por la compresión

El resultado de la compresión, puede ser mayor o menor en función de la agresividad de los divisores de la matriz de cuantización, a mayor valor de esos divisores, más coecifientes se convierten en ceros, y más se comprime la imágen. Pero máyores compresiones, producen mayor ruido en la imágen, empeorando su calidad. Una imágen con una fuerte compresión (1%-15%) puede tener un tamaño de archivo mucho menor, pero tendrá tantos artefactos que no sea interesante, una compresión muy baja (98%-100%) producirá una imágen de muy alta calidad, pero tendrá un tamaño tan elevado que quizás interese más un formato sin pérdida como PNG.

La mayoría de personas que naveguen por Internet estarán familiarizadas con estos fallos, son el resultado de lograr una buena compresión, para evitarlos, se tendrá que reducir el nivel de compresión, o aplicar compresión sin pérdida, produciendo mayores ficheros después.

Descodificación

El proceso es similar al seguido hasta ahora, sólo que de forma inversa. En este caso, al haber perdido información, los valores no coincidirán.

Se coje la información de la matriz, se descodifica, y se pone cada valor en su casilla correspondiente. Después se multiplica cada uno de estos valores por el valor correspondiente de la matriz de cuantización usada, como muchos valores son ceros, sólo se recuperan ( y de forma aproximada) los valores de la esquina superior izquierda.

<math>

\begin{bmatrix}

-416 & -33 & -60 &  32 &  48 & -40 & 0 & 0 \\
   0 & -24 & -56 &  19 &  26 &   0 & 0 & 0 \\
 -42 &  13 &  80 & -24 & -40 &   0 & 0 & 0 \\
 -56 &  17 &  44 & -29 &   0 &   0 & 0 & 0 \\
  18 &   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

\end{bmatrix} </math>

Después se deshace la transformación DCT:

<math>

\begin{bmatrix}

-68 & -65 & -73 & -70 & -58 & -67 & -70 & -48 \\
-70 & -72 & -72 & -45 & -20 & -40 & -65 & -57 \\
-68 & -76 & -66 & -15 &  22 & -12 & -58 & -61 \\
-62 & -72 & -60 &  -6 &  28 & -12 & -59 & -56 \\
-59 & -66 & -63 & -28 &  -8 & -42 & -69 & -52 \\
-60 & -60 & -67 & -60 & -50 & -68 & -75 & -50 \\
-54 & -46 & -61 & -74 & -65 & -64 & -63 & -45 \\
-45 & -32 & -51 & -72 & -58 & -45 & -45 & -39

\end{bmatrix} </math>

Y finalmente se suma 128 a cada entrada:

<math>

\begin{bmatrix}

 60 & 63 & 55 &  58 &  70 &  61 & 58 & 80 \\
 58 & 56 & 56 &  83 & 108 &  88 & 63 & 71 \\
 60 & 52 & 62 & 113 & 150 & 116 & 70 & 67 \\
 66 & 56 & 68 & 122 & 156 & 116 & 69 & 72 \\
 69 & 62 & 65 & 100 & 120 &  86 & 59 & 76 \\
 68 & 68 & 61 &  68 &  78 &  60 & 53 & 78 \\
 74 & 82 & 67 &  54 &  63 &  64 & 65 & 83 \\
 83 & 96 & 77 &  56 &  70 &  83 & 83 & 89

\end{bmatrix} </math>

Para comparar las diferencias entre el bloque original y el comprimido, se halla la diferencia entre ambas matrices, la media de sus valores absolutos, da una ligera idea de la calidad perdida:

<math>

\begin{bmatrix}

-8 &  -8 &  6 &  8 &  0 &   0 &  6 & -7 \\
 5 &   3 & -1 &  7 &  1 &  -3 &  6 &  1 \\
 2 &   7 &  6 &  0 & -6 & -12 & -4 &  6 \\
-3 &   2 &  3 &  0 & -2 & -10 &  1 & -3 \\
-2 &  -1 &  3 &  4 &  6 &   2 &  9 & -6 \\
11 &  -3 & -1 &  2 & -1 &   8 &  5 & -3 \\
11 & -11 & -3 &  5 & -8 &  -3 &  0 &  0 \\
 4 & -17 & -8 & 12 & -5 &  -7 & -5 &  5

\end{bmatrix} </math>

Se puede obserbar que las mayores diferencias están cerca de la mancha, y por la parte inferior, entre la esquina izquierda y el centro, notándose más esta última, ya que corre una mancha clara que antes estaba más a hacia la esquina. La media de los valores absolutos de las restas es 4.8125, aunque en algunas zonas es mayor.

Véase también

Enlaces externos



Views
Personal tools
Herramientas
Otros idiomas