2. Aplicación de filtros a imágenes
Una actividad usual para los entusiastas de la fotografía es la aplicación de filtros a imágenes para obtener una versión más elegante de éstas. Dos filtros utilizados comunmente son el filtro de la escala a grises y el filtro a tonos sepia. Por ejemplo, si empezamos con la siguiente imagen
y aplicamos el filtro de escala a grises y el filtro de tonos sepia obtenemos las siguientes imágenes
Pero ¿alguna vez te has preguntado cuál es el proceso que ocurre cuando aplicamos dichos filtros? El objetivo de esta lectura es precisamente explicar de forma concisa la manera en la que un computador aplica dichos filtros a una imagen.
En la lectura anterior explicamos la manera en la que una imagen se puede representar como una matriz cuyas entradas son vectores con tres coordenadas que parametrizan la representación en la escala RBG de cada pixel de la imagen. De manera formal, si tenemos una imagen que tiene $m\times n$ pixeles, entonces esa imagen se puede representar con una matriz de la forma
\begin{equation*} P= \begin{bmatrix} p_{11} & p_{12} & \cdots & p_{1n} \\ p_{21} & p_{22} & \cdots & p_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ p_{m1} & p_{m2} & \cdots & p_{mn} \end{bmatrix}, \end{equation*}
donde cada $p_{ij}$ es un vector que codifica el color del pixel $i,j$ en la escala RBG, es decir, $p_{i,j}=\begin{bmatrix}r_{ij}\\ b_{ij}\\ g_{ij}\end{bmatrix}$. Como se explicó en la lectura anterior, los números $r_{ij}$, $b_{ij}$, $g_{ij}$ son números enteros entre 0 y 256 que miden la intesidad de los colores rojo, azul y verde, respectivamente, del pixel $i,j$.
Desde el punto de vista del álgebra lineal, la aplicación de un filtro a una imagen corresponde a la multiplicación por una matriz fija $F$ de tamaño $3\times 3$ a cada vector $p_{i,j}$ que representa a un pixel. Por lo tanto, si escribimos a $F$ de la forma
\begin{equation*} F= \begin{bmatrix} f_{11} & f_{12} & f_{13} \\ f_{21} & f_{22} & f_{22} \\ f_{31} & f_{32} & f_{33} \end{bmatrix}, \end{equation*}
y tenemos una matriz $P$ que representa a una imagen dada, entonces la imagen que se obtiene al aplicar el filtro $F$ es la imagen representada por la matriz
\begin{equation*} P'= \begin{bmatrix} Fp_{11} & Fp_{12} & \cdots & Fp_{1n} \\ Fp_{21} & Fp_{22} & \cdots & Fp_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ Fp_{m1} & Fp_{m2} & \cdots & Fp_{mn} \end{bmatrix}. \end{equation*}
A continuación vamos a explorar algunos ejemplos explícitos de filtros que se utilizan comunmente en las aplicaciones de los celulares.
Filtro de escala de grises.
El filtro de la escala de grises es un filtro que corresponde a la matriz $3\times 3$ dada por
\begin{equation*} F_G= \begin{bmatrix} 1/3&1/3 & 1/3 \\ 1/3 &1/3 & 1/3 \\ 1/3 & 1/3 & 1/3 \end{bmatrix}. \end{equation*}
Observemos que si $p=\begin{bmatrix}r\\ b\\ g\end{bmatrix}$ es la representación en la escala RBG de un pixel, entonces el producto $(F_G)p$ corresponde a tomar un pixel cuyas entradas son todas iguales al promedio de las intensidades de los colores rojo, azul y verde del pixel. En otras palabras \begin{equation*}(F_{G})p=\begin{bmatrix}\frac{r+b+g}{3}\\ \frac{r+b+g}{3}\\ \frac{r+b+g}{3}\end{bmatrix}.\end{equation*} Como un ejemplo explícito, consideremos un pixel cuya representación en la escala RBG está dada por el vector $p=\begin{bmatrix}5\\ 100\\ 75\end{bmatrix}$. Este vector corresponden a un pixel con el color , entonces al aplicarle el filtro correspondiente a la matriz $F_G$ obtenemos el vector $(F_G) p=\begin{bmatrix}60\\ 60\\ 60\end{bmatrix} $ que corresponde a un pixel con el color . Así, cuando utilizamos el filtro de la escala de grises a una imagen, lo que en realidad estamos haciendo es multiplicar cada pixel de la imagen por la matriz $F_G$ dada anteriormente.
Por ejemplo, si le aplicamos la escala de grises al siguiente meme
obtenemos el siguiente meme en la escala de grises
Filtro a tonos sepia.
El filtro a tonos sepia es un filtro que corresponde a la matriz $3\times 3$ dada por
\begin{equation*} F_S= \begin{bmatrix} 0.393 &0.769 & 0.189 \\ 0.349 &0.686 & 0.168 \\ 0.272 & 0.534 & 0.13 \end{bmatrix}. \end{equation*}
Por ejemplo, si tomamos nuevamente un pixel con color cuya representación en la escala RBG está dada por el vector $p=\begin{bmatrix}5\\ 100\\ 75\end{bmatrix}$, entonces al aplicarle el filtro correspondiente a la matriz $F_S$ obtenemos el vector $(F_S) p=\begin{bmatrix}93\\ 83\\ 65\end{bmatrix}$ que corresponde a un pixel con el color .
Por ejemplo, si le aplicamos la escala de grises al siguiente meme
obtenemos el siguiente meme en tonos sepia
Interesante, ¿no lo crees?