% Activate the following line by filling in the right side. If for example the name of the root file is Main.tex, write
% "...root = Main.tex" if the chapter file is in the same directory, and "...root = ../Main.tex" if the chapter is in a subdirectory.
 
%!TEX root =  vision.tex

\chapter [Introducción] {Introducción}
\section{Creación de Imágenes}

El Puntillismo aparece por vez primera en 1884, encabezado por el pintor Neo - Impresionista Georges Seurat, y contando con entre sus más fieles seguidores tales como Henri- Edmond Cross y Vlaho Bokovac. Su procedimiento empleado por estos artistas, consistente en poner puntos de colores puros en vez de pinceladas sobre tela; logrará una técnica que fue el resultado de los estudios cromáticos llevados a cabo por Georges Seurat (1859 - 1891), pintor francés, quien en 1884 llegó a la división de tonos por la posición de toques de colores que, mirados a cierta distancia, crean en la retina las combinaciones deseadas [Wikipedia].

\begin{figure}[h!]
{\normalsize \centering
\centerline{\psfig{figure=figuras/capitulo1/parte_1_gr1.eps,width=8.0cm}} }
\caption{Imagen de puntos}
\label{fig:puntos}
\end{figure}


\subsection{Manejo de colores RGB}

Definimos un pixel como la unidad básica de una imagen. Es un punto en cuyo valor se almacena la información concerniente a los colores. Los colores básicos que manejaremos son Rojo, Verde y Azul. Así pixel lo podemos ver como un arreglo $P = [P_r, P_g, P_b]$

En la siguiente figura podemos ver el como se almacena la información concerniente a los 32 bit o 4 Bytes

\begin{figure}[h!]
{\normalsize \centering
\centerline{\psfig{figure=figuras/capitulo1/parte_1_gr2.eps,width=8.0cm}} }
\caption{Formato de 32 bits para manejo de color}
\label{fig:formato}
\end{figure}


Una imagen discreta, la podemos definir como un arreglo bidimensional en el cual se almacena la información de cada punto de la imagen \(256^3 = 16,777, 216 \) diferentes colores por pixel. Dado que la información se maneja en Bytes para almacenar un byte necesitaremos de 4 bytes, tres correspondientes a los colores Rojo, verde y Azul y un cuarto que tiene información del nivel de transparencia. En la cámaras es común hablar de su resolución en Megabytes, ¿Qué relación existe con esto?. Un megapixel (Mpx) equivale a 1 millón de píxeles, a diferencia de otras medidas usadas en la computación en donde se suele utilizar la base de 1024 para los prefijos, en lugar de 1000, debido a su conveniencia respecto del uso del sistema binario. Usualmente se utiliza esta unidad para expresar la resolución de imagen de cámaras digitales; por ejemplo, una cámara que puede tomar fotografías con una resolución de $2048 \times 1536$ píxeles se dice que tiene $3.1$ megapixeles ($2048 \times 1536 = 3.145.728$).

Para el caso de una imagen de $700 \times 525$ pixeles en tres colores almacenada sin compresión tendremos que el tamaño de la imagen será igual a $700 \times 525 \times 3 \approx 1.1$ MB (Mega Bites).

En Forma matricial podemos hacer una imagen con colores verdes si definimos, un arreglo bidimensional donde ponemos un vector de colores $\{$R,G,B$\}$ 

\[\left(
\begin{array}{cc}
 \left(
\begin{array}{c}
 0 \\
 255 \\
 0
\end{array}
\right) & \left(
\begin{array}{c}
 0 \\
 0 \\
 0
\end{array}
\right) \\
 \left(
\begin{array}{c}
 0 \\
 0 \\
 0
\end{array}
\right) & \left(
\begin{array}{c}
 0 \\
 255 \\
 0
\end{array}
\right)
\end{array}
\right)
\]

Para este ejemplo si nuestro arreglo de imagen se llama $A$ los colores almacenados en el renglón i columna j, la notación para referirnos a este punto es \(A_{i,j}\)

\subsection{La escala de gris}

En el caso de una imagen en tono de gris solamente se maneja una sola matriz de datos, así el color rojo será igual que el verde y el azul. La unión de los colores dará como resultado blanco y la ausencia dará negro. Nuestra imagen solamente tendrá colores que van desde el negro al blanco en 256 tonos diferentes.\\

\begin{figure}[h!]
{\normalsize \centering
\centerline{\psfig{figure=figuras/capitulo1/parte_1_gr3.eps,width=8.0cm}} }
\caption{Cubo de colores y escala de gris}
\label{fig:egris}
\end{figure}
)

Utilizando imágenes en tono de gris, solamente será necesario almacenar la información concerniente a un canal de color, o un promedio de los tres canales de color. Esto reduce en 1/3 la información que debe ser almacenada.

\subsection{Formato PPM para imágenes}

Actualmente existen una infinidad de formatos para almacenamiento de imágenes. Los formatos más populares como el JPEG realizan la compresión de la imagen con perdida de información. Uno de los formatos mas simples es el Portable Pixel Map (PPM  por sus siglas en ingles)  y a continuación se muestra un ejemplo de este archivo.

\begin{verbatim} 
	P3
	# P3 significa que los colores están en ASCII
	# 3 columnas
	# 2 renglones
	# 255 para el color maximo
	# El archivo termina con 6 tripletas RGB (18 valores enteros en ASCII)
	3 2
	255
	255 0 128 32 255 0 64 32 255 25 55 10 255 11 5 0 0 0
\end{verbatim}

La simpleza del formato PPM permite entender la información que se almacena en forma directa y  escribir un código relativamente simple para escribir imágenes en este formato. Si escribimos en un archivo de texto lo mostrado en en las instrucciones anteriores, le damos la extensión PPM al archivo, tendremos una imagen con 6 píxeles a colores.

\subsection{Interfase para desplegar imágenes en Java.}

Ver Algoritmos y ejemplos en la página. ver inicial.java

\section{ Operadores Sobre imágenes}

\subsection{Operadores puntuales sobre Imágenes}

Una imagen discreta, la podemos definir como un arreglo bidimensional en el cual se almacena la información de cada punto de la imagen. Como definimos en la sección anterior cada unidad es un pixel y en el caso de operadores puntuales consideraremos que cada uno de estos se aplica sobre cada pixel de la imagen.

\subsubsection{Linea Recta}

Dada la imagen que se muestra en la figura \ref{fig:lena_a} y su histograma \ref{fig:lena_h} en tono de gris, podemos calcular una transformación lineal que nos permita cambiar el contraste de la imagen. 

\begin{figure}[h!]
\begin{center}
\subfigure[Imagen original \label{fig:lena_a}]{\psfig{figure=figuras/lena.eps,width=3.0cm}} 
\subfigure[Histograma \label{fig:lena_h}]{\psfig{figure=figuras/capitulo1/lena_histo.eps,width=3.0cm}} 
\label{fig:lena} 
\end{center}
\caption{Imagen original de Lena y su histograma en tono de gris}
\end{figure}

Consideremos el caso de la ecuación de una línea recta $y = mx + b$ donde $m$ es la pendiente y $b$ el cruce por cero. 
\[
g_{i,j}=(f_{i,j}-f_{min})*(g_{max}-g_{min})/(f_{max}- f_{min})+g_{min};
\]
donde el rango dinámico de la imagen dada es $f_{min} = 0$ y $f_{max} = 255$ y el rango de la nueva imagen es $g_{min}$ y $g_{max}$ los cuales fijaremos en el rango [10, 50]. La ecuación resultante es
\[
g_{i,j}= \frac{8 }{ 51} f_{i,j}+ 10
\]
\[
\forall <i,j> \in \Omega
\]


