\chapter{El estándar JPEG2000}

El estándar JPEG2000 es un sistema de compresión y descompresión
de imágenes (de tonos de gris y de color) digitales en formato
\emph{raster}, propuesto recientemente por el JPEG (\emph{Joint
Photographic Experts Group}). Este estándar está publicado como un
ISO/IEC estándar \cite{jpeg1, jpeg2} y consta de varias partes,
empezando por la Parte 1, que define los requerimientos mínimos
necesarios para la compresión/descompresión de las imágenes
(codificación, sintaxis del \emph{codestream}, \dots). La primera
parte sería lo mínimo necesario para cualquier implementación. Las
partes sucesivas van añadiendo funcionalidad extra.

En el momento de la creación del presente documento, las partes
existentes son las qué aparecen en la tabla \ref{tab:partes}. La
Parte 9 del estándar será tratada más adelante en el presente
documento.

\begin{table}
\begin{center}
\begin{tabular}[]{*{2}{l}}
\textbf{Parte} & \textbf{Descripción} \\
\hline \\
1 & Sistema base \\
2 & Extensión. Añade funcionalidad al sistema base\\
3 & JPEG 2000 para secuencias de vídeo \\
4 & \emph{Conformance} \\
5 & Software de referencia (implementaciones en C y Java) \\
6 & Formato de archivo compuesto\\
8 & JPSEC, para habilitar opciones de seguridad \\
9 & JPIP, protocolo para la transmisión progresiva de imágenes \\
10 & JP3D, para imágenes tridimensionales \\
11 & JPWL, para aplicaciones \emph{wireless} \\
\end{tabular}
\label{tab:partes} \caption{Partes del estándar JPEG2000.}
\end{center}
\end{table}

\section{Características principales}

Algunas de las principales características del estándar JPEG2000
son las siguientes:

\begin{itemize}

\item \textbf{Compresión de imágenes \emph{continuous-tone} y
\emph{bi-levels}:} El estándar es capaz de comprimir imágenes de
tono continuo (\emph{continuous-tone}) y binarias
(\emph{bi-levels}). Permite además una compresión de imágenes con
un rango dinámico de profundidad de bits para cada componente,
desde 1 bit, con una calidad comparable al estándar ITU-T G4,
hasta los 32 bits, siendo, posiblemente, el único estándar que
hasta el momento ofrece esta posibilidad.

\item \textbf{Transmisión progresiva de las imágenes:} Ofrece una
progresión en calidad, en resolución, en posición espacial o en
componente de imagen, lo cual es muy apropiado para la transmisión
sobre enlaces de comunicación lentos. Estas progresiones, que se
consiguen ordenando adecuadamente el \emph{codestream}, pueden
coexistir entremezcladas en una misma imagen. En el caso del
presente proyecto, será necesario tener en cuenta esto, pero no
será empleado.

\item \textbf{Posibilidad de compresión con o sin perdida:}
Gracias a la inclusión de una transformada wavelet reversible, el
estándar JPEG2000 ofrece esta posibilidad.

\item \textbf{Acceso aleatorio al \emph{codestream} de la imagen
así como posibilidad de procesamiento del mismo sin necesidad de
descompresión:} Los \emph{codestreams} ofrecen diversos mecanismos
para soportar el acceso aleatorio en función de una región de
interés. Además, permiten la rotación, la traslación y el
escalado, entre otros, de la imagen que definen, sin necesidad de
descompresión.

\item \textbf{Robustez ante errores en los datos:} JPEG2000 define
una serie de mecanismos (marcadores de sincronización, etc.) para
permitir la detección de errores de los datos. Por ejemplo, las
aplicaciones que hacen uso de canales de comunicación
\emph{wireless} harían uso de esta característica.

\item \textbf{Arquitectura abierta:} La arquitectura del estándar
es abierta, de forma que se define la base, que sería la Parte 1,
a la cual se le va añadiendo la funcionalidad que se requiera para
aplicaciones específicas.

\item \textbf{Mejor rendimiento a bajos \emph{bit-rates}:}
JPEG2000 ofrece un rendimiento superior a bajos \emph{bit-rates}
con respecto al resto de los estándares. Las aplicaciones de
transmisión de imágenes a través de la red se benefician de esta
característica.

\item \textbf{Posibilidad de definir regiones de interés
(\emph{ROI}):} A menudo existen partes de una imagen que son más
importantes que otras. El estándar permite definir ciertas ROIs en
la imagen con el fin de que sean codificadas y transmitidas con
mayor prioridad, mejor calidad y menor distorsión que el resto.

\end{itemize}

\section{Arquitectura}

La Parte 1 del estándar especifica una arquitectura básica,
formada por un conjunto de etapas de procesamiento, que se puede
ver en forma de diagrama de bloques en la figura
\ref{fig:arquitecturaEstandar}. Dichas etapas son aplicadas a cada
componente de cada \emph{tile} de la imagen a comprimir.

\begin{figure}[!hbt]
  \begin{center}
    \resizebox{!}{!}{\input{figuras/arquitecturaEstandar}}
    \caption{Arquitectura del estándar JPEG2000.}
    \label{fig:arquitecturaEstandar}
  \end{center}
\end{figure}

Las etapas de la arquitectura del estándar JPEG2000 son las
siguientes:

\begin{itemize}
\item \textbf{\emph{Offset}:} Las muestras de la imagen,
$x[\mbox{\boldmath$n$}]$, donde $\mbox{\boldmath$n$}$ representa
el punto de coordenadas $[n_1,n_2]$ de la imagen, con una
profundidad de $B$ bits, deben ser valores con signo en el rango:
\begin{equation*}
-2^{B-1} \leq x[\mbox{\boldmath$n$}] \leq 2^{B-1}
\end{equation*}
Por ello, si las muestras originales de la imagen son sin signo,
como suele pasar en la mayoría de los casos, es necesario
añadirles un \emph{offset} de $-2^{B-1}$.

