A continuación se detalla el proceso de codificación y descodificación usado por el estándar JPEG y se realiza una implementación en Python.

[ Código en GitHub ]
  1. Introducción
  2. Esquema general
  3. Referencias


Introducción

En este artículo se describe el proceso de codificación y descodificación de imágenes JPEG paso a paso. Cada parte del proceso se acompaña de un ejemplo de implementación en Python. La codificación y descodificación completa, en forma de librería, se puede encontrar aquí.

En la sección de referencias hay una lista detallada de los diferentes recursos usados para la realización de este artículo, así como de los documentos en los que se especifica el estandar JPEG.

Este artículo se ha desarrollado en el contexto de la esteganografía, para la que es especialmente importante conocer el medio en el que se oculta la información. Concretamente, en el caso de JPEG, conviene conocer a fondo todo lo relacionado a los coeficientes DCT.

Sin embargo, lectores interesados en JPEG sin ninguna relación con la esteganografía, pueden encontrar igualmente útil este artículo.


Esquema general

Cuando queremos visualizar una imagen JPEG, necesitamos una herramienta que se encargue de leer el archivo JPEG, descodificarlo y mostrarnos su contenido. De la misma manera, cuando queremos guardar una imagen representada como un mapa de bits, en JPEG, necesitamos una herramienta que se encargue de realizar la codificación. Por ello, en el uso habitual de JPEG, siempre estaremos codificando mapas de bits a JPEG y descodificando JPEG a mapas de bits.

flowchart LR
    JPEG -- Decode --> Bitmap
    Bitmap -- Encode --> JPEG

El proceso definido por el estándar JPEG para realizar la codificación de una imagen representada como mapa de bits se puede ver en el siguiente diagrama. Este proceso, permite eliminar mucha información innecesaria que nos permitirá obtener una imagen de un tamaño muy inferior al de la imagen original representada mediante un mapa de bits.

sequenceDiagram
   RGB ->> YCbCr: Color transform
   YCbCr ->> DCT: blah blah
   DCT ->> Quantization: Remove high freq info
   Quantization ->> Encoding: xx
   Encoding ->> JPEG: xx
   JPEG ->> Encoding: xx
   Encoding ->> Quantization: xx
   Quantization --> DCT: xx
   DCT ->> YCbCr: xx
   YCbCr ->> RGB: Color transform

EN DESARROLLO ...


Referencias

  1. JPEG standard, ITU-81.
  2. JPEG File Interchange Format.
  3. JPEG (Wikipedia).
  4. Let’s Write a Simple JPEG Library.