Así para una imagen dadas estas condiciones podemos cambiar la apariencia haciendo una proyección del espacio original de la imagen a un nuevo espacio dado por una línea recta. El resultado de la aplicación a cada punto se presenta en la figura \ref{fig:lena2}. En la figura \ref{fig:lena_nh} podemos ver como la aplicación de este operador reduce el rango dinámico de la imagen reduciendo el rango del histograma en la misma medida.

\begin{figure}[h!]
\begin{center}
\subfigure[Imagen o \label{fig:lena_n}]{\psfig{figure=figuras/capitulo1/lena_n.eps,width=3.0cm}} 
\subfigure[Histograma \label{fig:lena_nh}]{\psfig{figure=figuras/capitulo1/lena_n_histo.eps,width=3.0cm}} 
\label{fig:lena2} 
\end{center}
\caption{Imagen de Lena modificada y su histograma en tono de gris}
\end{figure}

En el caso de una imagen con mayor información esta lucirá como:

\subsubsection{Cambio de color a tono de Gris}

Otro ejemplo de operadores puntuales sobre imágenes es la conversión de colores RGB a escala de gris. Así para convertir la imagen a colores a tono de gris, simplemente sacamos el promedio de cada uno de los pixeles en la 3 bandas aplicando la operación\\
\\
\(\left.\left.A_{i,j}=\left(R_{i,j}+\right.G_{i,j}+B_{i,j}\right)\right/3\)\\
\\
Con esta operación tendremos una sola matriz con el promedio de los colores y cuando se crea la imagen a color las matrices R, G, B serán iguales a la matriz A.

\subsubsection{Función Sigmoide}

Otra manera de hacer esto es considerar una función diferente como la sigmoide, definida como 

\[
y = \frac{1}{1+e^{-\beta x}}
\]

\noindent
donde $\beta$ es un parámetro que controla la pendiente del escalón. Para hacer la aplicación de la función sigmoide, será necesario hacer un cambio al rango $[-1,1]$ de la imagen original ya que el dominio y rango de la función sigmoide es $[-\infty, \infty]$ y $[0,1]$ respectivamente.

Como luce una imagen en estas condiciones. En la figura \ref{fig:lena3}, podemos ver la aplicación de la función sigmoide con $\beta = 100$  a la imagen original en la figura \ref{fig:lena_a}. En esta figura podemos ver la, la imagen procesada, el histogramas  de la imagen y la gráfica de la sigmoide aplicada.

\begin{figure}[h!]
\begin{center}
\subfigure[Imagen o \label{fig:lena_sig}]{\psfig{figure=figuras/capitulo1/lena_sig.eps,width=3.0cm}} 
\subfigure[Histograma \label{fig:lena_sig_histo}]{\psfig{figure=figuras/capitulo1/lena_sig_histo.eps,width=3.0cm}} 
\subfigure[Sigmoide con $\beta = 100$\label{fig:sig_histo}]{\psfig{figure=figuras/capitulo1/sig.eps,width=3.0cm}} 
\label{fig:lena3} 
\end{center}
\caption{Imagen de Lena modificada por la función sigmoide }
\end{figure}

\subsection{Operadores de Ventana sobre imágenes}

El objetivo de un operador de ventana es reemplazar el valor de un pixel, por el contenido pesado en una ventana al rededor de esta. Así por ejemplo:
 
 \[
 I_{i,j}= \sum_{k=i-nk}^{i+nk}\sum_{l=j-nk}^{j+nk} w_{k,l} I_{k,l.}
 \]

donde $w_{k,l}$ es un peso que puede tener varios valores con lo cual tenemos una posibilidad casi infinita de operadores. En la figura \ref{fig:lena4} tenemos un operador correspondiente a la media, donde cada uno de los pixeles es reemplazado por el promedio en una ventana de tamaño $(2n_k +1)\times (2n_k+1)$ y con $w_{k,l} = \frac{1}{(2n_k +1)^2}$.

\begin{figure}[h!]
{\normalsize \centering
\centerline{\psfig{figure=figuras/capitulo1/lena_med.eps,width=5.0cm}} }
\caption{Lena aplicando un operador de ventana que simula la media}
\label{fig:lena4}
\end{figure}

\section{Transformaciones Geométricas}
En esta sección básicamente analizaremos dos transformaciones geométricas en imágenes. Estas son la transformación Afín y la transformación proyectiva.

\subsection{Transformación Afín }

Una transformación afín es una transformación geométrica que esta constituida por translación, escalamiento, rotación y cizallamiento. Cada una de esas transformaciones es una transformación afín y se explican a continuación.

\subsubsection{Traslación}

Una translación la podemos hacer simplemente asumiendo que las nuevas coordenadas $\hat{x}=x+t_x$ $\hat{y}=y+t_y$ les sumamos un valor $t_x$ o $t_y$ según corresponda. En coordenadas homogéneas queda como

\[
\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y} \\
 1
\end{array}
\right)=\left(
\begin{array}{ccc}
 1 & 0 & t_x \\
 0 & 1 & t_y \\
 0 & 0 & 1
\end{array}
\right)\left(
\begin{array}{c}
 x \\
 y \\
 1
\end{array}
\right)
\]

La Figura \ref{fig:traslacion} muestra un ejemplo de una translación de un cuadro de color azul y el resultado del cuadro trasladado en color rojo. En este caso se aplico una translación dada por la ecuación \eqref{eq:traslacion}.

\begin{equation}
T =
\left(
\begin{array}{ccc}
 1 & 0 & 3 \\
 0 & 1 & 2 \\
 0 & 0 & 1
\end{array}
\right)
\label{eq:traslacion}
\end{equation}


\begin{figure}
	\centering
	\includegraphics[width=40mm]{figuras/capitulo1/traslacion.jpg}
	\caption{Aplicación de una translación a un cuadro}
	\label{fig:traslacion}
\end{figure}

\subsubsection{Escalamiento}

El escalamiento pude entenderse como hacer que una figura geométrica cambie su tamaño o cambie su escala. Un escalamiento en $x$ lo podemos representar por como $\hat{x}=x ~ s_x$ y en y como $\hat{y}=y ~ s_y$. En coordenadas homogéneas se pude expresar como


\[
\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y} \\
 1
\end{array}
\right) = \left(
\begin{array}{ccc}
 s_x & 0 & 0 \\
 0 & s_y & 0 \\
 0 & 0 & 1
\end{array}
\right) 
\left(
\begin{array}{c}
 x \\
 y \\
 1
\end{array}
\right)
\]

La Figura \ref{fig:escalamiento} muestra un ejemplo de la aplicación de un escalamiento a un cuadro de color azul y el resultado del cuadro escalado en color rojo. En este caso se aplicó un escalamiento dada por la ecuación \eqref{eq:escalamiento}.

\begin{equation}
S =
\left(
\begin{array}{ccc}
 3 & 0 & 0 \\
 0 & 2 & 0 \\
 0 & 0 & 1
\end{array}
\right)
\label{eq:escalamiento}
\end{equation}

\begin{figure}
	\centering
	\includegraphics[width=40mm]{figuras/capitulo1/Escalamiento.jpg}
	\caption{Aplicación de un escalamiento a un cuadro}
	\label{fig:escalamiento}
\end{figure}

\subsubsection{Rotación}

