%% AMS-LaTeX Created by Wolfram Mathematica 7.0 : www.wolfram.com

\documentclass{article}
\usepackage{amsmath, amssymb, graphics}

\newcommand{\mathsym}[1]{{}}
\newcommand{\unicode}{{}}

\begin{document}

\title{Visi{\' o}n Computacional}
\author{}
\date{}
\maketitle

\section*{ 1.$\unicode{0009}$Introducci{\' o}n}

El Puntillismo aparece por vez primera en 1884, encabezado por el pintor Neo - Impresionista Georges Seurat, y contando con entre sus m{\' a}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{\' a} una t{\' e}cnica que fue el resultado de los estudios crom{\' a}ticos llevados a cabo por Georges Seurat
(1859 - 1891), pintor franc{\' e}s, quien en 1884 lleg{\' o} a la divisi{\' o}n de tonos por la posici{\' o}n de toques de colores que, mirados a
cierta distancia, crean en la retina las combinaciones deseadas [Wikipedia].

\includegraphics{parte_1_gr1.eps}

\subsection*{a.$\unicode{0009}$Manejo de colores RGB}

Definimos un pixel como la unidad b{\' a}sica de una imagen. Es un punto en cuyo valor se almacena la informaci{\' o}n conserniente a los colores.
Los colores b{\' a}sicos que manejaremos son Rojo, Verde y Azul. As{\' \i} pixel lo podemos ver como

\noindent\(\pmb{}\\
\pmb{\text{Manipulate}[\{\{r,g,b\},\text{Image}[\{\{\{r,g,b\}\}\}, \text{$\texttt{"}$Byte$\texttt{"}$}]\}, \{r, 0, 255\}, \{g, 0, 255\}, \{b, 0,255\}]}\)

\noindent\(\)

En la siguiente figura podemos ver el como se almacena la informaci{\' o}n conserniente a los 32 bit o 4 Bytes

\(\includegraphics{parte_1_gr2.eps}

\)

Una imagen discreta, la podemos definir como un arreglo bidimensional en el cual se almacena la informaci{\' o}n de cada punto de la imagen \(256^3
= 16,777, 216 \)diferentes colores por pixel. Dado que la informaci{\' o}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{\' o}n del nivel de transparencia. En la c{\' a}maras es com{\'
u}n hablar de su resoluci{\' o}n en Megabytes, {?`}Que relaci{\' o}n existe con esto?. Bueno una camara de 3 Mega pixeles, tiene aproximadamente
314 pixeles de lado. Esto es { }

N[\text{Sqrt}[3*1000*1000]]

\noindent\(1732.05\)

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


\noindent\(\pmb{b = \{\{\{0,255, 0\}, \{0, 0, 0\}\}, \{\{0,0,0\}, \{0, 255, 0\}\} \} ;}\\
\pmb{ \{\text{MatrixForm}[b],}\\
\pmb{\text{Image}[b, \text{$\texttt{"}$Byte$\texttt{"}$}]\}}\)

\noindent\(\left\{\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),\right\}\)

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

\subsection*{b.$\unicode{0009}$La escala de gris}

En el caso de una im{\' a}gen en tono de gris solamente se maneja una sola matriz de datos, as{\' \i} el color rojo ser{\' a} igual que el verde
y el azul. La uni{\' o}n de los colores dara como resultado blanco y la ausencia dar{\' a} negro. Nuestra imagen solamente tendr{\' a} colores que
van desde el negro al blanco en 256 tonos diferentes.\\
\\
\(\includegraphics{parte_1_gr3.eps}

\)

\noindent\(\pmb{\text{Manipulate}[\text{Image}[\{\{r\}\}, \text{$\texttt{"}$Byte$\texttt{"}$}], \{r, 0, 255\}]}\)

\noindent\(\)

Utilizando im{\' a}ganes en tono de gris, solamente ser{\' a} necesario almacenar la informaci{\' o}n conserniente a un canal de color, o un promedio
de los tres canales de color. Esto reduce en 1/3 la informaci{\' o}n que debe ser almacenada.

\subsection*{c.$\unicode{0009}$Interfase para desplegar im{\' a}genes en Java.}

Ver Algoritmos y ejemplos en la p{\' a}gina. ver inicial.java

\section*{ 2.$\unicode{0009}$Operadores Sobre im{\' a}genes}

\subsection*{a.$\unicode{0009}$Operadores puntuales sobre Im{\' a}genes}

Una imagen discreta, la podemos definir como un arreglo bidimensional en el cual se almacena la informaci{\' o}n de cada punto de la imagen. Como
definimos en la secci{\' o}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}

Consideremos el caso de la ecuaci{\' o}n de una l{\' \i}nea recta y = mx + b donde m es la pendiente y b el cruze por cero

\noindent\(\pmb{\text{Manipulate}[\text{Plot}[m*x+b,\{x,0,255\}],\{m, -1, 1\},\{b,-5,5\}]}\)

\noindent\(\)

As{\' \i} para una im{\' a}gen dadas estas condiciones podemos cambiar la apariencia haciendo una proyecci{\' o}n del espacio original de la imagen
a un nuevo espacio dado por una l{\' \i}nea recta

\noindent\(\pmb{\text{Manipulate} [}\\
\pmb{A=\{\{1, 0\},\{0,1\}\};}\\
\pmb{B= A;}\\
\pmb{\text{Amax} = \text{Max}[A];}\\
\pmb{\text{Amin} = \text{Min}[A];}\\
\pmb{m = (\text{fmax} -\text{fmin})/(\text{Amax} - \text{Amin});}\\
\pmb{b = \text{fmin}- m*\text{Amin};}\\
\pmb{B = m*A+b;}\\
\pmb{\{\text{Image}[B, \text{$\texttt{"}$Byte$\texttt{"}$}]\}, \{\{\text{fmax},255\}, -255, 255\}, \{\{\text{fmin}, 0\}, -255, 255\}}\\
\pmb{]}\)

\noindent\(\)

En el caso de una imagen con mayor informaci{\' o}n esta lucir{\' a} como:

\noindent\(\pmb{f= \text{ImageData}[\text{ColorConvert}[\text{Import}[\text{$\texttt{"}$ExampleData/lena.tif$\texttt{"}$}], \text{$\texttt{"}$Grayscale$\texttt{"}$}]];}\\
\pmb{f = 255*f;}\\
\pmb{\text{fmin} =\text{Min}[f];}\\
\pmb{\text{fmax} = \text{Max}[f];}\\
\pmb{\text{gmax} = 150;}\\
\pmb{\text{gmin} = 50;}\\
\pmb{g=(f-\text{fmin})*(\text{gmax}-\text{gmin})/(\text{fmax}- \text{fmin})+\text{gmin};}\\
\pmb{\{\text{Image}[f, \text{$\texttt{"}$Byte$\texttt{"}$}], \text{Image}[g, \text{$\texttt{"}$Byte$\texttt{"}$}],}\\
\pmb{\text{ImageHistogram}[\text{Image}[f, \text{$\texttt{"}$Byte$\texttt{"}$}]],\text{ImageHistogram}[\text{Image}[g, \text{$\texttt{"}$Byte$\texttt{"}$}]]\}}\)

\noindent\(\{,,,\}\)

Otro ejemplo de operadores puntuales sobre imagenes es la conversi{\' o}n de colores RGB a escala de gris. As{\' \i} 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{\' o}n\\
\\
\(\left.\left.A_{i,j}=\left(R_{i,j}+\right.G_{i,j}+B_{i,j}\right)\right/3\)\\
\\
Con esta operaci{\' o}n tendremos una sola matriz con el promedio de los colores y cuando se crea la imagen a color las matrice R, G, B ser{\' a}n
iguales a la matriz A.

\subsubsection*{Funci{\' o}n Sigmoide}

Otra manera de hacer esto es considerar una funci{\' o}n diferente como la sigmoide, definida como y = \(\frac{1}{1+e^{-\text{$\beta $x}}}\). Como
luce una imagen en estas condiciones.

\noindent\(\pmb{\text{A1}= \text{ImageData}[\text{ColorConvert}[\text{Import}[\text{$\texttt{"}$ExampleData/lena.tif$\texttt{"}$}], \text{$\texttt{"}$Grayscale$\texttt{"}$}]];}\\
\pmb{b= 100;}\\
\pmb{\text{A2}=2\text{A1}/\text{Max}[\text{A1}]-1;}\\
\pmb{\text{A2} = 1/(1+\text{Exp}[-b*\text{A2}]);}\\
\pmb{\text{A2} = (\text{A2}+1)*125;}\\
\pmb{\{\text{Image}[\text{A1}*255, \text{$\texttt{"}$Byte$\texttt{"}$}], \text{Image}[\text{A2}, \text{$\texttt{"}$Byte$\texttt{"}$}],}\\
\pmb{\text{Plot}[1/(1+\text{Exp}[-b*x]),\{x, -1,1\}],}\\
\pmb{\text{ImageHistogram}[\text{Image}[\text{A1}*255, \text{$\texttt{"}$Byte$\texttt{"}$}] \text{//} \text{ImageAdjust}],\text{ImageHistogram}[\text{Image}[\text{A2},
\text{$\texttt{"}$Byte$\texttt{"}$}]\text{//}\text{ImageAdjust}]\}}\)

\noindent\(\{,,,,\}\)

En esta figura podemos ver la image original, la imagen procesada, la sigmoide aplicada y los histogramas (en la parte baja) de la imagen antes y
despu{\' e}s de aplicar la transformaci{\' o}n.

\subsection*{b.$\unicode{0009}$Operadores de Ventana sobre im{\' a}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{\' \i} por
ejemplo \(I_{i,j}=\sum _{<k,l>\in W} I_{k,l.}\) En la imagen tenemos un operador correspondiente a la media, donde cada uno de los pixeles es reemplazado
por el promedio en una ventana de tama{\~ n}a \(n_k\)

\noindent\(\pmb{\text{nr} = 116;}\\
\pmb{\text{nc} = 150;}\\
\pmb{\text{Img} = \text{ColorConvert}[\text{Import}[\text{$\texttt{"}$ExampleData/lena.tif$\texttt{"}$}], \text{$\texttt{"}$Grayscale$\texttt{"}$}];}\\
\pmb{A = \text{ImageData}[\text{Img}];}\\
\pmb{\text{ImageDimensions}[\text{Img}]}\\
\pmb{B = A;}\\
\pmb{\text{nk} = 1;}\\
\pmb{\text{For}[i = 10, i \text{$<$=} \text{nr} - 10, i\text{++},}\\
\pmb{ \text{For}[j = 10, j \text{$<$=} \text{nc} - 10, j\text{++}, \{}\\
\pmb{\text{    }\text{suma} = 0;}\\
\pmb{\text{    }\text{For}[k = i - \text{nk}, k \leq  i + \text{nk}, k\text{++},}\\
\pmb{\text{      }\text{For}[l = j - \text{nk}, l \leq  j + \text{nk}, l\text{++},}\\
\pmb{\text{        }\text{suma} \text{+=} A[[k, l]] }\\
\pmb{\text{       }]}\\
\pmb{\text{      }]}\\
\pmb{\text{     }B[[i, j]] = \text{suma};}\\
\pmb{\text{    }\}}\\
\pmb{\text{   }];}\\
\pmb{ ]}\\
\pmb{}\\
\pmb{\{\text{Image}[A], \text{Image}[B] \text{//} \text{ImageAdjust}\}}\)

\noindent\(\{150,116\}\)

\noindent\(\{,\}\)

\subsection*{c.$\unicode{0009}$Transformaci{\' o}n Af{\' \i}n y Proyectiva.}

Una transformaci{\' o}n afin es una transformaci{\' o}n geom{\' e}trica que esta constitida por translaci{\' o}n, escalamiento, rotaci{\' o}n y cizallamiento.

\subsection*{Traslaci{\' o}n}

Una translaci{\' o}n la podemos hacer simplemente asuminedo que las nuevas coordenadas \(\hat{x}=x+\text{tx}\) \(\hat{y}=y+\text{ty}\) { }les sumanmos
un valor tx o ty seg{\' u}n corresponda. En coordenadas homogeneas queda como

\(\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y} \\
 1
\end{array}
\right)=\left(
\begin{array}{ccc}
 1 & 0 & \text{tx} \\
 0 & 1 & \text{ty} \\
 0 & 0 & 1
\end{array}
\right)\left(
\begin{array}{c}
 x \\
 y \\
 1
\end{array}
\right)\)

\noindent\(\pmb{\text{Manipulate} [}\\
\pmb{\{\text{TranslationTransform}[\{\text{tx}, \text{ty}\}], \text{Graphics}[\text{Rectangle}[], \text{Frame}\to \text{True}],}\\
\pmb{\text{Graphics}[\text{GeometricTransformation}[\text{Rectangle}[],\text{TranslationTransform}[\{\text{tx}, \text{ty}\}]], \text{Frame}\to \text{True}]\},
}\\
\pmb{\{\text{tx}, 0, 10\}, \{\text{ty}, 0, 10\}]}\)

\noindent\(\)

\subsubsection*{Escalamiento}

El escalamiento pude entenderse como hacer que una figura geom{\' e}trica cambie su tama{\~ n}o. Un escalamiento en x lo podemos representar por
como x=x*sx y en y como y=y*sy. { }En coordenadas homogeneas se pude expresar como

\noindent\(\pmb{\text{ScalingTransform}[\{\text{sx}, \text{sy}\}] }\)

\noindent\(\text{TransformationFunction}\left[\left(
\begin{array}{ccc}
 \text{sx} & 0 & 0 \\
 0 & \text{sy} & 0 \\
 0 & 0 & 1
\end{array}
\right)\right]\)

\noindent\(\pmb{\text{Manipulate} [}\\
\pmb{\{\text{ScalingTransform}[\{\text{sx}, \text{sy}\}], \text{Graphics}[\text{Rectangle}[], \text{Frame}\to \text{True}],}\\
\pmb{\text{Graphics}[\text{GeometricTransformation}[\text{Rectangle}[],\text{ScalingTransform}[\{\text{sx}, \text{sy}\}]], \text{Frame}\to \text{True}]\},
\{\{\text{sx},1\}, 0, 10\}, }\\
\pmb{\{\{\text{sy},1\}, 0, 10\}]}\)

\noindent\(\)

algo

\subsubsection*{Rotaci{\' o}n}

Consideremos el caso de un punto que rota respecto a un punto fijo. Las coordenadas x, y en forma polar las podemos obtener como x=r cos($\theta
$) y y=r seno($\theta $). Si consideramos que esta gira un {\' a}ngulo $\psi $ entonces podemos representar esta rotaci{\' o}n en forma polar como\\
\\
\(\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y}
\end{array}
\right)=\left(
\begin{array}{c}
 r \cos (\theta +\psi ) \\
 r\text{  }\text{seno}(\theta +\psi )
\end{array}
\right)=\left(
\begin{array}{c}
 r \cos (\theta ) \cos (\psi )-r \text{seno}(\theta ) \text{seno}(\psi ) \\
 r\text{  }\cos (\theta )\text{seno}(\psi )+ r \text{seno}(\theta )\cos (\psi )
\end{array}
\right)=\left(
\begin{array}{c}
 x \cos (\psi )-y \text{seno}(\psi ) \\
 x \text{seno}(\psi )+ y \cos (\psi )
\end{array}
\right)\)\\
\\
Una matriz de rotaci{\' o}n puede ser definida entonces como 

\(\left(
\begin{array}{c}
 \hat{x} \\
 \hat{y}
\end{array}
\right)=\left(
\begin{array}{cc}
 \cos (\psi )  & -\text{seno}(\psi ) \\
 \text{seno}(\psi ) & \cos (\psi )
\end{array}
\right)\left(
\begin{array}{c}
 x\text{  } \\
 y
\end{array}
\right)\)

En coordenadas homogeneas puede representarse como

\noindent\(\pmb{r = \text{RotationTransform}[\theta ]}\)

\noindent\(\text{TransformationFunction}\left[\left(
\begin{array}{ccc}
 \text{Cos}[\theta ] & -\text{Sin}[\theta ] & 0 \\
 \text{Sin}[\theta ] & \text{Cos}[\theta ] & 0 \\
 0 & 0 & 1
\end{array}
\right)\right]\)

\noindent\(\pmb{\text{Manipulate} [}\\
\pmb{\{\text{ang}, \text{RotationTransform}[\text{ang} \text{Degree}], \text{Graphics}[\text{Rectangle}[], \text{Frame}\to \text{True}],}\\
\pmb{\text{Graphics}[\text{GeometricTransformation}[\text{Rectangle}[],\text{RotationTransform}[\text{ang} \text{Degree}]], \text{Frame}\to \text{True}]\},
\{\text{ang}, 0, 90\}]}\)

\noindent\(\pmb{}\)

\subsubsection*{ Cizallamiento}

El cizallamiento es una transformaci{\' o}n dada por la matriz, donde cx es el {\' a}ngulo de cizallamiento respecto al eje x.

\noindent\(\pmb{\text{ShearingTransform}[\text{cx} \text{Degree},\{1,0\},\{0,1\}]}\)

\noindent\(\text{TransformationFunction}\left[\left(
\begin{array}{ccc}
 1 & \text{Tan}[\text{cx} {}^{\circ}] & 0 \\
 0 & 1 & 0 \\
 0 & 0 & 1
\end{array}
\right)\right]\)

\noindent\(\pmb{\text{Manipulate}[}\\
\pmb{\{\text{ShearingTransform}[\text{cx} \text{Degree},\{1,0\},\{0,1\}], }\\
\pmb{\text{Graphics}[\text{GeometricTransformation}[\text{Rectangle}[],\text{ShearingTransform}[\text{cx} \text{Degree},\{1,0\},\{0,1\}]], \text{Frame}\to
\text{True}]\},}\\
\pmb{\{\text{cx}, 0, 90\}]}\)

\noindent\(\)

En caso de querer aplicar el cizallamiento en la direcci{\' o}n y, la matriz de transformaci{\' o}n ser{\' a}.

\(\left(
\begin{array}{ccc}
 1 & 0 & 0 \\
 \text{tg}(\text{cy}) & 1 & 0 \\
 0 & 0 & 1
\end{array}
\right)\)

Una vez que unimos todas las transformaciones tenemos una composici{\' o}n dada por una { }Rotacion R, un escalamiento S, un Cizallamiento C y una
Translaci{\' o}n T. Al conjunto de estas operaciones se le conoce como transformaci{\' o}n afin.

\noindent\(\pmb{\text{Composition}[\text{TranslationTransform}[\{\text{tx},\text{ty}\}],\text{RotationTransform}[\text{ang}], \text{ScalingTransform}[\{\text{sx},\text{sy}\}],
}\\
\pmb{\text{ShearingTransform}[\text{cx}, \{1,0\},\{0,1\}]]}\)

\noindent\(\text{TransformationFunction}\left[\left(
\begin{array}{ccc}
 \text{sx} \text{Cos}[\text{ang}] & -\text{sy} \text{Sin}[\text{ang}]+\text{sx} \text{Cos}[\text{ang}] \text{Tan}[\text{cx}] & \text{tx} \\
 \text{sx} \text{Sin}[\text{ang}] & \text{sy} \text{Cos}[\text{ang}]+\text{sx} \text{Sin}[\text{ang}] \text{Tan}[\text{cx}] & \text{ty} \\
 0 & 0 & 1
\end{array}
\right)\right]\)

\noindent\(\pmb{\text{Manipulate}[}\\
\pmb{\{\text{Composition}[}\\
\pmb{\text{TranslationTransform}[\{\text{tx},\text{ty}\}],}\\
\pmb{\text{RotationTransform}[\text{ang}],}\\
\pmb{\text{ScalingTransform}[\{\text{sx},\text{sy}\}],}\\
\pmb{\text{ShearingTransform}[\text{cx} \text{Degree},\{1,0\},\{0,1\}]], \text{Graphics}[\text{GeometricTransformation}[\text{Rectangle}[],}\\
\pmb{\text{Composition}[}\\
\pmb{\text{TranslationTransform}[\{\text{tx},\text{ty}\}],}\\
\pmb{\text{RotationTransform}[\text{ang}],}\\
\pmb{\text{ScalingTransform}[\{\text{sx},\text{sy}\}],}\\
\pmb{\text{ShearingTransform}[\text{cx} \text{Degree},\{1,0\},\{0,1\}]]}\\
\pmb{], \text{Frame}\to \text{True}]\},}\\
\pmb{\{\text{tx}, 0, 10\}, \{\text{ty}, 0, 10\},\{\text{ang}, 0, 90\},\{\text{cx}, 0, 90\}, \{\{\text{sx},1\}, 0, 10\}, \{\{\text{sy} ,1\}, 0, 10\}]}\)

\noindent\(\)

\subsection*{d.$\unicode{0009}$Interpolaci{\' o}n.}

Todas las transformaci{\' o}nes aplicadas anteriormente son para un punto en el espacio de coordenadas [x,y], pero que sucede cuando hablamos de
im{\' a}genes. Una imagen esta compuesta de colores en una posici{\' o}n con coordenadas enteras [i,j]. Si aplicamos una transformaci{\' o}n af{\'
\i}n las coordenas enteras pasaran a ser coordenadas en n{\' u}meros reales, as{\' \i} por ejemplo en el caso de una rotaci{\' o}n tendremos

\noindent\(\pmb{\text{Manipulate}[}\\
\pmb{\{}\\
\pmb{A=\{\{\text{Cos}[0.1], -\text{Sin}[0.1], 0\},\{\text{Sin}[0.1], \text{Cos}[0.1], 0\}, \{0, 0,1\}\};}\\
\pmb{c = \text{Transpose}[\{\{i,2, 1\}\}];}\\
\pmb{x=A.c;}\\
\pmb{\text{MatrixForm}[x], \text{$\texttt{"}$ = $\texttt{"}$}, \text{MatrixForm}[A] , \text{MatrixForm}[c] \},}\\
\pmb{\{i, 0, 10, 1\}}\\
\pmb{]}\)

\noindent\(\)

En estas condiciones en probable descidir hacer un truncamiento, sin embargo cuando se trata de un escalamiento con sx=2 y sy = 1, tendremos que
ciertos pixeles no ser{\' a}n visitados.

\noindent\(\pmb{\text{Manipulate}[}\\
\pmb{A=\{\{2, 0, 0\},\{0, 1, 0\}, \{0, 0,1\}\};}\\
\pmb{c = \text{Transpose}[\{\{i,2, 1\}\}];}\\
\pmb{x=A.c;}\\
\pmb{\{\text{MatrixForm}[x], \text{$\texttt{"}$ = $\texttt{"}$}, \text{MatrixForm}[A] , \text{MatrixForm}[c] \},}\\
\pmb{\{i,0,10, 1\}]}\)

\noindent\(\)

Esta condici{\' o}n har{\' a} que no se teng{\' a}n cubiertas todos los pixeles de una imagen ya que en el caso del escalamiento (sx = 2) solamente
las posiciones pares de la nueva imagen tendr{\' a}n valor.{?`}Como corregir este efecto?.En lugar de barrer todos los puntos de la imagen origen,
barreremos todos los puntos de la imagen destino y cualquier pixel que no este en posici{\' o}n entera lo calcularemos utilizando interpolaci{\'
o}n bilineal. Consideremos el caso de una matriz de rotaci{\' o}n

\noindent\(\pmb{A = \{\{\pmb{0.9510565162951535, -0.3090169943749474, 0.0}\pmb{\}}\pmb{,}}\\
\pmb{\pmb{ }\pmb{\{0.3090169943749474, 0.9510565162951535, 0.0\}}\pmb{,}\pmb{ }\pmb{}}\\
\pmb{\pmb{\{0.0, 0.0, 1.0\}}\pmb{\}}\pmb{ }\pmb{;}}\\
\pmb{\pmb{\text{MatrixForm}[A]}}\)

\noindent\(\left(
\begin{array}{ccc}
 0.951057 & -0.309017 & 0. \\
 0.309017 & 0.951057 & 0. \\
 0. & 0. & 1.
\end{array}
\right)\)

al aplicar la transformaci{\' o}n para cada uno de los puntos de la imagen de acuerdo con el siguiente c{\' o}digo tenemos\texttt{  \\
\\
\hspace*{3.5ex} for(i=0; i$<$nr; i++)\\
\hspace*{6.ex} for(j=0; j$<$nc; j++) $\{$\\
\hspace*{8.ex} afin(i, j, x, T);\\
\hspace*{8.ex} \\
\hspace*{8.ex} if(x[0] $>$=0 $\&\&$ x[0] $<$ nr $\&\&$ x[1] $>$=0 $\&\&$ x[1] $<$ nc)\\
\hspace*{10.ex} I2[(int) x[1]][(int) x[0]] = I1[i][j];\\
\hspace*{6.ex} $\}$\\
}\\
\(\includegraphics{parte_1_gr4.eps}

\)\\
\\
Note los puntos negros generados por el redondeo. Esta condici{\' o}n es mas notoria cuando se escala una imagen con un factor superior a 1.

\(\\
\)La funci{\' o}n de interpolaci{\' o}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} $\}$\\
}

Una manera de resolver este problema es aplicar la transformaci{\' o}n sobre los puntos de la imagen destino utilizando la inversa de la funci{\'
o}n y la funci{\' o}n de interpolaci{\' o}n de acuerdo con el c{\' o}digo\\
\\
\texttt{  { }static public void afin(double f[][], double g[][], double T[])\\
\hspace*{1.ex} $\{$\\
\hspace*{2.ex} int i, j, nr, nc;\\
\\
\hspace*{2.ex} double in, jn;\\
\\
\hspace*{2.ex} nr = f.length;\\
\hspace*{2.ex} nc = f[0].length;\\
\\
\\
\hspace*{2.ex} for (i = 0; i $<$ nr; i++)\\
\hspace*{3.ex} for (j = 0; j $<$ nc; j++) $\{$ //System.out.println(T[0]);\\
\\
\hspace*{4.ex} jn = T[0] * j { }+ T[1] * i { }+ T[2];\\
\hspace*{4.ex} in = T[3] * j { }+ T[4] * i { }+ T[5];\\
\hspace*{4.ex} g[i][j] = bilineal(f, jn, in);\\
\\
\hspace*{3.ex} $\}$\\
\hspace*{1.ex} $\}$\\
\hspace*{1.ex} \\
\hspace*{1.ex} La diferencia la podemos ver en la imagen\\
\hspace*{1.ex} \\
 { }}\(\includegraphics{parte_1_gr5.eps}

\) \(\includegraphics{parte_1_gr6.eps}

\)\texttt{ \\
\\
ver (afin.java)}

\subsubsection*{Transformaci{\' o}n Log Polar}

La geometr{\' \i}a log polar en imagens fue motivada por la estrcutura de la retina de algunos sistema de vision y esta tiene algunas propiedades
de compresion. Cuando comparamos el sistema usual de coordenadas cartesianas en imagenes, las imagenes log - polar permiten muestreo mas r{\' a}pido
en los sistema de visi{\' o}n artificial sin reducci{\' o}n en el tama{\~ n}o de la vista y la parte centra de la retina (fovea).\\
\hspace*{1.ex} \\
\hspace*{1.ex} The log-polar transformation is a conformal mapping from the points on the cartesian plane (x,y) to points in the log-polar plane
($\xi $, $\eta $):\\
 { } 

\(\\
\)

\(\xi =\text{Log}\left[\sqrt{x^2+y^2}\right]\\
\eta =\text{ArcTan}\left[\frac{y}{x}\right]\)

Aplicando esto tenemos que una imagen luce como\\
\\
\(\includegraphics{parte_1_gr7.eps}

\) ver (logpolar.java)

\texttt{ static public void LogPolar (double datos[][], double res[][])\\
$\{$\\
\hspace*{0.5ex} int nr, nc, i, j, ren, col;\\
\hspace*{0.5ex} double alfa, r, x, y;\\
\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} System.out.println (ren + $\texttt{"}$ $\texttt{"}$ + col);\\
\hspace*{0.5ex} double rmax = Math.sqrt (ren*ren + col*col)/2.0;\\
\hspace*{0.5ex} for (i = 0; i $<$ ren; i++) \\
\hspace*{1.5ex} for (j = 0; j $<$ col; j++) $\{$\\
\hspace*{2.5ex} alfa = (2.0*Math.PI*i)/(ren - 2);\\
\hspace*{2.5ex} r = Math.exp (j*Math.log (rmax)/col);\\
\hspace*{2.5ex} x = r*Math.cos (alfa) + nc/2.0;\\
\hspace*{2.5ex} y = r*Math.sin (alfa) + nr/2.0;\\
\hspace*{2.5ex} res[i][j] = bilineal (datos, x, y);\\
\hspace*{1.5ex} $\}$\\
\hspace*{0.5ex} $\}$\\
\\
\hspace*{0.5ex} \\
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} $\}$\\
$\}$\\
}

\subsubsection*{Transformaci{\' o}n Proyectiva}

Una transformaci{\' o}n proyectiva es la generalizaci{\' o}n de las transformaciones \(R^2\to R^2\), en la que las l{\' \i}neas paralelas no son
transformadas necesariamene 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)\)\\
donde \(v^T\) es la diferencia entre la transformaci{\' o}n proyectiva y la af{\' \i}n. Note para el caso de la transformaci{\' o}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{\' \i} la matriz de transformaci{\' o}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{\' o}n es conocida tambien como hom{\' o}graf{\' \i}a. La aplicaci{\' o}n a una imagen de una transformaci{\' o}n \\
\\
\(T=\left(
\begin{array}{ccc}
 1 & 0 & 0 \\
 0 & 1 & 0 \\
 1e-3 & 0 & 1
\end{array}
\right)\) { }es\\
\\
\(\includegraphics{parte_1_gr8.eps}

\)\\
\\
El c{\' o}digo Java para hacer esta transformaci{\' o}n es:

\texttt{ static public void proyecccion (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*{Parametros a partir de puntos correspondientes}

En esta secci{\' o}n vamos a calcular los parametros de una homograf{\' \i}a, la cual representa un modelo proyectivo, { }dada por la ecuaci{\' o}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)\)\\
\\
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{\' o}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{\' \i}nimos cuadrados, sin embargo tiene problema de estabilidad num{\' e}rica por lo que es
preferible utilizar el m{\' e}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{\' o}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{\' o}n del sistema de ecuaciones puede llevarse a cabo utilizando la descompisici{\' o}n en valores singulares SVD. La descomposici{\'
o}n en valores singulares calcula tres matrices USV = SVD(A) donde U y V son matrices y S una matriz diagonal. La soluci{\' o}n del sistema es el
{\' u}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.\\
\\
\(\includegraphics{parte_1_gr9.eps}

\)(ver Proyectiva.java)\\
\\
De acuerdo con la ecuaci{\' o}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\)\\
\\
Tenemos

\noindent\(\pmb{A =\{}\\
\pmb{\{0.000,0.000,0.000,-10.000,-10.000,-1.000, 108.911,108.911,10.891\},}\\
\pmb{\{10.000, 10.000, 1.000, 0.000, 0.000, 0.000,-89.109,-89.109,-8.911\},}\\
\pmb{\{0.000, 0.000, 0.000,-10.000,-50.000,-1.000, 465.347, 2326.733, 46.535\},}\\
\pmb{\{10.000, 50.000, 1.000, 0.000, 0.000, 0.000,-49.505,-247.525,-4.950\},}\\
\pmb{\{0.000, 0.000, 0.000,-50.000,-50.000,-1.000, 2428.571, 2428.571, 48.571\},}\\
\pmb{\{50.000, 50.000, 1.000, 0.000, 0.000, 0.000,-1952.381,-1952.381,-39.048\},}\\
\pmb{\{0.000, 0.000, 0.000,-50.000,-10.000,-1.000, 714.286, 142.857, 14.286\},}\\
\pmb{\{50.000, 10.000, 1.000, 0.000, 0.000, 0.000,-2142.857,-428.571,-42.857\},}\\
\pmb{\{0.000, 0.000, 0.000,-25.000,-25.000,-1.000, 634.146, 634.146, 25.366\},}\\
\pmb{\{25.000, 25.000, 1.000, 0.000, 0.000, 0.000,-512.195,-512.195,-20.488\}\};}\\
\pmb{\{u, s, v\} = \text{SingularValueDecomposition}[A]; }\\
\pmb{}\\
\pmb{\text{Print}[\text{$\texttt{"}$A = $\texttt{"}$}, \text{MatrixForm}[A]],}\\
\pmb{\text{Print}[\text{$\texttt{"}$v = $\texttt{"}$}, \text{MatrixForm}[v]],}\\
\pmb{\text{Print}[\text{$\texttt{"}$H = $\texttt{"}$}, \text{MatrixForm}[v[[\text{All},9]]/v[[9,9]]]]}\)

\noindent\(\text{A = }\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)\)

\noindent\(\text{v = }\left(
\begin{array}{ccccccccc}
 -0.00879922 & -0.0180446 & 0.491538 & 0.077412 & -0.427665 & -0.501067 & -0.0749361 & 0.371239 & -0.417846 \\
 -0.00654915 & -0.00193059 & 0.601401 & -0.703992 & 0.0679077 & 0.36768 & -0.00947217 & -0.0248917 & 0.0464327 \\
 -0.000198243 & -0.000329333 & 0.0155353 & -0.0120108 & -0.0181833 & 0.00756093 & 0.794291 & -0.390965 & -0.464192 \\
 -0.00864725 & -0.00257999 & -0.509044 & -0.700882 & -0.0390856 & -0.492296 & 0.00509678 & 0.0590956 & -0.0464353 \\
 -0.0105904 & 0.0176318 & -0.370067 & -0.0772645 & -0.406871 & 0.60886 & -0.0682794 & 0.375719 & -0.417822 \\
 -0.000248935 & 0.000255063 & -0.0124733 & -0.0149404 & -0.0225682 & -0.00512779 & -0.594552 & -0.655807 & -0.464231 \\
 0.701816 & 0.711914 & 0.0108403 & -0.0082056 & -0.0156603 & -0.0141896 & 0.0000807061 & 0.000896862 & -0.000464659 \\
 0.71193 & -0.701806 & -0.0107336 & -0.00774952 & -0.0153849 & 0.0145827 & -0.000267594 & 0.000495329 & \text{2.699789901951244$\grave{ }$*${}^{\wedge}$-7}
\\
 0.0174058 & -0.00020131 & -0.00135374 & 0.0265134 & 0.802557 & -0.0133913 & -0.0722242 & 0.366015 & -0.464254
\end{array}
\right)\)

\noindent\(\text{H = }\left(
\begin{array}{c}
 0.900036 \\
 -0.100016 \\
 0.999866 \\
 0.100021 \\
 0.899986 \\
 0.99995 \\
 0.00100087 \\
 -\text{5.815324651897821$\grave{ }$*${}^{\wedge}$-7} \\
 1.
\end{array}
\right)\)

\end{document}
