Manejo de Imágenes
Introducción
Introducción a las Imágenes Digitales

Introducción
Una imagen puede ser modelada como una función continua de 2 o 3 variables1, sus argumentos son los valores x, y de un plano cartesiano. Los valores de la imagen corresponden al brillo en los puntos de dicha imagen.
Las imágenes que se generan en la retina del ojo humano son están básicamente en 2 dimensiones (2D) y al brillo de cada uno de los punto se le denomina intensidad de la imagen. Vivimos en un mundo en 3 dimensiones (3D) y las imágenes que vemos es el resultado de una proyección de la escena en 3D; dicha transformación no es 1 a 1 ya que reconstruir una escena en 3D desde una imagen es un problema que sigue estando vigente.
Las imágenes digitales son usualmente representadas por matrices, el dominio de la imagen esta dada por la región R: $$ R = \left \{ (x,y) : 1 \le x \le x_m, 1 \le y \le y_n \right \}$$ donde $x_m$ y $y_n$ representan las coordenadas máximas de la imagen.
El rango de la función de la imagen esta limitada, convencionalmente el valor más bajo del brillo corresponde al negro mientras que el más alto al blanco. Los valores del brillo limitados por estos limites son niveles de escala de grises los cuales son representados por 8 bits; podemos tener valores entre 0 y 255.
Digitalización
Una imagen captura es expresada como una función continua $ f(x,y)$ en un plano cartesiano bidimensional, de modo que esta imagen digitalizada esta muestreada en una matriz de M filas y N columnas donde cada uno de esto valores almacena un valor entero. Cada uno de los elementos de dicha matriz es conocido con el nombre de Pixel que es la unidad básica y no es divisible.
El ojo humano detecta el color como una combinación de los colores primarios Rojo, Verde y Azul2, de tal modo que el hardware que permite la digitalización de imágenes captura dichas imágenes bajo un modelo RGB( del ingles Red, Green, Blue).
Cada pixel esta asociado a un vector tridimensional(r,g,b) que provee la intensidad del color, el color Negro esta asociado al vector (0,0,0), el Blanco a (k,k,k), el Rojo a (k,0,0) donde k es usualmente de 8 bits de modo que $ k =2^8=256$.
Escala de Grises

Cuando tenemos una imagen en escala de grises cada dimensión de los pixeles que la conforman tienen el mismo valor. Existen diversas técnicas para convertir una imagen de color a escala de grises3.
Promedio
El método del Promedio asigna como valor de la escala de gris el promedio de los valores de R, G y B. $$ Gray = (R+G+B)/3 $$ Sin embargo este método no funciona como se esperaría ya que el ojo humano reacciona diferente a cada canal del RGB; es más sensible al color verde y menos sensible al azul.
Luminosidad.
El método de la Luminosidad o pesado4 permite balancear la imagen en base a la sensibilidad del ojo humano a cada uno de los canales. $$ Gray = 0.299*R + 0.587*G + 0.114*B $$
Binarizado

El binarizado permite convertir una imagen que se encuentra en Escala de Grises a una imagen en Blanco y Negro. Existen diversas técnicas para el binarizado4 donde lo que se busca es encontrar el umbral para asignar el valor de 0 o de 255. $$ B(i,j) = \left \{ \begin{matrix} 0 & I(i,j)<U \\ 255 & I(i,j)\geq U \end{matrix} \right. $$ donde $U$es el umbral entrado por algún método, $ I $ es una imagen en escala de grises, $ B $ es la imagen binarizada y $(i,j)$ es un pixel de la imagen.
- Jiang M. (2009). Digital Image Processing. School of Mathematical Sciences, Peking University, https://www.math.pku.edu.cn/teachers/jiangm/courses/DIP/dip-handouts.pdf [↩]
- Pratt, W. K. (1978). Digital Image Processing. John Wiley & Sons, Inc, New York. [↩]
- https://www.dynamsoft.com/blog/insights/image-processing/image-processing-101-color-space-conversion/ [↩]
- Tensmeyer, C., & Martinez, T. (2020). Historical Document Image Binarization: A Review. SN Computer Science, 1(3), 173. https://doi.org/10.1007/s42979-020-00176-1 [↩] [↩]
Librerías
Pillow
Pillow1 es una librería basada en la librería PIL de Python. Para instalar Pillow se puede hacer mediante pip de la siguiente manera:
pip install Pillow
import numpy as np
from PIL import Image
if __name__ == "__main__":
image = Image.open('imagen.jpg').convert('L')
np_im = np.array(image)
OpenCV
OpenCV (Open Computer Vision)2 es una librería optimizada para trabajar con Visión por Computadora en tiempo real. Para instalar OpenCV se puede hacer mediante pip de la siguiente manera:
pip install opencv-contrib-python
import cv2
import numpy as np
if __name__ == "__main__":
image = cv2.imread("imagen.jpg")
np_im = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Vector de Caracteristicas
Histograma
El histograma de una imagen resume la distribución de los valores que aparecen en una imagen. Tiene tantos elementos
Inception v3
Es un modelo de reconocimiento de imágenes3 que tiene una serie de componentes básicos simétricos y asimétricos.

Inception v3 esta implementado en Tensorflow((https://www.tensorflow.org/)), que es una librería de Aprendizaje Máquina escrito en el lenguaje Python, para instalarlo se puede hacer mediante pip de la siguiente manera:
pip install tensorflow
Implementación en Python
from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.applications.inception_v3 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.preprocessing import image
import numpy as np
if __name__ == "__main__":
model = InceptionV3(weights='imagenet', include_top=False)
img = image.load_img("imagen.jpg", target_size=(224,224))
x = img_to_array(img)
x = np.expand_dims(x,axis=0)
x = preprocess_input(x)
feat = model.predict(x)
np_im = feat.flatten()
Distancias
Euclidiana
La distancia euclidiana entre dos puntos en el espacio euclidio es la longitud del segmento de línea que une dichos puntos.
$$ d(x,y) = \sqrt{\sum_{i=1}^{n}(y_i-x_i)^2} $$
Cosine
$$ d(x,y) = 1 – \frac{x \cdot y}{\left | x \right | \times \left | y \right |} $$