Consideremos el caso de un punto que rota respecto a un punto fijo tal como se muestra en la Figura \ref{fig:lrota}. Las coordenadas $x$ y $y$,  en forma polar las podemos obtener como $x=r ~\cos(\alpha)$ y $y=r ~\sin(\alpha)$. Si consideramos que esta gira un ángulo $\theta $ entonces podemos representar esta rotación en forma polar como

\begin{figure}
	\centering
	\includegraphics[width=50mm]{figuras/capitulo1/lineas_rotadas.jpg}
	\caption{Coordenadas $x,y$ girada un ángulo $\theta$}
	\label{fig:lrota}
\end{figure}

\[
\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y}
\end{array}
\right)=\left(
\begin{array}{c}
 r ~ \cos (\alpha + \theta  ) \\
 r ~ \sin (\alpha + \theta  )
\end{array}
\right)=\left(
\begin{array}{c}
 r ~ \cos (\alpha ) \cos (\theta )-r ~ \sin (\alpha ) \sin (\theta ) \\
 r ~ \cos (\alpha )\sin (\theta )+ r  ~ \sin (\alpha )\cos (\theta )
\end{array}
\right)
\]

\[
\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y}
\end{array}
\right)=\left(
\begin{array}{c}
 x ~ \cos (\theta)-y ~ \sin (\theta ) \\
 x ~\sin (\theta)+ y~ \cos (\theta )
\end{array}
\right)
\]

\noindent Una transformación de rotación puede ser definida  como 

\[
\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y}
\end{array}
\right)=\left(
\begin{array}{cc}
 \cos (\theta)  & -\sin (\theta ) \\
 \sin (\theta ) & \cos (\theta )
\end{array}
\right)\left(
\begin{array}{c}
 x\text{  } \\
 y
\end{array}
\right)
\]

\noindent y en coordenadas homogéneas puede representarse como

\[
\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y} \\
 1
\end{array}
\right) = 
\left(
\begin{array}{ccc}
 cos(\theta) & -sin(\theta) & 0 \\
 sin(\theta) & cos(\theta) & 0 \\
 0 & 0 & 1
\end{array}
\right)
\left(
\begin{array}{c}
x \\
 y \\
 1
\end{array}
\right)
\]

\[
R (\theta) = 
\left(
\begin{array}{ccc}
 cos(\theta) & -sin(\theta) & 0 \\
 sin(\theta) & cos(\theta) & 0 \\
 0 & 0 & 1
\end{array}
\right)
\]

La Figura \ref{fig:rotacion} muestra un ejemplo de la aplicación de una rotación de 45 grados ($\pi/4$ rad) a un cuadro de color azul y el resultado del cuadro rotado en color rojo. En este caso se aplicó una matriz de rotación dada por la ecuación \eqref{eq:rotacion}.

\begin{equation}
R (\pi/4)=
\left(
\begin{array}{ccc}
 \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} & 0 \\
 \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & 0 \\
 0 & 0 & 1
\end{array}
\right)
\label{eq:rotacion}
\end{equation}

\begin{figure}
	\centering
	\includegraphics[width=40mm]{figuras/capitulo1/rotacion.jpg}
	\caption{Aplicación de una rotación a un cuadro}
	\label{fig:rotacion}
\end{figure}

\subsubsection{ Cizallamiento}

El cizallamiento es una transformación dada por la matriz, donde $c_x$ es el ángulo de cizallamiento respecto al eje $x$.

\[
C_x =
\left(
\begin{array}{ccc}
 1 & tg (c_x )& 0 \\
 0 & 1 & 0 \\
 0 & 0 & 1
\end{array}
\right)
\]


\noindent En caso de querer aplicar el cizallamiento en la dirección y, la matriz de transformación será.

\[
C_y =
 \left(
\begin{array}{ccc}
 1 & 0 & 0 \\
 tg(c_y )& 1 & 0 \\
 0 & 0 & 1
\end{array}
\right)
\]

La Figura \ref{fig:cizallamiento} muestra un ejemplo de la aplicación de un cizallamiento de 45 grados ($\pi/4$ rad.) en la dirección de $x$ a un cuadro de color azul y el resultado del cuadro cizallado en color rojo. En este caso se aplicó un cizallamiento dado por la ecuación \eqref{eq:cizallamiento}.

\begin{equation}
C_x =
\left(
\begin{array}{ccc}
 1 & 1 & 0 \\
 0 & 1 & 0 \\
 0 & 0 & 1
\end{array}
\right)
\label{eq:cizallamiento}
\end{equation}

\begin{figure}
	\centering
	\includegraphics[width=40mm]{figuras/capitulo1/cizallamiento.jpg}
	\caption{Aplicación de un cizallamiento a un cuadro}
	\label{fig:cizallamiento}
\end{figure}

Una vez que unimos todas las transformaciones tenemos una composición dada por una Rotación $R$, un escalamiento $S$, un Cizallamiento $C$ y una Translación $T$. Al conjunto de estas operaciones se le conoce como transformación afín.


\[
T_{afin} = \left(
\begin{array}{ccc}
 s_x \text{ } cos (\theta) & -s_y \text{ } sin(\theta) + s_x \text{ } cos(\theta) \text{ } tan(c_x) & t_x \\
 s_x \text{ } sin(\theta) & s_y \text{ } cos(\theta)+ s_x \text{ } sin(\theta) \text{ } tan(c_x) & t_y \\
 0 & 0 & 1
\end{array}
\right)
\]

\subsection{Interpolación.}

Todas las transformaciones aplicadas anteriormente son para un punto en el espacio de coordenadas $[x,y]$, pero qué sucede cuando hablamos de imágenes. Una imagen esta compuesta de colores en una posición con coordenadas enteras $[n,m]$. Si aplicamos una transformación afín las coordenadas enteras pasaran a ser coordenadas en números reales. 


\subsubsection{Interpolación en 1 dimensión}

La Figura \ref{fig:interpola} muestra el ejemplo con una señal en el intervalo $[1,2]$ donde $f(1)= 1.7$ y $f(2) = 3.5$ y queremos encontrar los valores para una $f(1.378)$. Para nuestros propósito suponemos que $n\in \mathbb{N}$  es un número entero y dado que no tenemos ninguna información a priori los puntos entre $1.0 < x < 2.0$ tiene un comportamiento lineal tal como se muestra en la Figura \ref{fig:interpola}.

\begin{figure}
	\centering
	\includegraphics[width=80mm]{figuras/capitulo1/Interpola.jpg}
	\caption{Interpolación lineal en una dimensión}
	\label{fig:interpola}
\end{figure}

Utilizando la ecuación de la línea recta tenemos dos puntos $P_1 = [n, f(n)]$ y $P_2 = [n+1, f(n+1)]$, la ecuación de la linea recta esta dada por

\begin{equation*}
	f(x) - f(n) = \frac{f(n+1) - f(n)}{n+1 -n} (x - n) 
\end{equation*}

Considerando que $x=  n + \alpha$ tenemos

\begin{equation*}
	\begin{array}{c}
	f(x) - f(n) = (f(n+1) - f(n)) \alpha  \\
	\\
	f(x) = f(n+1)  \alpha + f(n) (1- \alpha)
	\end{array}
\end{equation*}

Para el ejemplo $x = 1.378$, tenemos $n=1$ y $\alpha = 0.378$ por lo tanto $f(1.378) = f(1) (1-\alpha) + f(2) \alpha = 1.7 \times (1-0.378) + 3.5 \times 0.378 = 2.3804$, 