\item \textbf{Transformada de color:} La transformada de color es
opcional, ya que sólo puede ser aplicada cuando se poseen al menos
tres componentes de color y las tres primeras son del mismo
tamaño y la misma profundidad de bits. Se asume que estas primeras
tres componentes son RGB, el rojo (\emph{Red}), el verde
(\emph{Green}) y el azul (\emph{Blue}).

El objetivo de la transformada de color es convertir las
componentes RGB de la imagen en otras componentes con un modelo de
color diferente, con el fin de reducir la redundancia que existe
entre los canales R, G y B, y poder así aumentar las tasas de
compresión.

Como se puede apreciar en la figura
\ref{fig:arquitecturaEstandar}, existen dos tipos de transformadas
de color, una para el camino irreversible, la ICT, y otra para el
camino reversible, la RCT.

La transformada ICT convierte de RGB a YCbCr. La transformada RCT
convierte de RGB a Y'DbDr.

Como hemos comentado, asumimos que las tres componentes,
$x_{0}[\mbox{\boldmath$n$}]$, $x_{1}[\mbox{\boldmath$n$}]$ y
$x_{2}[\mbox{\boldmath$n$}]$, son el rojo,
$x_{R}[\mbox{\boldmath$n$}]$, el verde,
$x_{G}[\mbox{\boldmath$n$}]$, y el azul,
$x_{B}[\mbox{\boldmath$n$}]$. La transformada ICT es:

\begin{equation*}
x_{Y}[\mbox{\boldmath$n$}] \triangleq
\alpha_{R}x_{R}[\mbox{\boldmath$n$}] +
\alpha_{G}x_{G}[\mbox{\boldmath$n$}] +
\alpha_{B}x_{B}[\mbox{\boldmath$n$}]
\end{equation*}
\begin{equation*}
x_{Cb}[\mbox{\boldmath$n$}] \triangleq \frac{0.5}{1 - \alpha_{B}}
(x_{B}[\mbox{\boldmath$n$}] - x_{Y}[\mbox{\boldmath$n$}])
\end{equation*}
\begin{equation*}
x_{Cr}[\mbox{\boldmath$n$}] \triangleq \frac{0.5}{1 - \alpha_{R}}
(x_{R}[\mbox{\boldmath$n$}] - x_{Y}[\mbox{\boldmath$n$}])
\end{equation*}

Donde $\alpha_{R} \triangleq 0.2999$, $\alpha_{G} \triangleq
0.587$ y $\alpha_{B} \triangleq 0.114$.

Con las mismas condiciones que para la transformada ICT, se define
la transformada RCT como sigue:

