Una imagen es una tabla de números
Este episodio llevaba como un mes queriendo hacerlo. Me gusta la fotografía, he trabajado con Photoshop y con programas de diseño, y siempre tuve la curiosidad de cómo funcionan esos filtros por dentro. No conozco todas las funciones, pero he programado varias de ellas, y resulta que la idea central es mucho más simple de lo que uno esperaría.
Qué es una imagen
Según Wikipedia, una imagen es una representación visual de un objeto real o imaginario. Un libro, una mesa, una silla. O un unicornio, un minotauro, un dragón.
En digital eso se vuelve algo extraño: una imagen es un tablero de números.
El ejercicio de Excel
Imagínate que abres Excel y empiezas a llenar números del 0 al 255 en todas las casillas. Mil casillas a la derecha, unas setecientas cincuenta hacia abajo.
Todo eso es tu imagen. Cada valor es un píxel, y esos píxeles combinados son lo que ves en la pantalla.
Eso es una imagen en blanco y negro, que es la más simple de representar.
El color son tres tableros
Para color, la forma más común es RGB: rojo, verde y azul. Son tres tableros iguales al anterior, uno por canal, superpuestos.
Cada píxel deja de ser un valor y pasa a ser una combinación de tres valores que determina su color.
(Al aire lo deletreé como "Red, Blue, Green". El orden correcto es Red, Green, Blue.)
Por qué 0 a 255
Porque estamos hablando de imágenes de 8 bits: ocho espacios de memoria de ceros y unos para guardar cada valor.
Con 8 bits hay 2⁸ = 256 combinaciones posibles. Como la primera es el cero, el rango va de 0 a 255.
Existen otros formatos —transparencia, mapas de bits, imágenes vectoriales— y otras formas de representar el color, incluyendo mapeos propios. Pero con este estándar ya alcanza para hacer casi todo lo que sigue.
Qué se puede hacer con eso
Una vez que aceptas que es una tabla, cada efecto se vuelve una operación aritmética sobre la tabla:
El histograma, que cuenta cuántos píxeles oscuros y cuántos claros hay, y que es lo que en realidad estás mirando cuando alguien dice que una foto "está bien expuesta". Ahí está lo que se pierde al saturar y cómo estirarlo para ganar contraste.
El desenfoque y los bordes, que son la misma operación con distintos números adentro: una ventanita que se desliza sobre la imagen. Se llama convolución y es más simple de lo que suena.
El sharpening, lo contrario del desenfoque: resaltar bordes y detalle. Las arrugas y los poros en un retrato, los hilos de una tela. Es lo que hace ese deslizador en Lightroom o en cualquier programa que tenga la opción.
Un detector de movimiento, que se consigue con una resta y nada más. Con una webcam y una foto del cuarto vacío.
Todo esto vive dentro del álgebra matricial, que es muy parecida al álgebra normal salvo que en vez de un dato usas un tablero de datos: multiplicas una imagen por otra, sumas imágenes, restas imágenes.
Un dato que sí me sorprendió
En esa época estaba usando procesamiento de imágenes para un cliente, y como el proceso es píxel por píxel, en CPU se hace en secuencia y tarda muchísimo. Al pasarlo a GPU —procesando bloques de píxeles a la vez— vi simulaciones que corrían en 30 segundos bajar a 0.12 segundos.
Con una advertencia que ya me había encontrado antes: lo caro es manejar bien la memoria. Las operaciones en sí son increíblemente rápidas.
Y la regla que más uso
Es más difícil recuperar información de una foto que es mala desde el principio.
Si tomas una buena foto, mejorarla en edición es fácil. Si la tomaste mal, no hay filtro que invente los datos que no capturaste: los blancos saturados son 255 y ya, no hay nada abajo de ese número.
Por eso, cuando trabajas con imágenes —para industria o para arte— vale muchísimo más la pena controlar el ambiente antes que arreglarlo después.
(Al aire dije que una imagen HD es "1080 por 800 algo" y añadí que no me creyeran. Hice bien: el dato está mal.)
Este texto sale del episodio 007 del Podcast Algoritmos. Durante años el título del video en YouTube dijo "(OpenCV)", una palabra que nunca aparece en el audio: ahí sólo hablo de "una librería libre, en python". Ya lo corregí.