\subsubsection{Interpolación en 2 dimensiones}

Para realizar la interpolación en dos dimensiones hacemos la aplicación de una interpolación en cada una de la dimensiones $x$ y $y$. Para este caso tenemos cuatro puntos $P_1 = [n, m, f(n,m)]$, $P_2 = [n, m+1, f(n, m+1)]$  $P_3 = [n+1, m, f(n+1,m)]$ y $P_4 = [n+1, m+1, f(n+1,m+1)]$.

Vamos a suponer que tenemos que calcular el valor de la función en dos dimensiones $f(u,v)$ donde $u\in \mathbb{R}$ y $v\in \mathbb{R}$  entonces tenemos un valor $u = n+ \alpha$ y $v = m + \beta$ donde $n \in \mathbb{N}$ y $m \in \mathbb{N}$ y podemos escribir:

\begin{equation*}
	\begin{array}{c}
		f(u, m) = f(n, m) (1- \alpha) + f(n+1, m)  \alpha  \\
		\\
		f(u, m+1) = f(n, m+1) (1- \alpha) + f(n+1, m+1)  \alpha  \\
	\end{array}
\end{equation*}

y finalmente

\begin{equation*}
	f(u, v)  =  f(u, m) (1- \beta) + f(u, m+1)  \beta
\end{equation*}

\begin{equation*}
\begin{array}{c}
	f(u, v)  =  f(n, m) (1- \alpha) (1- \beta) + f(n+1, m)  \alpha  (1- \beta) \\
	+ f(n, m+1) (1- \alpha)  \beta+ f(n+1, m+1)  \alpha  \beta
\end{array}
\end{equation*}

\(\\
\)La función de interpolación bilineal en Java es\\
\\
\texttt{  { }static public double bilineal(double f[][], double x0, double y0)\\
\hspace*{1.ex} $\{$\\
\hspace*{2.ex} int ii, jj, nr, nc;\\
\hspace*{2.ex} double a, b, y;\\
\\
\hspace*{2.ex} ii = (int) y0;\\
\hspace*{2.ex} jj = (int) x0;\\
\\
\hspace*{2.ex} a = y0 - ii;\\
\hspace*{2.ex} b = x0 - jj;\\
\\
\hspace*{2.ex} nr = f.length;\\
\hspace*{2.ex} nc = f[0].length;\\
\\
\hspace*{2.ex} if (ii $<$ 0 $||$ jj $<$ 0 $||$ ii $>$ nr - 2 $||$ jj $>$ nc - 2)\\
\hspace*{3.ex} return 0;\\
\hspace*{2.ex} if ( (a == 0) $\&\&$ (b == 0))\\
\hspace*{3.ex} return f[ii][jj];\\
\\
\hspace*{2.ex} if (ii == nr - 1 $\&\&$ jj == nc - 1)\\
\hspace*{3.ex} return f[ii][jj];\\
\\
\hspace*{2.ex} if (b == 0 $||$ jj == nc - 1) $\{$\\
\hspace*{3.ex} y = (1 - a) * f[ii][jj] + a * f[ii + 1][jj];\\
\hspace*{3.ex} return y;\\
\hspace*{2.ex} $\}$\\
\\
\hspace*{2.ex} if (a == 0 $||$ ii == nr - 1) $\{$\\
\hspace*{3.ex} y = (1 - b) * f[ii][jj] + b * f[ii][jj + 1];\\
\hspace*{3.ex} return y;\\
\hspace*{2.ex} $\}$\\
\\
\hspace*{2.ex} y = (1 - a) * (1 - b) * f[ii][jj] + (1 - a) * b * f[ii][jj + 1] +\\
\hspace*{4.ex} a * (1 - b) * f[ii + 1][jj] + a * b * f[ii + 1][jj + 1];\\
\hspace*{2.ex} return y;\\
\hspace*{1.ex} $\}$\\
}

\subsection{Problemas con la transformación Afín}

Para una imagen origen $I_1$  las coordenadas del renglón $r$ y la columna $c$ son números enteros. Al aplicar una transformación $T$ dará como resultado coordenadas en el renglón $r_n$ y columna $c_n$ que son números reales y deben ser asignadas a coordenadas enteras en la imagen destino $I_2$. La Figura \ref{fig:T1} muestra este problema donde el punto en coordenadas $r=2$ y $c = 2$ de la imagen $I1$, para una cierta transformación  $T$, corresponde al punto $r_n= 3.7$ y $c_n = 2.5$ de la imagen $I2$. Esto significa que tenemos que poner el color en el pixel de la imagen origen $I_1[2,2]$ en un pixel que no existe en la imagen destino $I_2[3.7, 2.5]$. Una manera de resolver el problema es truncar las coordenadas aplicando la operación piso y entonces hacer $I_2[\lfloor 3.7\rfloor, \lfloor 2.5\rfloor] = I_2[3,2] \equiv I_1[2,2]$.

\begin{figure}
	\centering
	\includegraphics[width=15cm]{figuras/capitulo1/T1.jpg}
	\caption{Puntos correspondientes en imágenes $I_1$ e $I_2$}
	\label{fig:T1}
\end{figure}

Consideremos el caso de una matriz de rotación dada por:

\[
R = \left(
\begin{array}{ccc}
 0.951057 & -0.309017 & 0. \\
 0.309017 & 0.951057 & 0. \\
 0. & 0. & 1.
\end{array}
\right)
\]

\noindent y las coordenadas las podemos calcular 

\[
\left[
\begin{array}{c}
c_n \\
r_n 
\end{array}
\right] = 
 \left[
\begin{array}{ccc}
 0.951057 & -0.309017 & 0. \\
 0.309017 & 0.951057 & 0. 
\end{array}
\right]
\left[
\begin{array}{c}
c \\
r 
\end{array}
\right]
\]


\noindent  de acuerdo con lo expuesto al aplicar la transformación, para cada uno de los puntos de la imagen origen $I_1$ tendrán su equivalente en $I_2$. Todo esto se puede realizar mediante el siguiente código y la imagen destino $I_2$ resultante se muestra en la Figura  \ref{fig:lena5}. Note los puntos negros en la Fig. \ref{fig:lena5}, generados por el truncamiento. 

\texttt{  \\
\\
\hspace*{3.5ex} for(r=0; r$<$Nr; r++)\\
\hspace*{6.ex} for(c=0; c$<$Nc; c++) $\{$\\
\hspace*{10.ex} cn = T[0]*c + T[1] * c + T[2]; \\
\hspace*{10.ex} rn = T[3]*c + T[4]*c + T[5];\\
\hspace*{10.ex} \\
\hspace*{10.ex} I2[(int) rn][(int) cn] = I1[i][j];\\
\hspace*{6.ex} $\}$\\
}

\begin{figure}[h!]
{\normalsize \centering
\centerline{\psfig{figure=figuras/capitulo1/parte_1_gr4.eps,width=5.0cm}} }
\caption{Lena aplicando una transformación de rotación $R(18^\circ)$}
\label{fig:lena5}
\end{figure}

¿Cómo corregir este efecto?.  Una manera de hacerlo es en lugar de barrer todos los puntos de la imagen origen $I_1$, barreremos todos los puntos de la imagen destino $I_2$ y las coordenadas correspondientes en la imagen origen las calculamos utilizando la transformación inversa. Las coordenadas nuevas que no sean enteras las redondearemos como el piso de los valores reales $ I_2[r,c] \equiv   I_1[\lfloor r_n \rfloor, \lfloor c_n \rfloor]$. En la Figura \ref{fig:T2} se muestra un ejemplo de cómo las coordenadas enteras en la imagen destino $I2$ vienen de unas coordenadas reales en la imagen origen $I_1$.