\begin{equation*}
x_{Y'}[\mbox{\boldmath$n$}] \triangleq \left \lfloor
\frac{x_{R}[\mbox{\boldmath$n$}] + 2 x_{G}[\mbox{\boldmath$n$}] +
x_{B}[\mbox{\boldmath$n$}]}{4} \right \rfloor
\end{equation*}
\begin{equation*}
x_{Db} \triangleq x_{B}[\mbox{\boldmath$n$}] -
x_{G}[\mbox{\boldmath$n$}]
\end{equation*}
\begin{equation*}
x_{Dr} \triangleq x_{R}[\mbox{\boldmath$n$}] -
x_{G}[\mbox{\boldmath$n$}]
\end{equation*}

En nuestro caso, las imágenes van a cumplir la condición necesaria
para aplicar la transformada de color, ya que van a ser imágenes
en color con sólo tres componentes, RGB.

\item \textbf{Transformada wavelet:}

La segunda etapa de minimización entrópica se basa en la
transformada wavelet discreta o DWT (\emph{Discrete Wavelet
Transform}). Esta representa los puntos de la imagen a comprimir
en un dominio espacio-frecuencial que posee dos ventajas
fundamentales: (1) reducir la correlación espacial de cada
componente de la imagen, lo que es esencial de cara a maximizar
las tasas de compresión, y (2) encontrar una representación
multiresolución para cada componente, propiedad que puede ser de
ayuda a la hora de procesar imágenes muy grandes.

A continuación vamos a describir la DWT desde el punto de vista de
la Teoría de los Bancos de Filtros \cite{Strang.Wavelets}.

Según dicha teoría, una secuencia unidimensional de $N$ muestras
$x[n], ~n=0,\cdots,N-1$ puede ser representada mediante dos
secuencias $l[n], ~n=0,\cdots,\frac{N}{2}-1$ y $h[n], ~n=0,\cdots,\frac{N}{2}-1$ de tamaño mitad, donde $l[n]$ es el
resultado de filtrar $x[n]$ usando un filtro paso bajo $L$ y
$h[n]$ es el resultado de filtrar $x[n]$ mediante un filtro paso
alto $H$. Esta banco de dos filtros se define de forma que desde
el punto de vista de la frecuencia, lo que el filtro $L$ deja
pasar es lo que $H$ no deja pasar y viceversa. Por este motivo, la
información contenida en las bandas $l[n]$ y $h[n]$ es la misma
que en la secuencia original $x[n]$ que puede ser regenerada
usando los correspondientes filtros de síntesis.

Este proceso de descomponer una señal en dos señales, una de baja
frecuencia y otra de alta puede aplicarse recursivamente a ambas
subbandas. Cuando sólo se aplica a la banda de baja frecuencia, se
habla de la DWT en su versión diádica (\emph{dyadic}). Si se
aplica a ambas, obtenemos la DWT en su versión paquetizada
(\emph{packet}). En el caso de la compresión de imágenes, la forma
más utilizada en la diádica porque la energía se acumula
principalmente en la zona de baja frecuencia.

\begin{figure}
  \begin{center}
    \input{figuras/DWT}
  \end{center}
  \caption{Una descomposición DWT diádica de 3 niveles.}
  \label{fig:DWT}
\end{figure}

En la figura \ref{fig:DWT} se muestra gráficamente el proceso de
descomposición aplicado en la DWT diádica unidimensional. El
número máximo de etapas o niveles es igual a $\log_2(N)$. A los
coeficientes de las bandas $l^{\log_2(N)}$ y
$l^jh[n],~j=0,\cdots,\log_2(N)-1;~n=0,\cdots,\frac{N}{2^{j+1}}-1$,
donde $j$ es el nivel de la descomposición, se les llama
coeficientes \emph{wavelet}.

Usando $l^n[0]$ y $l^jh[n]$ es posible obtener $\log_2(N)$ niveles de
resolución a la hora de representar $x[n]$. Así, el primer nivel de
resolución estaría formado por una señal constante e igual a
$l^{\log_2(N)}[0]$, el segundo nivel utilizaría los coeficientes
$l^{\log_2(N)}[0]$ y $l^{\log_2(N)-1}h[0]$, y así
sucesivamente. Finalmente, nótese que se cumple que $x[n]=l^0[n]$.

La DWT se diferencia además de otras transformadas clásicas como
la DFT (Discrete Fourier Transform) o la DCT (Discrete Cosine
Transform) en un aspecto fundamental: se trata de una
representación espacio-frecuencial, no únicamente frecuencial.
Gracias a esto es posible seleccionar un subconjunto de
coeficientes \emph{wavelet} para reconstruir sólo una parte de la
señal original. Esto es muy útil cuando procesamos imágenes muy
grandes y sólo podemos visualizar una parte de la imagen.

\begin{figure}[!hbt]
  \begin{center}
    \input{figuras/DWT-2d}
  \end{center}
  \caption{Una descomposición DWT diádica bidimensional de 2 niveles.}
  \label{fig:DWT-2d}
\end{figure}

Ya que estamos trabajando con imágenes y éstas tienen dos
dimensiones, es necesario extender este proceso al caso
bidimensional. Por suerte la DWT diádica es separable, lo que
significa que podemos calcular la DWT diádica bidimensional
aplicando la DWT diádica unidimensional primero a las filas y
luego a las columnas de la imagen (o viceversa). Este proceso se
describe gráficamente en la figura \ref{fig:DWT-2d}. De esta
forma, tras cada fase de descomposición se obtienen cuatro bandas
en lugar de dos.

\begin{figure}
  \begin{center}
    \includegraphics[width=\textwidth]{figuras/dwtLena}
    \caption{Transformada DWT a la imagen ``lena''.}
    \label{fig:dwtLena}
  \end{center}
\end{figure}

\item \textbf{Cuantificación:} Cada coeficiente \emph{wavelet} $c$
se cuantifica mediante la siguiente expresión:
\begin{equation*}
q_{b}[n] =
sign\left(c\right)\left\lfloor\frac{\left|c\right|}{\Delta_{b}}\right\rfloor
\end{equation*}
El estándar JPEG2000 permite definir un \emph{step-size} de
cuantificación, $\Delta_{b}$, especifico de cada subbanda. Para el
camino reversible, el \emph{step-size} de cuantificación debe ser
necesariamente igual a uno. Por el camino irreversible la
cuantificación recibe el nombre de \emph{DZQ}, y por el
reversible, el de \emph{Ranging}.

\item \textbf{Ajuste de la ROI (\emph{Region Of Interest}):} Como
se comentó anteriormente, JPEG2000 ofrece mecanismos mediante los
cuales el compresor puede asignar una prioridad más alta a ciertas
regiones de la imagen. En esta etapa es donde se realiza la
codificación de la ROI a tener en cuenta en la codificación. El
método empleado en el estándar para la codificación de la ROI es
el llamado método \emph{MAXSHIFT}, que consiste en desplazar a la
izquierda los coeficientes \emph{wavelet} que conforman la ROI.

\item \textbf{Codificación:} El codificador empleado por el
estándar JPEG2000 es el codificador \emph{MQ}, similar al
codificador \emph{QM} empleado en el estándar JPEG. El codificador
\emph{MQ} es empleado también en el estándar JBIG-2. Se trata de
un codificador aritmético binario que permite codificar sin
redundancia estadística los planos de bits de los coeficientes
\emph{wavelets}.

\end{itemize}

\section{Particiones de los datos}

El estándar JPEG2000 define una gran variedad de particiones
dentro de los datos asociados a una imagen, con el fin de permitir
la manipulación eficiente de la imagen, o de un trozo de ella, a
diferentes resoluciones.

El objetivo de este capitulo es describir estas particiones, ya
que a ellas se hará referencia en muchas partes de este documento.

\subsection{El concepto de \emph{canvas}}

Para entender el concepto de cada una de las particiones que se
definen en el estándar JPEG2000, es necesario tener claro el
concepto de \emph{canvas}. El \emph{canvas} es una zona
bidimensional de dibujo donde se mapearán todas las particiones
que forman la imagen. Las coordenadas a las que se refiera de aquí
en adelante son respecto al \emph{canvas}, cuya dimensión, ancho y
alto, corresponderá a la dimensión total de la imagen a
visualizar. Esto no conlleva necesariamente que la imagen
comprimida ocupe la totalidad del \emph{canvas}. Cada partición se
sitúa y mapea sobre el \emph{canvas} de una determinada forma.

\subsection{Componentes}

Una imagen está compuesta por una o más componentes. En nuestro
caso, por ejemplo, las imágenes con las que vamos a trabajar van a
ser imágenes con tres componentes, la componente rojo, la
componente verde y la componente azul (RGB).

En el estándar JPEG2000, las componentes tienen asociados además
unos factores de espaciado, o \emph{sub-sampling factors}. Sea una
componente cualquiera $c$, definida por un conjunto bidimensional
de muestras, $x_{c}[n_{1},n_{2}]$, se definen dos factores de
espaciado, $S_{1}^{c}$ y $S_{2}^{c}$, uno para las filas y otro
para las columnas respectivamente. Cada muestra de la componente,
$x_{c}[n_{1},n_{2}]$ tiene la posición $[n_{1}S_{1}^{c},
n_{2}S_{2}^{c}]$ dentro del \emph{canvas}.

Para una imagen simple RGB, las tres componentes de color tendrán
una dimensión igual a la del \emph{canvas}, y unos factores de
espacio igual a uno.

\subsection{\emph{Tiles}}

El estándar JPEG2000 permite dividir una imagen en regiones
rectangulares más pequeñas llamadas \emph{tiles} (que en español
sería algo así como baldosas). Cada \emph{tile} es comprimido de
forma independiente en relación al resto, por lo que los
parámetros de compresión pueden ser distintos para cada
\emph{tile} si se desea.

Una de las posibles aplicaciones de estas particiones son las
imágenes que contienen elementos variados y bien diferenciados,
como texto, gráficos o material fotográfico. El uso de los
\emph{tiles} también reduce la memoria necesaria para la
descompresión de una imagen, al tener que aplicar el proceso de
descompresión \emph{tile} a \emph{tile} en vez de a la imagen
completa.

La forma de crear los \emph{tiles} está definida por cuatro
parámetros enteros positivos, que, como se verá más adelante,
aparecerán en el marcador \emph{SIZ}: los dos primeros, $T_{1}$,
$T_{2}$, definen el alto y el ancho de los \emph{tiles}, y los dos
restantes $\Omega_{1}^{T}$ y $\Omega_{2}^{T}$, definen el punto de
anclaje del conjunto de \emph{tiles}. Esto puede verse
gráficamente en la figura \ref{fig:particionTiles}.

\begin{figure}[!hbt]
  \begin{center}
    \input{figuras/particionTiles}
    \caption[Partición en \emph{tiles} de una imagen]{La partición en
      \emph{tiles} sobre el \emph{canvas}. La región en celeste
      identifica a la imagen, la región  en la que está incluida al
      \emph{canvas}, y los rectángulos grises los diferentes
      \emph{tiles}.} \label{fig:particionTiles}
  \end{center}
\end{figure}

Los \emph{tiles} le dan al estándar JPEG2000 una gran
versatilidad, pero en la mayoría de los casos, su uso no merecerá
la pena e incluso, la calidad de la imagen puede verse afectada,
como se puede apreciar en la figura \ref{fig:tiling}.

\begin{figure}[!hbt]
  \begin{center}
    \includegraphics[width=12cm, height=12cm]{figuras/tiling}
    \caption[Efecto del \emph{tiling} en las imágenes]{La imagen
      ``ski'' de $720\times 576$: (a) imagen original, (b)-(d)
      imágenes reconstruidas después de una compresión JPEG2000 a 0.25
      bpp: (b) sin \emph{tiling}, (c) con \emph{tiles} de $128\times
      128$, y (d) con \emph{tiles} de $64\times 64$.}
    \label{fig:tiling}
  \end{center}
\end{figure}

\subsection{\emph{Tile}-componente}

La transformada DWT y todos los pasos siguientes de cuantificación
y codificación son aplicados independientemente a cada
\emph{tile}-componente. Un \emph{tile}-componente, del \emph{tile}
$t$ y la componente $c$, está formando por la zona bidimensional
que define $t$ sobre la cual se mapea la componente $c$ en función
de sus factores de espaciado. Esto quiere decir que si tenemos una
imagen con un único \emph{tile} que ocupe el total de la imagen,
con tres componentes de color, tendremos tres
\emph{tile}-componentes, a los que a cada uno se le aplica el
proceso de compresión de forma independiente.

\subsection{Resoluciones}

Para cada \emph{tile}-componente, identificado por el \emph{tile}
$t$ y la componente $c$, hay un total de $D_{t,c} + 1$
resoluciones, donde $D_{t,c}$ es el número de etapas DWT
aplicadas. El $r$-ésimo nivel de resolución de la imagen
comprimida se obtiene tras aplicar $r$ veces la transformada DWT
directa o $D_{t,c}-r$ etapas de la transformada inversa, y se
corresponde con la banda de frecuencia $ll^r$. El valor de $r$
toma una valor en el rango $0 \leq r \leq D_{t,c}$. La menor
resolución, $r = 0$, corresponde a la última subbanda obtenida
tras aplicar todos los pasos de la transformada DWT al
\emph{tile}-componente. La mayor resolución se corresponde al
\emph{tile}-componente original.

En la figura \ref{fig:dwtLena} se pueden apreciar las distintas
resoluciones. En ese caso, $D_{t,c} = 2$, con lo que existe un
total de 3 resoluciones. La resolución mayor sería la primera
imagen. Las restantes resoluciones se corresponden con la parte
más nítidas de las restantes imágenes, de forma que, la resolución
0 correspondería con la pequeña zona cuadrada situada en la
esquina superior izquierda de la tercera imagen.

Siendo $[E_{1}^{t}, F_{1}^{t})\times[E_{2}^{t},F_{2}^{t})$ la
región que ocupa el \emph{tile} $t$ en el \emph{canvas}, la
dimensión del \emph{tile}-componente definido por el \emph{tile}
$t$ y la componente $c$, en la resolución $r$ es:

\begin{center}
$E_{i}^{t,c,r} = \left \lceil
\frac{E_{i}^{t}}{2^{(D_{t,c}-r)}S_{i}^{c}} \right \rceil$,
$F_{i}^{t,c,r} = \left \lceil
\frac{F_{i}^{t}}{2^{(D_{t,c}-r)}S_{i}^{c}} \right \rceil$, para $i
\in {1,2}$
\end{center}

\subsection{\emph{Code-blocks} y precintos}

Cada \emph{tile}-componente es dividido en \emph{code-blocks}, que
son codificados independientemente. Esta partición en
\emph{code-blocks} es definida mediante el punto de anclaje,
$[\Omega_{1}^{C}, \Omega_{2}^{C}]$, y el alto y el ancho máximo
del \emph{code-block}, $J_{1}^{t,c}$ y $J_{2}^{t,c}$. En la Parte
1 del estándar, el punto de anclaje debe ser obligatoriamente
$[0,0]$ pero, en cambio, en la Parte 2, cada $\Omega_{i}^{t,c}$
puede tomar el valor de $0$ o de $1$.

La división en \emph{code-blocks} es fundamental para el paradigma
EBCOT \cite{Taubman.EBCOT}, empleado en el estándar JPEG2000.

En cada resolución $r$ de cada \emph{tile}-componente $t,c$, los
\emph{code-blocks} son agrupados en precintos (\emph{precincts}).
Esta agrupación viene definida por el alto, en número de
\emph{code-blocks}, $P_{1}^{t,c,r}$, y el ancho, también en número
de \emph{code-blocks}, $P_{2}^{t,c,r}$ de cada precinto.

En la figura \ref{fig:particionCodeblocks} se puede observar la
división de una resolución de un \emph{tile}-componente en
\emph{code-blocks} y precintos.

\begin{figure}[!hbt]
  \begin{center}
    \input{figuras/particionCodeblocks}
    \caption[Partición en \emph{code-blocks} y precintos]{Partición en
      \emph{code-blocks} y precintos de un \emph{tile}-componente a
      una determinada resolución. La región en celeste identifica a la
      resolución del \emph{tile}-componente.}
    \label{fig:particionCodeblocks}
  \end{center}
\end{figure}

Cada precinto $P$ es identificado por un par de índices
$[p_{1},p_{2}]$, los cuales están comprendidos en los siguientes
rangos:

\begin{center}
$0 \leq p_{1} < N_{1}^{P,t,c,r}$ y $0 \leq p_{2} <
N_{2}^{P,t,c,r}$
\end{center}

$N_{1}^{P,t,c,r}$ y $N_{2}^{P,t,c,r}$ identifican el número de
precintos vertical y horizontalmente, respectivamente. Estos
valores son obtenidos mediante la siguiente ecuación:

\begin{equation*}
N_{i}^{P,t,c,r} = \left \{ \begin{tabular}{*{3}{c}}
  $\left \lceil \frac{F_{i}^{t,c,r}-\Omega_{i}^{C}}{P_{i}^{t,c,r}} \right
  \rceil$ - $\left \lfloor \frac{E_{i}^{t,c,r}-\Omega_{i}^{C}}{P_{i}^{t,c,r}} \right
  \rfloor$
    & si & $F_{i}^{t,c,r} > E_{i}^{t,c,r}$ \\
  $0$
    & si & $F_{i}^{t,c,r} = E_{i}^{t,c,r}$ \\
\end{tabular} \right . %\}
\end{equation*}

Los precintos juegan un papel importante en la organización de los
datos comprimidos dentro del \emph{codestream}.

\subsection{Capas y paquetes}

El paquete es la unidad fundamental en la organización del
\emph{codestream}. Cada precinto contribuye al \emph{codestream}
con tantos paquetes como capas de calidad (\emph{quality layer})
haya. Como hemos mencionado anteriormente, cada \emph{code-block}
es codificado independientemente. Los datos codificados de cada
\emph{code-block} son divididos en diferentes secciones llamadas
capas de calidad. Todos los \emph{code-blocks} de los precintos de
un mismo \emph{tile} son divididos en el mismo número de capas,
aunque el tamaño de las capas entre \emph{code-blocks} puede ser
diferente (el tamaño puede ser incluso cero). Para una capa $l$
determinada, el conjunto de las capas $l$ de todos los
\emph{code-blocks} que forman un precinto forman un paquete. La
figura \ref{fig:paquetes} muestra un ejemplo gráfico.

\begin{figure}[!hbt]
  \begin{center}
    \resizebox{\textwidth}{!}{\input{figuras/paquetes}}
    \caption{Ejemplo de capas de calidad y paquetes.}
    \label{fig:paquetes}
  \end{center}
\end{figure}

El número de capas de calidad para un \emph{tile} $t$ es
identificado como $\Lambda_{t}$. Aunque el número de capas de
calidad puede variar de \emph{tile} a \emph{tile}, los compresores
harían bien en usar el mismo número de capas para todos los
\emph{tiles}, para evitar ambigüedades cuando se pretende
descartar un determinado número de capas de calidad en una imagen.

El número total de paquetes en un \emph{codestream} sería:

\begin{equation*}
\mathrm{n\acute umero~de~paquetes} = \sum_{t_{1}=0}^{N_{1}^{T}-1}
\sum_{t_{2}=0}^{N_{2}^{T}-1} \sum_{c=0}^{C-1} \sum_{r=0}^{D_{t,c}}
\Lambda_{t} N_{1}^{P,t,c,r} N_{2}^{P,t,c,r}
\end{equation*}

Un paquete $\zeta_{t,c,r,p,l}$ es identificado por el \emph{tile}
$t$, la componente $c$, la resolución $r$, el precinto $p$ ($p
\equiv [p_{1}, p_{2}]$) y la capa de calidad $l$.

\section{Formato del \emph{codestream}}

A continuación se explicará el formato del \emph{codestream} según
la Parte 1 del estándar JPEG2000.

\subsection{Marcadores}

El \emph{codestream} está basado en marcadores (\emph{markers}),
los cuales poseen un identificador único, en forma de entero sin
signo de 16 bits. Estos marcadores pueden presentarse solos, es
decir, únicamente el identificador, o acompañados de información
adicional, recibiendo entonces el nombre de segmento marcador
(\emph{marker segment}), como aparece en la figura
\ref{fig:tipoMarcador}.

\begin{figure}
  \begin{center}
    \resizebox{\textwidth}{!}{\input{figuras/tipoMarcador}}
    \caption{Tipos de marcadores.}
    \label{fig:tipoMarcador}
  \end{center}
\end{figure}

El segmento marcador posee, a continuación del identificador, otro
entero sin signo de 16 bits que posee la longitud de los datos
incluidos en el marcador, incluyendo los dos bytes de dicho
entero, pero sin contar los dos bytes del identificador.

En la tabla \ref{tab:marcadores} pueden verse todos los marcadores
disponibles en la Parte 1 del estándar. No entraremos a explicar
todos los marcadores, sino que nos limitaremos a los marcadores
que nos interesan. Para una mayor información, consultar
\cite{Taubman.book}.

\begin{table}
\begin{center}
\begin{tabularx}{\textwidth}{|c|c|X|c|c|c|}
  \hline
  \rotatebox{90}{Nombre} & \rotatebox{90}{Identificador}    &
\rotatebox{0}{Descripción}                                       &
\rotatebox{90}{Posición} & \rotatebox{90}{¿Datos?} &
\rotatebox{90}{¿Obligatorio?} \\
  \hline
  SOC    & 0xFF4F & Comienzo del
\emph{codestream}                           & M        & No     & Si \\
  SOT    & 0xFF90 & Comienzo de \emph{tile} (o
\emph{tile-part})                    & T,P      & Si     & Si \\
  SOD    & 0xFF93 & Comienzo de los datos de un \emph{tile} (o
\emph{tile-part})    & T,P      & No     & Si \\
  EOC    & 0xFFD9 & Fin del
\emph{codestream}                                & E        & No
& Si
\\
  SIZ    & 0xFF51 & Tamaño de la imagen y de los
\emph{tiles}                & M        & Si     & Si \\
  COD    & 0xFF52 & Parámetros de codificación                        &
M,T      & Si     & Si \\
  COC    & 0xFF53 & Parámetros de codificación para un componente     &
M,T      & Si     & No \\
  QCD    & 0xFF5C & Parámetros de cuantificación                      &
M,T      & Si     & Si \\
  QCC    & 0xFF5D & Parámetros de cuantificación para un componente   &
M,T      & Si     & No \\
  RGN    & 0xFF5E & Región de interés (ROI)                           &
M,T      & Si     & No \\
  POC    & 0xFF5F & Cambio de tipo de progresión                      &
M,T,P    & Si     & No \\
  TLM    & 0xFF55 & Longitudes de todos los \emph{tile-parts} del
\emph{codestream} & M        & Si     & No \\
  PLM    & 0xFF57 & Longitudes de todos los paquetes del
\emph{codestream}   & M        & Si     & No \\
  PLT    & 0xFF58 & Longitudes de todos los paquetes de un
\emph{tile-part}  & T,P      & Si     & No \\
  PPM    & 0xFF60 & Cabeceras de todos los paquetes del
\emph{codestream}    & M        & Si     & No \\
  PPT    & 0xFF61 & Cabeceras de todos los paquetes de un
\emph{tile-part}   & T,P      & Si     & No \\
  SOP    & 0xFF91 & Comienzo de paquete                               &
S        & Si     & No \\
  EPH    & 0xFF92 & Fin de la cabecera del paquete                    &
S        & Si     & No \\
  CRG    & 0xFF63 & Registro de un componente                         &
M        & Si     & No \\
  COM    & 0xFF64 & Comentario                                        &
M,T,P    & Si     & No \\
  \hline
\end{tabularx}
\end{center}
\caption[Marcadores de un \emph{codestream} JPEG2000] {Marcadores
de un \emph{codestream} JPEG2000. Las posiciones donde los
marcadores pueden aparecer son identificadas por: M, para la
cabecera principal; T, para la cabecera de un \emph{tile}; P, para
la cabecera de un \emph{tile-part}; S, cuando aparece dentro de
los datos comprimidos de un \emph{tile-part}; E: cuando aparece al
final del \emph{codestream}.} \label{tab:marcadores}
\end{table}

\subsection{Organización del \emph{codestream}}

El \emph{codestream} comienza siempre por el marcador SOC
(\emph{Start Of Codestream}), el cual no lleva información
ninguna. A partir de este marcador comienza lo que se denomina la
cabecera principal. Los marcadores que pueden aparecer en esta
cabecera aparecen en la tabla \ref{tab:marcadores}.

Al marcador SOC le sigue siempre el marcador SIZ, que posee
información global necesaria para la descompresión de los datos,
como la dimensión de la imagen, la dimensión de los \emph{tiles},
el punto de anclaje de la partición de los \emph{tiles}, el número
de componentes, sus factores de espaciado, etc.

Como se puede puede ver en la tabla \ref{tab:marcadores}, otros
dos marcadores necesarios en la cabecera principal son: COD, que
contiene información relativa a la codificación de la imagen, como
el número de capas, el número etapas de la transformada DWT, el
tamaño de los \emph{code-blocks}, la progresión, etc.; QCD, que
contiene los parámetros de cuantificación. Estos dos marcadores
son necesarios, pero pueden aparecer en cualquier parte de la
cabecera principal.

El resto del \emph{codestream}, hasta el marcador EOC (\emph{End
Of Codestream}), situado justo al final del mismo, se organiza tal
y como aparece en la figura \ref{fig:orgCodestream}. Para cada
\emph{tile} de la imagen, tenemos un conjunto de datos. Este
conjunto de datos se divide en uno o más \emph{tile-part}. Cada
\emph{tile-part} se compone por una cabecera y un conjunto de
paquetes. La cabecera del primer \emph{tile-part} es la cabecera
principal del \emph{tile}. La cabecera de cada \emph{tile-part}
comienza con el marcador SOT (\emph{Start Of Tile}) y finaliza con
el marcador SOD (\emph{Start Of Data}), a partir del cual comienza
la secuencia de paquetes, según el último marcador COD o POC. Los
marcadores admitidos por cada cabecera aparecen en la tabla
\ref{tab:marcadores}. La cabecera principal finaliza al encontrar
el primer SOT.

\begin{figure}
  \begin{center}
    \input{figuras/orgCodestream}
    \caption{Organización del \emph{codestream}.}
    \label{fig:orgCodestream}
  \end{center}
\end{figure}

Para permitir el acceso aleatorio a los datos de un
\emph{codestream}, JPEG2000 ofrece la posibilidad de incluir los
marcadores TLM, PLM y/o PLT. Los marcadores TLM y PLM se incluyen
en la cabecera principal, mientras que el marcador PLT va en la
cabecera de un \emph{tile} o \emph{tile-part}. La misión del
marcador TLM es almacenar la longitud de cada \emph{tile-part} que
aparece en el \emph{codestream}, aunque esta longitud incluye
tanto la cabecera como la secuencia de paquetes, por lo que para
saber donde comienza la secuencia de paquetes habría que procesar
la cabecera primero. El marcador PLM almacena la longitud de cada
paquete de cada \emph{tile-part} del \emph{codestream}. Cada
paquete del \emph{codestream} posee una longitud determinada, que
no puede calcularse de antemano, por lo que la inclusión de este
marcador facilita el acceso aleatorio a los paquetes. El marcador
PLT cumple la misma función que el marcador PLM, pero a nivel de
\emph{tile-part}, es decir, almacena la longitud de todos los
paquetes del \emph{tile-part} al cual pertenece.

Los marcadores PLM y PLT producen una dilatación del tamaño del
\emph{codestream}, aunque la forma de almacenar las longitudes de
los paquetes ayuda a evitar que resulte excesiva: una longitud $L$
de un paquete determinado, que puede representarse con $B_{L}$
bits, se almacena, tanto en un marcador PLM como en uno PLT, con
$\left \lceil \frac{B_{L}}{7} \right \rceil$. Esto quiere decir
que para una longitud de 8 bits, necesitamos dos bytes. A primera
vista no parece una gran ayuda, pero hay que considerar que
almacenamos las longitudes ocupando el menor número de bytes
posibles, porque, por ejemplo, una longitud representable con 17
bits, no ocuparía 4 bytes como sería lo normal (lo normal es
almacenar los enteros en 1 byte, en 2 bytes o en 4 bytes), sino 3
bytes.

Los marcadores SOP y EPH pueden ir intercalados entre los
paquetes. Si se utiliza el marcador SOP, éste aparece al comienzo
de cada paquete, y puede servir para detectar posibles errores en
la secuencia de los paquetes: por ejemplo, en los marcadores PLM y
PLT, la longitud de los paquetes incluye al marcador SOP, por lo
que, si empleáramos estos marcadores para acceder a paquetes
aleatoriamente, podríamos comprobar que se ha accedido
correctamente al paquete si los primeros bytes del mismo se
corresponden con el marcador SOP apropiado. El marcador SOP
almacena el índice del paquete al cual se asocia, en un entero sin
signo de dos bytes. Si se utiliza el marcador EPH, éste aparece al
final de cada paquete y no contiene información alguna. Su función
es únicamente delimitar el paquete. En el marcador COD se
especifica de forma independiente si aparece o no cada uno de
estos marcadores, SOP y EPH.

\subsection{Progresiones}

Los paquetes de cada \emph{tile-part} aparecen según la progresión
indicada en el último marcador COD o POC leído antes del marcador
SOD, a partir del cual comienza la secuencia de paquetes.

Según la Parte 1 del estándar JPEG2000, existen 5 posibles
progresiones:

\begin{itemize}

\item \textbf{Progresión LRCP
(\emph{Layer-Resolution-Component-Position}):} \\
\\
para cada capa $l$\\
\hspace*{1cm} para cada resolución $r$\\
\hspace*{2cm} para cada componente $c$\\
\hspace*{3cm} para cada precinto $p$\\
\hspace*{4cm} incluir el paquete como $\zeta_{t,c,r,p,l}$\\
\\
Como la progresión puede cambiar de \emph{tile} a \emph{tile}, la
variable $t$ identifica el \emph{tile} al cual pertenece la
secuencia de paquetes. Esta progresión es una progresión en
calidad, de manera que hasta que no son leídos todos los paquetes
del \emph{tile}, para una cierta capa de calidad, no se pasa a la
siguiente capa. Un ejemplo de progresión en calidad puede verse en
la figura \ref{fig:progCalidad}.

\begin{figure}
  \begin{center}
    \includegraphics[width=\textwidth]{figuras/progCalidad}
    \caption{Ejemplo de progresión en calidad.}
    \label{fig:progCalidad}
  \end{center}
\end{figure}

\item \textbf{Progresión RLCP
(\emph{Resolution-Layer-Component-Position}):}\\
\\
para cada resolución $r$\\
\hspace*{1cm} para cada capa $l$\\
\hspace*{2cm} para cada componente $c$\\
\hspace*{3cm} para cada precinto $p$\\
\hspace*{4cm} incluir el paquete como $\zeta_{t,c,r,p,l}$\\
\\
Es una progresión en resolución, ya que se van procesando todos
los paquetes de una resolución a otra, desde la resolución menor
hasta la mayor, incluyendo todas las capas de calidad. Un ejemplo
de progresión en resolución puede verse en la figura
\ref{fig:progResolucion}.

\begin{figure}
  \begin{center}
    \includegraphics[width=\textwidth]{figuras/progResolucion}
    \caption{Ejemplo de progresión en resolución.}
    \label{fig:progResolucion}
  \end{center}
\end{figure}

\item \textbf{Progresión RPCL
(\emph{Resolution-Position-Component-Layer}):}\\
\\
para cada resolución $r$\\
\hspace*{1cm} para cada precinto $p$\\
\hspace*{2cm} para cada componente $c$\\
\hspace*{3cm} para cada capa $l$\\
\hspace*{4cm} incluir el paquete como $\zeta_{t,c,r,p,l}$\\
\\
Al igual que la anterior, ésta es una progresión en resolución
también. La diferencia con la anterior es que, en cada resolución,
aquí la lectura es de precinto a precinto, mientras que en la
anterior es por capas de calidad.

\item \textbf{Progresión PCRL
(\emph{Position-Component-Resolution-Layer}):}\\
\\
para cada precinto $p$\\
\hspace*{1cm} para cada componente $c$\\
\hspace*{2cm} para cada resolución $r$\\
\hspace*{3cm} para cada capa $l$\\
\hspace*{4cm} incluir el paquete como $\zeta_{t,c,r,p,l}$\\
\\
Esta es una progresión por posición, de forma que se va procesando
precinto a precinto, empezando por el situado en la esquina
superior izquierda hasta el situado en la esquina inferior
derecha. Un ejemplo de progresión por posición lo tenemos en la
figura \ref{fig:progPosicion}.

\begin{figure}
  \begin{center}
    \includegraphics[width=\textwidth]{figuras/progPosicion}
    \caption{Ejemplo de progresión en posición.}
    \label{fig:progPosicion}
  \end{center}
\end{figure}

\item \textbf{Progresión CPRL
(\emph{Component-Position-Resolution-Layer}):}\\
\\
para cada componente $c$\\
\hspace*{1cm} para cada precinto $p$\\
\hspace*{2cm} para cada resolución $r$\\
\hspace*{3cm} para cada capa $l$\\
\hspace*{4cm} incluir el paquete como $\zeta_{t,c,r,p,l}$\\
\\
La última progresión que admite el estándar es una progresión por
componente, de manera que hasta no haber leído y procesado todos
los paquetes de una componente, no se pasaría al siguiente. Un
ejemplo de progresión por componente lo podemos ver en la figura
\ref{fig:progComponente}.

\begin{figure}
  \begin{center}
    \includegraphics[width=\textwidth]{figuras/progComponente}
    \caption{Ejemplo de progresión por componente.}
    \label{fig:progComponente}
  \end{center}
\end{figure}

\end{itemize}

\section{Formato de los archivos JP2}
\label{sec:Formato_de_los_archivos_JP2}

El \emph{codestream} de una imagen podría ser perfectamente
almacenado directamente en un archivo, sin añadir nada más, y
funcionar como archivo de imagen, ya que el \emph{codestream}
posee toda la información necesaria para la reconstrucción de la
imagen. De hecho, los archivos .J2C son así, contienen un único
\emph{codestream}, sin más. No obstante, numerosas aplicaciones
necesitan añadir otro tipo de información útil, como por ejemplo
paletas de color, \emph{copyright}, etc. La Parte 1 del estándar
define un tipo de archivo, con extensión .JP2, que permite incluir
en un mismo fichero varios \emph{codestream} e información extra.

Los archivos JP2 están organizados en cajas (\emph{boxes}). La
estructura de una caja puede verse en la figura
\ref{fig:estructuraCaja}.

\begin{figure}
  \begin{center}
    \resizebox{!}{!}{\input{figuras/estructuraCaja}}
    \caption{Estructura de una caja JP2.}
    \label{fig:estructuraCaja}
  \end{center}
\end{figure}

Los primeros cuatro bytes de la caja contienen la longitud de la
misma, $L$, en forma de entero sin signo. Los siguientes cuatro
bytes forman una cadena de cuatro caracteres ASCII que contienen
el tipo de caja, $T$. Si $L = 1$, la longitud real de la caja
viene dada por los 8 bytes siguientes a $T$, que forman un entero
sin signo, $XL$. Si $T \neq 1$ entonces el parámetro $XL$ no
aparece. A continuación están los datos de la caja $C$. Si $L \neq
1$ la longitud de $C$ es $L - 8$. Si $L = 8$ la longitud de $C$ es
$XL - 16$.

Las cajas pueden contener a su vez otras cajas. Sabremos que una
caja contiene o no subcajas en función del tipo, $T$, de caja que
sea. Si una caja contiene subcajas, sólo puede contener subcajas,
es decir, no puede combinar cajas con otro tipo de datos.

Al igual que ocurría con los marcadores del \emph{codestream},
existen algunas cajas cuya presencia es obligatoria en el archivo
JP2. Estas cajas son: la caja \emph{JPEG2000 Signature}, que debe
ser única y cuyo cometido es únicamente marcar el comienzo del
archivo y detectar posibles errores de la transmisión; la caja
\emph{File type}, que posee la lista de formatos a los que
pertenece el archivo, ya que existen otros además del JP2; la caja
\emph{JP2 Header}, que contiene a su vez varias cajas con diversa
información relativa a la imagen, algunas de las cuales, resultan
un poco redundantes ya que la información que poseen se haya
también en el \emph{codestream}; la caja \emph{Contiguous
Code-stream box}, cuyo contenido es el \emph{codestream} de la
imagen. La organización de las cajas en un archivo JP2, así como
las posibles cajas existentes se reflejan en la figura
\ref{fig:cajasJP2}.

\begin{figure}
  \begin{center}
    \resizebox{\textwidth}{!}{\input{figuras/cajasJP2}}
    \caption{Cajas de un archivo JP2.}
    \label{fig:cajasJP2}
  \end{center}
\end{figure}