\begin{figure}
	\centering
	\includegraphics[width=15cm]{figuras/capitulo1/T2.jpg}
	\caption{Puntos correspondientes en imágenes $I_1$ e $I_2$ aplicando la transformación inversa}
	\label{fig:T2}
\end{figure}

El código para hacer esto es el que se muestra a continuación.


\texttt{  \\
\\
\hspace*{3.5ex} for(r=0; r$<$Nr; r++)\\
\hspace*{6.ex} for(c=0; c$<$Nc; c++) $\{$\\
\hspace*{10.ex} cn = Tinv[0]*c + Tinv[1]*c + Tinv[2]; \\
\hspace*{10.ex} rn = Tinv[3]*c + Tinv[4]*c + Tinv[5];\\
\hspace*{10.ex} \\
\hspace*{8.ex} \\
\hspace*{10.ex} I2[r][c] = I2[rn][cn] \\
\hspace*{6.ex} $\}$\\
}

El código para la transformación afín resume todo lo antes dicho agregando la interpolación bilineal para evitar hacer el truncamiento de las coordenadas. Este código se muestra a continuación:

\texttt{  static public void afin(double f[][], double g[][], double T[])\\
$\{$\\
\hspace*{2.ex} int r, c, Nr, Nc;\\
\\
\hspace*{2.ex} double rn, cn;\\
\\
\hspace*{2.ex} Nr = f.length;\\
\hspace*{2.ex} Nc = f[0].length;\\
\\
\\
\hspace*{2.ex} for (r = 0; r $<$ Nr; r++)\\
\hspace*{3.ex} for (c = 0; c $<$ Nc; c++) $\{$ \\
\\
\hspace*{4.ex} cn = T[0]*c { }+ T[1]*r { }+ T[2];\\
\hspace*{4.ex} rn = T[3]*c { }+ T[4]*r { }+ T[5];\\
\hspace*{4.ex} I2[r][n] = bilineal(I1, cn, rn);\\
\\
\hspace*{3.ex} $\}$\\
\hspace*{1.ex} $\}$\\
\hspace*{1.ex} \\
\hspace*{1.ex} \\
}

La Figura \ref{fig:difT} podemos ver la diferencia entre la aplicación de la transformación inversa con interpolación \ref{fig:difT} (a) y la aplicación de la transformación directa \ref{fig:difT} (b).

\begin{figure}[h!]
\begin{center} 
\subfigure[Aplicando $R(-18 ^\circ)$ ]{\psfig{figure=figuras/capitulo1/parte_1_gr5.eps,width=5.0cm}} 
\hfill
\subfigure[Aplicando $R(18 ^\circ)$  ]{\psfig{figure=figuras/capitulo1/parte_1_gr6.eps,width=5.0cm}} 
\end{center}
\caption{Transformación Afín. (a) Aplicando transformación inversa e interpolación. (b) aplicando la transformacion directa} \label{fig:difT}
\end{figure}

\subsubsection{Ejemplo}

Considere una imagen $I_1$ dada como

\begin{equation*}
I_1 = 
\left [
\begin{array}{cccccc}
	1 & 2 & 3 & 4 & 5 & 6 \\
	7 & 8 & 9 & 10 & 11 & 12 \\
	13 & 14 & 15 & 16 & 17 & 18 \\
	19 & 20 & 21 & 22 & 23 & 24 
\end{array}
\right ]
\end{equation*}

\noindent y la Transformación 

\begin{equation*}
T = 
\left[
\begin{array}{ccc}
\frac{3}{2} & 0 & 0 \\
0 & \frac{3}{2} & 0 \\
0 & 0 & 1
\end{array}
\right]
~
T^{-1} = 
\left[
\begin{array}{ccc}
\frac{2}{3} & 0 & 0 \\
0 & \frac{2}{3} & 0 \\
0 & 0 & 1
\end{array}
\right]
\end{equation*}

Vamos a Determinar la imagen $I_2$ considerando la transformación $T$ y como referencia los puntos de la Imagen $I_1$. Para este caso tenemos los resultados en la Tabla \ref{tab:ref1}.

\begin{table}[H] 
\begin{center}
\caption{Puntos calculados con la transformación $T$ y con referencia en la imagen $I_1$}
\label{tab:ref1}
\begin{tabular}{ccccc}
$r$ & $c$ & $r_n$ & $c_n$ & $I_2(\lfloor r_n \rfloor, \lfloor c_n \rfloor) = I_1(r,c)$\\
\hline
0 & 0 & 0.000000 & 0.000000 & $I_2(0,0)= I_1(0, 0)$ \\
 0 & 1 & 0.000000 & 1.500000 & $I_2(0,1)= I_1(0, 1)$ \\
 0 & 2 & 0.000000 & 3.000000 & $I_2(0,3)= I_1(0, 2) $\\
 0 & 3 & 0.000000 & 4.500000 & $I_2(0,4)= I_1(0, 3)$ \\
 0 & 4 & 0.000000 & 6.000000 & $I_2(0,6)= I_1(0, 4)$ \\
 0 & 5 & 0.000000 & 7.500000 & $I_2(0,7)= I_1(0, 5)$ \\
 \hline
 1 & 0 & 1.500000 & 0.000000 & $I_2(1,0)= I_1(1, 0)$ \\
 1 & 1 & 1.500000 & 1.500000 & $I_2(1,1)= I_1(1, 1)$ \\
 1 & 2 & 1.500000 & 3.000000 & $I_2(1,3)= I_1(1, 2)$ \\
 1 & 3 & 1.500000 & 4.500000 & $I_2(1,4)= I_1(1, 3)$ \\
 1 & 4 & 1.500000 & 6.000000 & $I_2(1,6)= I_1(1, 4)$ \\
 1 & 5 & 1.500000 & 7.500000 & $I_2(1,7)= I_1(1, 5)$ \\
 \hline
 2 & 0 & 3.000000 & 0.000000 & $I_2(3,0)= I_1(2, 0)$ \\
 2 & 1 & 3.000000 & 1.500000 & $I_2(3,1)= I_1(2, 1)$ \\
 2 & 2 & 3.000000 & 3.000000 & $I_2(3,3)= I_1(2, 2)$ \\
 2 & 3 & 3.000000 & 4.500000 & $I_2(3,4)= I_1(2, 3)$ \\
 2 & 4 & 3.000000 & 6.000000 & $I_2(3,6)= I_1(2, 4)$ \\
 2 & 5 & 3.000000 & 7.500000 & $I_2(3,7)= I_1(2, 5)$ \\
 \hline
 3 & 0 & 4.500000 & 0.000000 & $I_2(4,0)= I_1(3, 0)$ \\
 3 & 1 & 4.500000 & 1.500000 & $I_2(4,1)= I_1(3, 1)$ \\
 3 & 2 & 4.500000 & 3.000000 & $I_2(4,3)= I_1(3, 2)$ \\
 3 & 3 & 4.500000 & 4.500000 & $I_2(4,4)= I_1(3, 3)$ \\
 3 & 4 & 4.500000 & 6.000000 & $I_2(4,6)= I_1(3, 4)$ \\
 3 & 5 & 4.500000 & 7.500000 & $I_2(4,7)= I_1(3, 5)$ \\
 \end{tabular}
\end{center}
\end{table}

Ahora vamos a Determinar la imagen $I_2$ considerando la transformación $T^{-1}$ y como referencia los puntos de la Imagen $I_2$. Para este caso las coordenadas quedan como \ref{tab:ref2}.

\begin{table}[H] 
\begin{center}
\caption{Puntos calculados con la transformación inversa y con referencia en la imagen 2}
\label{tab:ref2}
\begin{tabular}{ccccc}
$r$ & $c$ & $r_n$ & $c_n$ & $ I_2(r,c) = I_1(\lfloor r_n \rfloor, \lfloor c_n \rfloor) $\\
\hline
0 & 0 & 0.000000 & 0.000000 & $I_2(0,0)= I_1(0, 0)$ \\
 0 & 1 & 0.666667 & 0.000000 & $I_2(0,1)= I_1(0, 0)$ \\
 0 & 2 & 1.333334 & 0.000000 & $I_2(0,2)= I_1(1, 0)$ \\
 0 & 3 & 2.000001 & 0.000000 & $I_2(0,3)= I_1(2, 0)$ \\
 0 & 4 & 2.666668 & 0.000000 & $I_2(0,4)= I_1(2, 0)$ \\
 0 & 5 & 3.333335 & 0.000000 & $I_2(0,5)= I_1(3, 0) $\\
 \hline
 1 & 0 & 0.000000 & 0.666667 & $I_2(1,0)= I_1(0, 0)$ \\
 1 & 1 & 0.666667 & 0.666667 & $I_2(1,1)= I_1(0, 0)$ \\
 1 & 2 & 1.333334 & 0.666667 & $I_2(1,2)= I_1(1, 0)$ \\
 1 & 3 & 2.000001 & 0.666667 & $I_2(1,3)= I_1(2, 0)$ \\
 1 & 4 & 2.666668 & 0.666667 & $I_2(1,4)= I_1(2, 0)$ \\
 1 & 5 & 3.333335 & 0.666667 & $I_2(1,5)= I_1(3, 0)$ \\
 \hline
 2 & 0 & 0.000000 & 1.333334 & $I_2(2,0)= I_1(0, 1)$ \\
 2 & 1 & 0.666667 & 1.333334 & $I_2(2,1)= I_1(0, 1)$ \\
 2 & 2 & 1.333334 & 1.333334 & $I_2(2,2)= I_1(1, 1)$ \\
 2 & 3 & 2.000001 & 1.333334 & $I_2(2,3)= I_1(2, 1)$\\
 2 & 4 & 2.666668 & 1.333334 & $I_2(2,4)= I_1(2, 1)$ \\
 2 & 5 & 3.333335 & 1.333334 & $I_2(2,5)= I_1(3, 1)$ \\
 \hline
 3 & 0 & 0.000000 & 2.000001 & $I_2(3,0)= I_1(0, 2)$ \\
 3 & 1 & 0.666667 & 2.000001 & $I_2(3,1)= I_1(0, 2)$ \\
 3 & 2 & 1.333334 & 2.000001 & $I_2(3,2)= I_1(1, 2)$ \\
 3 & 3 & 2.000001 & 2.000001 & $I_2(3,3)= I_1(2, 2)$ \\
 3 & 4 & 2.666668 & 2.000001 & $I_2(3,4)= I_1(2, 2)$ \\
 3 & 5 & 3.333335 & 2.000001 & $I_2(3,5)= I_1(3, 2)$ \\
\end{tabular}
\end{center}
\end{table}

Finalmente en cada uno de los casos la imagen $I_2$ para los tres casos queda como:

\begin{equation*}
	\begin{array}{cc}
	      \text{Referencia} & I_2 \\
	      \hline
	       I_1 \text{ con } T &  \left[
		\begin{array}{cccccc}
			1.0000 & 2.0000 &  0.0000 &  3.0000 &  4.0000 &  0.0000\\
			7.0000 & 8.0000  & 0.0000 &  9.0000 & 10.0000 &  0.0000\\
			0.0000 & 0.0000 & 0.0000 & 0.0000 & 0.0000 & 0.0000 \\
			13.0000 &14.0000 & 0.0000 &15.0000 &16.0000 & 0.0000 		
		\end{array} \right] \\ 
		\\
	       I_2 \text{ con } T^{-1} & \left[
		\begin{array}{cccccc}
			1.0000 & 1.0000 &  7.0000 & 13.0000 & 13.0000 & 19.0000 \\
			1.0000 & 1.0000 &  7.0000 & 13.0000 & 13.0000 & 19.0000 \\
			2.0000 &  2.0000 &  8.0000 & 14.0000 & 14.0000 & 20.0000 \\
			3.0000 &  3.0000 &  9.0000 & 15.0000 & 15.0000 & 21.0000 		
		\end{array} \right]\\ 
		\\
	       I_2 \text{ con } T^{-1} \text { interpolada}&  \left[
		\begin{array}{cccccc}
			1.0000 &  1.6667 &  2.3333 &  3.0000 &  3.6667 &  4.3333 \\
			5.0000 &  5.6667 &  6.3333 &  7.0000 &  7.6667 &  8.3333 \\
			9.0000 &  9.6667 & 10.3333 & 11.0000 & 11.6667 & 12.3333 \\
			13.0000 & 13.6667 & 14.3333 & 15.0000 & 15.6667 & 16.3333 		
		\end{array} \right ]
	\end{array}
\end{equation*}

\noindent ver (afin.java)

\subsection{Transformación Log Polar}

La geometría log polar en imágenes fue motivada por la estructura de la retina de algunos sistema de vision y esta tiene algunas propiedades de compresión. Cuando comparamos el sistema usual de coordenadas cartesianas en imágenes, las imágenes log - polar permiten muestreo mas rápido en los sistema de visión artificial sin reducción en el tamaño de la vista y la parte centra de la retina (fovea).

\begin{figure}
	\centering
	$
	\begin{array}{cc}
	\includegraphics[width=65mm]{figuras/capitulo1/logp1.jpg} &
	\includegraphics[width=65mm]{figuras/capitulo1/logp2.jpg} \\
	(a) & (b)
	\end{array}
	$
	\caption{Interpolación lineal en una dimensión}
	\label{fig:logpolar}
\end{figure}

La transformación log-polar es un mapeo de puntos en el plano cartesiano $(x,y)$ a puntos en el plano log-polar $(\xi , \eta )$. La Figura \ref{fig:logpolar} (a) muestra un conjunto de puntos en linea recta a los que se les aplica la transformación log-polar y la Figura \ref{fig:logpolar} (b) muestra como quedan representados esos puntos. Los valores graficados en la Figura \ref{fig:logpolar} se presentan en la tabla \ref{tab:logpolar}.  La manera de llevar a cabo la transformación  es mediante:

\[
\xi =ln\left(\sqrt{x^2+y^2}\right)
\]
\[
\eta =tg^{-1} \left(\frac{y}{x}\right)
\]

\begin{table}[]
    \centering
    \begin{tabular}{c|cc|cc}
        $n$ & $x_n$ & $y_n$ & $\xi_n$ & $\eta_n$\\
    	\hline
 	1 & 4. & 0. & 1.38629 & 0 \\
 	2 & 4. & 1. & 1.41661 & 0.2450 \\
 	3 & 4. & 2. & 1.49787 & 0.4626 \\
 	4 & 4. & 3. & 1.60944 & 0.6435 \\
 	5 & 4. & 4. & 1.73287 & 0.7854 \\
 	6 & 4. & 5. & 1.85679 & 0.8961 \\
 	7 & 4. & 6. & 1.97562 & 0.9828 \\
 	8 & 4. & 7. & 2.08719 & 1.0517 \\
 	9 & 4. & 8. & 2.19101 & 1.1071 \\
 	10 & 4. & 9. & 2.28736 & 1.1526 \\
 	11 & 4. & 10. & 2.3768 & 1.1903 \\
 	12 & 4. & 11. & 2.45999 & 1.2220 \\
 	13 & 4. & 12. & 2.53759 & 1.2490 \\
 	14 & 4. & 13. & 2.61018 & 1.2723 \\
 	15 & 4. & 14. & 2.67829 & 1.2925 \\
 	16 & 4. & 15. & 2.7424 & 1.3102 \\
 	17 & 4. & 16. & 2.8029 & 1.3258 \\
 	19 & 4. & 17. & 2.86016 & 1.3397 \\
 	20 & 4. & 18. & 2.91447 & 1.3521\\
 	21 & 4. & 19. & 2.96612 & 1.3633 \\
 	22 & 4. & 20. & 3.01534 & 1.3734\\
    \end{tabular}
    \caption{Transformación de puntos de coordenadas $x,y$ a coordenadas polares $\xi, \eta$}
    \label{tab:logpolar}
\end{table}

Aplicando esto tenemos que una imagen luce como la figura \ref{fig:lena6}

\begin{figure}[h!]
{\normalsize \centering
\centerline{\psfig{figure=figuras/capitulo1/parte_1_gr7.eps,width=5.0cm}} }
\caption{Lena aplicando una transformación log polar}
\label{fig:lena6}
\end{figure}

\noindent ver (logpolar.java)

\noindent
\texttt{static public void LogPolar (double datos[][], double res[][])
$\{$
\hspace*{1.ex} int nr, nc, i, j, ren, col; \\
\hspace*{1.ex} double alfa, r, x, y; \\
\hspace*{1.ex} nr = datos.length; \\
\hspace*{1.ex} nc = datos[0].length; \\
\hspace*{1.ex} ren = res.length; \\
\hspace*{1.ex} col = res[0].length; \\
\hspace*{1.ex} System.out.println (ren +   + col); \\
\hspace*{1.ex} double rmax = Math.sqrt (ren*ren + col*col)/2.0; \\
\hspace*{1.ex} for (i = 0; i $<$ ren; i++)  \\
\hspace*{2.ex}   for (j = 0; j $<$ col; j++) $\{$ \\
\hspace*{3.ex}     alfa = (2.0*Math.PI*i)/(ren - 2); \\
\hspace*{3.ex}     r = Math.exp (j*Math.log (rmax)/col); \\
\hspace*{3.ex}    x = r*Math.cos (alfa) + nc/2.0; \\
\hspace*{3.ex}     y = r*Math.sin (alfa) + nr/2.0; \\
\hspace*{3.ex}    res[i][j] = bilineal (datos, x, y); \\
\hspace*{2.ex}   $\}$ \\
 $\}$}
 
 \noindent La transformación log-polar inversa se calcula con el código

\noindent
\texttt{static public void InvLogPolar (double datos[][], double[][] res)\\
$\{$\\
\hspace*{0.5ex} int nr, nc, i, j, ii, jj, ren, col;\\
\hspace*{0.5ex} double alfa, r;\\
\hspace*{0.5ex} double fac = 65.0;\\
\hspace*{0.5ex} nr = datos.length;\\
\hspace*{0.5ex} nc = datos[0].length;\\
\hspace*{0.5ex} ren = res.length;\\
\hspace*{0.5ex} col = res[0].length;\\
\hspace*{0.5ex} double phimax = Math.log (Math.sqrt (nr*nr + nc*nc)/2.0);\\
\hspace*{0.5ex} for (i = 0; i $<$ ren; i++) \\
\hspace*{1.5ex} for (j = 0; j $<$ col; j++) $\{$\\
\hspace*{2.5ex} ii = ren/2 - i;\\
\hspace*{2.5ex} jj = col/2 - j;\\
\hspace*{2.5ex} alfa = (Math.atan2 (ii, jj)/Math.PI + 1.0)*(double) (nr - 2)/2.0;\\
\hspace*{2.5ex} r = Math.log (Math.sqrt (ii*ii + jj*jj))/phimax*nc;\\
\hspace*{2.5ex} res[i][j] = bilineal (datos, r, alfa);\\
\hspace*{1.5ex} $\}$\\
$\}$\\
}

\subsection{Transformación Proyectiva}

Una transformación proyectiva es la generalización de las transformaciones \(R^2\to R^2\), en la que las líneas paralelas no son transformadas necesariamente en tales. Se puede expresar de la forma\\

\[
\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y} \\
 \hat{z}
\end{array}
\right)=\left(
\begin{array}{cc}
 A & t \\
 v^T & 1
\end{array}
\right)\left(
\begin{array}{c}
 x \\
 y \\
 1
\end{array}
\right)
\]

\noindent donde \(v^T\) es la diferencia entre la transformación proyectiva y la afín. Note para el caso de la transformación proyectiva la coordenada \(\hat{z}\) no necesariamente es unitaria lo cual implica que la imagen transfromada se fue a un plano con coordenadas diferentes a esta.
Una manera de regresar al sistema de coordenadas es dividir entre \(\hat{z}.\) As{í} la matriz de transformación queda

\[
\left(
\begin{array}{c}
 \tilde{x} \\
 \tilde{y} \\
 1
\end{array}
\right)=\frac{1}{\hat{z}}\left(
\begin{array}{cc}
 A & t \\
 v^T & 1
\end{array}
\right)\left(
\begin{array}{c}
 x \\
 y \\
 1
\end{array}
\right)
\]

Esta ecuación es conocida también como homógrafía. La aplicación a una imagen de una transformación 

\[
T=\left(
\begin{array}{ccc}
 1 & 0 & 0 \\
 0 & 1 & 0 \\
 1e-3 & 0 & 1
\end{array}
\right)
\] 

Aplicando esta transformación tenemos una proyección de la imagen de Lena que se muestra en la figura \ref{fig:Lena7}


\begin{figure}[h!]
{\normalsize \centering
\centerline{\psfig{figure=figuras/capitulo1/parte_1_gr8.eps,width=5.0cm}} }
\caption{Transformación Proyectiva en la imagen de Lena}
\label{fig:Lena7}
\end{figure}

El código Java para hacer esta transformación es:

\noindent \texttt{static public void proyeccción (double f[][], double g[][], double T[])\\
$\{$\\
\hspace*{0.5ex} int i, j, nr, nc;\\
\hspace*{0.5ex} double in, jn, kn;\\
\hspace*{0.5ex} nr = f.length;\\
\hspace*{0.5ex} nc = f[0].length;\\
\hspace*{0.5ex} for (i = 0; i $<$ nr; i++) \\
\hspace*{1.ex} for (j = 0; j $<$ nc; j++) $\{$ \\
\hspace*{1.5ex} // System.out.println (T[0]);\\
\hspace*{1.5ex} jn = T[0]*j + T[1]*i + T[2];\\
\hspace*{1.5ex} in = T[3]*j + T[4]*i + T[5];\\
\hspace*{1.5ex} kn = T[6]*j + T[7]*i + 1.0;\\
\hspace*{1.5ex} jn /= kn;\\
\hspace*{1.5ex} in /= kn;\\
\hspace*{1.5ex} g[i][j] = bilineal (f, jn, in);\\
\hspace*{1.ex} $\}$\\
\hspace*{0.5ex} $\}$\\
}

\subsubsection{Parámetros a partir de puntos correspondientes}

En esta sección vamos a calcular los parámetros de una homografía, la cual representa un modelo proyectivo, dada por la ecuación


\[
\left(
\begin{array}{c}
 x_2 \\
 y_2 \\
 z_2
\end{array}
\right)=\left(
\begin{array}{ccc}
 h_1 & h_2 & h_3 \\
 h_4 & h_5 & h_6 \\
 h_7 & h_8 & h_9
\end{array}
\right)\left(
\begin{array}{c}
 x_1 \\
 y_1 \\
 z_1
\end{array}
\right)=\left(
\begin{array}{cc}
 A & t \\
 v^T & k
\end{array}
\right)\left(
\begin{array}{c}
 x_1 \\
 y_1 \\
 z_1
\end{array}
\right)
\]

\noindent 
donde el vector \(P_1=\left[x_1,y_1, z_1\right]^T\) es un punto en el espacio tridimensional, el vector \(P_2=\left[x_2,y_2, z_2\right]^T\) es
la proyección en un plazo con \(z_2=1 \)y ambos puntos son correspondientes \(P_1\longleftrightarrow P_2\)\\

El problema consiste en determinar el vector \(H=\left[h_1,h_2,h_3,h_4,h_5,h_6,h_7,h_8\right]{}^T\) a partir de un conjunto de puntos correspondientes.
Una manera de resolver este problema es utilizando mínimos cuadrados, sin embargo tiene problema de estabilidad numérica por lo que es
preferible utilizar el método siguiente.

Dado los puntos y que estos son correspondientes, entonces podemos decir que \(P_2\times H P_1=0\), dado que ambos vectores on paralelos. Esto no
lleva a la siguiente representación.

\(\left(
\begin{array}{ccc}
 0^T & -z_{2,i} P_{1,i}^T & y_{2,i} P_{1,i}^T \\
 z_{2,i} P_{1,i}^T & 0^T & -x_{2,i} P_{1,i}^T
\end{array}
\right)\left(
\begin{array}{c}
 H_1 \\
 H_2 \\
 H_3
\end{array}
\right)=0\)\\
\\
donde \(H_1=\left[h_1,h_2, h_3\right]{}^T\), \(H_2=\left[h_4,h_5, h_6\right]{}^T\) y \(H_3=\left[h_7,h_8, h_9\right]{}^T\) .\\
\\
La solución del sistema de ecuaciones puede llevarse a cabo utilizando la descompisición en valores singulares SVD. La descomposición en valores singulares calcula tres matrices USV = SVD(A) donde U y V son matrices y S una matriz diagonal. La solución del sistema es el último vector de la matriz V (ver Harley-Zisserman pp 90).

\subsubsection{Ejemplo}

Dados los puntos P1 = $\{$ [10.0 10.0 1.0], [10.0 50.0 1.0], { }[50.0 50.0 1.0 ], [50.0 10.0 1.0 ], [25.0 25.0 1.0]$\}$ y P2 = $\{$[8.9108, { }10.89108,
1.0], [4.95049, 46.53465, 1.0], [39.04761, 48.57142, 1.0], [42.85714, 14.28571, 1.0 ], [20.48780, 25.36585, 1.0 ], determinar la Homograf{\' \i}a
correspondiente. La siguiente imagen muestra los puntos P1 a la izquierda y los puntos P2 a la derecha.\\

\begin{figure}[h!]
{\normalsize \centering
\centerline{\psfig{figure=figuras/capitulo1/parte_1_gr9.eps,width=5.0cm}} }
\caption{Puntos correspondientes}
\label{fig:ptos}
\end{figure}

De acuerdo con la ecuación 

\[
\left(
\begin{array}{ccc}
 0^T & -z_{2,i} P_{1,i}^T & y_{2,i} P_{1,i}^T \\
 z_{2,i} P_{1,i}^T & 0^T & -x_{2,i} P_{1,i}^T
\end{array}
\right)\left(
\begin{array}{c}
 H_1 \\
 H_2 \\
 H_3
\end{array}
\right)= BH = 0\]

Tenemos

\[
\text{B = }\left(
\begin{array}{ccccccccc}
 0. & 0. & 0. & -10. & -10. & -1. & 108.911 & 108.911 & 10.891 \\
 10. & 10. & 1. & 0. & 0. & 0. & -89.109 & -89.109 & -8.911 \\
 0. & 0. & 0. & -10. & -50. & -1. & 465.347 & 2326.73 & 46.535 \\
 10. & 50. & 1. & 0. & 0. & 0. & -49.505 & -247.525 & -4.95 \\
 0. & 0. & 0. & -50. & -50. & -1. & 2428.57 & 2428.57 & 48.571 \\
 50. & 50. & 1. & 0. & 0. & 0. & -1952.38 & -1952.38 & -39.048 \\
 0. & 0. & 0. & -50. & -10. & -1. & 714.286 & 142.857 & 14.286 \\
 50. & 10. & 1. & 0. & 0. & 0. & -2142.86 & -428.571 & -42.857 \\
 0. & 0. & 0. & -25. & -25. & -1. & 634.146 & 634.146 & 25.366 \\
 25. & 25. & 1. & 0. & 0. & 0. & -512.195 & -512.195 & -20.488
\end{array}
\right)
\]

Haciendo la SVD(B) tenemos que la matriz v es

\tiny
\[
v = \left(
\begin{array}{ccccccccc}
 -0.008799 & -0.01804 & 0.4915 & 0.0774 & -0.4276 & -0.5010 & -0.07493 & 0.3712 & -0.4178 \\
 -0.006549 & -0.001930 & 0.6014 & -0.7039 & 0.06790 & 0.3676 & -0.009472 & -0.02489 & 0.04643 \\
 -0.0001982 & -0.0003293 & 0.01553 & -0.01201 & -0.01818 & 0.007560 & 0.7942 & -0.3909 & -0.4641 \\
 -0.008647 & -0.002579 & -0.5090 & -0.7008 & -0.03908 & -0.4922 & 0.005096 & 0.05909 & -0.04643 \\
 -0.01059 & 0.0176 & -0.3700 & -0.07726 & -0.4068 & 0.6088 & -0.06827 & 0.3757 & -0.41782 \\
 -0.0002489 & 0.0002550 & -0.01247 & -0.01494 & -0.02256 & -0.005127 & -0.5945 & -0.6558 & -0.4642 \\
 0.7018 & 0.7119 & 0.01084 & -0.00820 & -0.01566 & -0.01418 & 0.00008070 & 0.0008968 & -0.0004646 \\
 0.7119 & -0.7018 & -0.01073 & -0.007749 & -0.01538 & 0.01458 & -0.0002675 & 0.0004953 & 2.6997e-7\\
 0.01740 & -0.000201 & -0.001353 & 0.02651 & 0.8025 & -0.01339 & -0.07222 & 0.3660 & -0.4642
\end{array}
\right)
\]
\normalsize

Tomando la \'ultima columna de la matriz $v$ y normalizando respecto a $v_{9,9}$ tenemos que la Homografía es

\[
\text{H = }\left(
\begin{array}{c}
 0.900036 \\
 -0.100016 \\
 0.999866 \\
 0.100021 \\
 0.899986 \\
 0.99995 \\
 0.00100087 \\
 -5.8153e-7 \\
 1.
\end{array}
\right)
\]


