Showing posts with label filtros gráficos. Show all posts
Showing posts with label filtros gráficos. Show all posts

Friday, May 26, 2023

El regalo de cumpleaños


Este 25 de mayo mi suegro cumple años. Siempre bromeo al respecto sobre ¿qué le das a quien ya lo tiene todo? Así que intentando dar un regalo original, decidí usar alguno de mis programas que diseñé para mi curso de Proceso Digital de Imágenes, y generé -tomando una foto del festejado- la siguiente imagen.


Todo empezó cuando leí, en un libro de proceso digital de imágenes, sobre el filtro AT&T. La historia puede leerse aquí. Eventualmente y relativamente hace poco, vi una imagen de Chaplin que usaba un filtro parecido y me dispuse a ver cómo estaba hecho. La historia al respecto la escribí aquí.

Cuando tuve la imagen final, fui a OfficeMax y pedí que me lo hicieran en tamaño póster. Lo ponen en un marco de madera y listo, tenemos el regalo final. Vamos a ver qué dice cuando lo vea. 


Detalle de la imagen




Saturday, February 25, 2023

Pepe Gordon recursivo

 Hace unos 20 años trabajé una idea para un filtro gráfico que surgió de mi investigación sobre los fotomosaicos. En ese entonces hallé que una mujer llamada Beth Clemens había creado una imagen recursiva de ella misma. Esto es, había tomado su foto, cuadriculado su imagen, poniendo la misma imagen de Beth en las pequeñas regiones de la cuadrícula, usando como base el tono de gris de esa región, el cual simulaba poniendo un brillo a la imagen original que coincidiera con ese gris. 

Esta es la image creada:

Fractal Beth

y este es el detalle de la misma:


Detalle de "Fractal Beth"


Intentando simular este efecto gráfico, que no es otra cosa que un filtro, decidí hacer mi propio software. 


El software creado...


La teoría de la creación de imágenes recursivas, es decir, imágenes que se recurren a sí mismas, (o dicho en otras palabras, imágenes creadas con otras imágenes), es verdaderamente simple. En el caso particular de imágenes creadas con la misma imagen (en tonos de gris), la teoría al respecto puede describirse de la siguiente manera:

  1. Tomar una imagen a procesar (la que llamaremos imagen fuente) 
  2. Pasarla a tonos de gris
  3. Copiar esa misma imagen 30 veces pero con diferentes tonos de gris, en un gradiente que va de muy claro a muy oscuro
  4. Hacer una rejilla en la foto original (una cuadrícula). Tomar cada pequeña región (una sección de la rejilla), y calcular el tono de gris de la misma. 
  5. Sustituir el tono de gris encontrado por la foto con el tono de gris más próximo.

Queda claro que hacer imágenes recursivas con la misma imagen fuente requiere de generar las imágenes que sustituirán regiones de puntos. Para el caso del blanco y negro es relativamente fácil, porque la paleta de tonos de grises no es mayor que 256 tonos de gris. Los componentes en gris para el negro, en RGB son R=0, G=0, B=0. Para un negro menos oscuro, por decirlo de alguna manera será: R=1, G=1, B=1, y así sucesivamente hasta llegar al blanco, el cual tendrá como componentes RGB las siguientes: R=255, G=255, B=255. En la decisión del diseño del software de fotos recursivas en tonos de gris, la ocurrencia más simplista fue usar 30 fotos con tonos de gris diferentes. 

Apliqué este programa a una foto de Pepe Gordon, uno de los mejores divulgadores de la ciencia en nuestro país, gran escritor y mejor amigo. He aquí el resultado:


y este es el detalle:

Como puede verse, la foto final puede definirse así: "Esta es una foto de Pepe Gordon hecha con la misma foto de Pepe Gordon", de ahí que se recurre a sí misma para entender dicha imagen.

Las imágenes recursivas son en realidad un subconjunto de un tema mucho más amplio. La naturaleza parece ser recursiva, se llama a sí misma y por ende, parece ser que gracias a ello la Naturaleza funciona a las maravillas. 

Va pues este artículo dedicado a Pepe Gordon. Yo sé que él valorará el resultado final.

Thursday, February 10, 2022

Inteligencia Artificial para mejorar la calidad de las fotos


Hoy en día hay toda clase de filtros gráficos. La plataforma ideal para ellos parece ser la de los teléfonos inteligentes. A la gente le gusta tomarse fotos o bien ponerse frente a la cámara de su celular y aplicar alguno de los numerosos filtros gráficos los cuales, de alguna manera, son estupendos y están muy bien escritos. 


Hace apenas un par de días encontré una app llamada Remini AI, la cual promete mejorar la calidad de las fotografías antiguas, pixeladas, borrosas, etcétera. ¿Qué tan bueno será? Y mi pregunta es legítima porque entiendo el problema, el cual lo discuto en mis clases de procesamiento de imágenes. Vamos, en esta asignatura hacemos filtros que hacen las imágenes más borrosas, las pixelean, las hacen más precisas (filtro "sharpen"), laas diterizan, entre muchas otras cosas. Pero la mayoría de estos filtros no son biyectivos, es decir, una vez aplicados no se puede recuperar la foto original.


Un ejemplo de esto es el filtro que convierte una imagen de colores en una en tonos de grises. No se puede hacer el proceso inverso. Una vez realizado el filtro se pierde la información de color y oor ello, incluso Photoshop de Adobe, pregunta si queremos continuar con el filtro porque no hay marcha atrás (aunque el software de Adobe tiene un buffer donde va guardando todo por si nos arerepentimos).  


La publicidad de Remini AI es notable:



Considerando lo anterior, decidí probar qué tan bueno era el software. ¿De verdad usará inteligencia artificial? No encontré ninguna descripción de cómo hace el trabajo, pero bueno, veamos con un ejemplo, usando una foto mía y procesándola con Remini AI en el teléfono Android que tengo.


Esta es la foto original y al lado está la foto que decidí procesar, a la que le apliqué el filtro blur (borroso) en un 23% aproximadamente.


                                        Original                                               Imagen con blur (borrosa)


Le apliqué el filtro y este es el resultado que presentó:

Efectivamente el software hace bastante bien la tarea y claramente el proceso no es muy tradicional, es decir, el software sí parece tener algunos criterios inteligentes para procesar la foto. Pero id., lector, lectora, ¿qué opina de este filtro? (he aquí la captura hecha en el teléfono):




Thursday, November 14, 2019

Convierta sus imágenes como si estuviesen pintadas con lápiz



Los filtros gráficos artísticos suelen convertir las imágenes en fotos hechas como si se hubiesen pintado como óleo, o bien, como si se usara carboncillo. He aquí el bosquejo de un filtro que busca simular una imagen como pintada con lápiz.

Los filtros sobre imágenes son básicamente transformaciones de los pixeles. Por ejemplo, se puede pasar de una imagen en color a tonos de grises mediante la conversión del color de cada pixel (con componentes rojo, verde y azul (RGB)), mediante esta fórmula:

Gris = R + G + B div 3

y colocando el valor Gris en lo que viene a ser su respectivo rojo, verde y azul.

Muchos filtros usan una matriz de valores para realizar este tipo de transformaciones. Por ejemplo, la "convolución"  es simplemente una matriz de número impar de columnas y renglones, en donde se colocan valores, los cuales se multiplican a los correspondientes pixeles, y esto permite filtros que permiten encontrar bordes, o bien, hace una imagen más borrosa, o más precisa, o bien, quitándole "artefactos", que no son otra cosa que pixeles indeseables en la imagen que se está procesando.

Hay un filtro de convolución para encontrar bordes. Sin embargo, la siguiente idea puede hacer lo mismo con menos procesamiento y de manera muy simple. Veamos: La idea es usar un filtro de esta naturaleza para hacer que se parezca a un dibujo hecho a lápiz. El algoritmo es éste:


  • Obténgase el color del pixel que queremos procesar. 
  • Obténgase el coor del pixel exactamente abajo de éste.
  • Calcúlese el promedio de los componentes R, G y B para cada pixel y tómese el valor absoluto de la diferencia de los promedios.
  • Si la diferencia entre los promedios está por debajo de un valor UMBRAL, coloque el pixel actual en blanco, sino en negro.


Pero entendamos cómo funciona el filtro. En esencia lo que se hace es sacar la diferencia entre dos pixeles y ver si esta diferencia es mayor que un valor que llamamos "umbral". Esto es equivalente a decir que si la diferencia es mayor, estamos ante un borde en la imagen, es decir, la diferencia de los dos valores resulta ser demasiado grande. En términos conceptuales el algoritmo es muy simple.

Teniendo esto definido, escribir el código correspondiente es muy fácil. He aquí el fragmento en Delphi:



Aplicando el código a una imagen (pasada a tonos de grises para hacer el trabajo más simple), se encontró el siguiente resultado:



Desde luego que este filtro dista ser uno que parezca como si la imagen se hubiese hecho a lápiz. Hay artículos técnicos muy interesantes al respecto, como éste, que usa una técnica muy elaborada.

Quien le interese jugar con mi software, escríbame a morsa@la-morsa.com y se lo mando a su correo de forma gratuita.

Saturday, November 22, 2014

Programación lúdica: sobre el desarrollo de software



En estos últimos días he estado trabajando sobre un proyectito simpático, el del Dibujante Electrónico. La idea del software es hacer una especie de sistema que dada una foto, haga una especie de bosquejo de lo que la imagen tiene. Ya expliqué aquí cómo es que el programa reconoce los elementos de la imagen (basándose en el "canny edge detector", un filtro que permite la detección de bordes en una imagen) y del cómo busca general la imagen final.

Sin embargo, una vez que escribí el "punto final" al programa me di cuenta -como ta es costumbre- que el software es ya obsoleto. Es decir, una vez que consideré que tenía una versión razonablemente estable, se me ocurrieron de inmediato nuevas cosas para hacerla más atractiva u como dicen ahora, hacerla una mejor experiencia al usuario.

La primera idea fue incorporar una cámara web que tomara fotos directamente y las pasara al programa para ser directamente procesadas. Alguna vez había intentado manejar videos en mis programas y recuerdo que ni había sido fácil y menos, que fuese posible hacer algo que funcionara para todas las cámaras web que hay en el mercado. De todas maneras me armé de valor y empecé a buscar información. Hallé un par de rutinas que  en principio, podían manejar la imagen. Eran unos componentes para Delphi. Instalé uno y no sirvió. Instalé el segundo y aparentemente las cosas funcionaron mejor. Para esto, tuve que pedir una cámara web prestada porque la mía simplemente la desconoce Windows 7 y el "driver" de la misma no funciona en mi operativo. Me prestaron una cámara de Logitech. Instalé el manejador y listo, todo funcionó correctamente. Mi programa ya podía entonces capturar una imagen para ser procesada por el robot dibujante.

No obstante esto, en algunas pruebas que hice, a veces el manejador de la cámara (que depende de Windows), no hacía correctamente la tarea y se negaba a conectarse, mandándome un error imposible de recuperar. Así, tuve que agregar una advertencia al programa indicando que esta opción era "experimental" y que se usase en esos términos. Hice pruebas en otras máquinas y encontré que con las webcam de Logitech todo funciona correctamente. Probé en mi laptop y a pesar de que el manejador no parece ser el mismo que se usa en Windows 7, las cosas no fallaron. En cambio, en una tablet Iconia, de Acer, con Windows 8, mi programa nunca pudo conectarse con el manejador de la cámara.

Dejando este problema a un lado, le agregué una nueva opción que llamé "herramientas", en donde por lo menos ahora se puede cambiar el color del pincel con el que el programa pinta. Supongo que en la medida que se me vayan ocurriendo nuevas funciones, ahí las pondré. Se me ocurre tener un catálogo de "pinceles" para hacer más flexible la manera de pintar, por ejemplo. Le cambié a todo esto la "piel" a la aplicación y le puse un icono más ad hoc con la idea del software. Ahora se ve mejor el resultado final.

Me faltan cosas, sin embargo. Por ejemplo, no me convence la manera en que el robot dibujante pinta. Me gustaría que pintara más como un dibujante y no "barriendo" la imagen. Eso le daría al usuario elementos para ver a un verdadero robot dibujando. Otra cuestión que he estado pensando y que hay que incorporar en algún momento, es que el programa no pinte exactamente la imagen que ve, sino que se desvié un poco de la misma, haciendo ver "más humano" al programa y no tan perfecto. Esto último sin duda me parece de lo mas atractivo.

Como puede verse, sigue siendo cierta la idea de que todo software acabado es obsoleto. Y aunque no es la última aplicación, la "killer application", me ha enseñado a programar cosas que antes ni idea tenía de cómo hacerlas.

A quien le interese el programa, escríbame a morsa@la-morsa.com y se lo envío a vuelta de correo.

Wednesday, April 10, 2013

El efecto AT&T y un nuevo reto de la programación lúdica

En 1988 Gerard Holzmann escribió un interesante libro sobre procesamiento de imágenes: "Beyond Photography - The Digital Darkroom". Pocos años antes, el autor trabajó con Rob Pike, Dennis Ritchie, Ken Thompson, entre otros, en los Laboratorios Bell, que a la postre lo adquiriera la empresa ATT. Debe haber sido fascinante interactuar con toda estas gente que trabajaba en tecnología con una pasión desbordada. Ahí nació, por ejemplo, el sistema Unix y el lenguaje C, que no son poca cosa. Hasta donde recuerdo, los Laboratorios Bell tenían a 8 premios Nobel entre sus empleados.



El libro de Holzmann se puede conseguir en Amazon, pero nuevo cuesta 133 dólares. Hay copias usadas por unos 10 dólares. Sin embargo, el propio autor ha puesto una copia en pdf de forma gratuita, y que puede consultarse aquí.

En dicha obra, el el capítulo 4, Holzmann se dedica a experimentar con diferentes filtros gráficos. Muchos de ellos eran meros experimentos bajo la premisa "a ver qué pasa si aplicamos esta ecuación sobre la imagen". Y probablemente muchos de esos experimentos no fueron publicados. Sin embargo, uno de ellos me pareció interesante. Cito al autor en la página 42: "Por alguna razón, el retrato de Peter Weinberg siempre fue el objetivo principal en nuestro experimentos de edición de imágenes.  Todo empezó un par de años antes cuando Peter ascendió a jefe del departamento y a su notoria distracción de dejar su cuadro con su imagen en cualquier parte. Una tarde de sábado, que estábamos bromeando, Rob Pike y yo empezamos a hacer fotocopias de dicha fotografía de Peter, enfatizando la jerarquía administrativa existente cuando preparábamos una gráfica de la estructura de los Laboratorios Bell. Jugando poníamos a Peter en todos los posibles puestos. El propio Peter pronto se dio cuenta de esto y debe haber llegado a la conclusión de que lo mejor que podía hacer era no reaccionar a este asunto. Así al menos él esperaba que su imagen no fuese aparecer magnificada en alguna de las torres de agua del Laboratorio. No obstante, la foto de Peter aparecía y desaparecía en los lugares más extraños.

Un par de semanas después de que ATT revelara el nuevo logotipo corporativo, Tom Duff hizo una imagen de Peter al estilo de dicho logo y se convirtió en el símbolo de nuestro centro de trabajo. Rob Pike mandó hacer camisetas con la foto "ATT-izada" de Peter y Ken Thompson ordenó tazas de café con el logo de Peter. E inevitablemente el 16 de septiembre de 1985 apareció el logo de Peter en una de las torres de agua".

¿Cómo se pueden hacer imágenes de las personas basadas en el logotipo de ATT? Aparentemente Duff fue el autor del filtro y Holzmann no indica cómo se hizo. En consecuencia, hubo que partir de cero información. Consideremos la imagen original y el resultado mostrado por Holzmann:



El logo de ATT es éste:


A partir de esto es claro que las imágenes deben ser de blanco y negro estrictamente. La solución es pues una combinación de filtros. He aquí los pasos a seguir:

  1. Tómese una imagen
  2. Si es de color, pásese a tonos de gris
  3. Ya en tonos de gris, aplíquese el filtro alto contraste
  4. A esa imagen resultante, aplíquese el filtro ATT

Pasar a tonos de gris una imagen es uno de los filtros más comunes. En una imagen en tonos de gris tenemos que cada pixel tiene en sus componentes R=G=B, es decir, la tripleta (Rojo, Verde, Azul) (o (R,G,B) por sus siglas en inglés), tiene los mismos valores. Las imágenes de tonos de grises contienen a lo más 256 tonos diferentes (de (0,0,0), el negro, al (255,255,255) el blanco). Aquí hay dos formas de hacer esta transformación, usando para cada pixel una de las dos posibles ecuaciones:

(1) Gris = (R + G + B) / 3
o
(2) Gris = (0.30 * R) + (0.59 * G) + (0.11 * B)

Ahora bien, una vez teniendo la imagen en tonos de grises, aplicar un filtro alto contraste es fácil. Se recorre la imagen pixel por pixel. Se calcula el número de color, el cual se basa en la siguiente fórmula:


Número de color = (65536 * R) = (256 * G) + (B)

donde las componentes en el modelo R,G,B son: R el componente en rojo, G el verde y B el azul. Si éste número de color es mayor de 8 millones, entonces ponemos un color blanco. Si es menor de ese número, ponemos un color negro. Así, una imagen en tonos de grises se transforma en una imagen en blanco y negro, como en el siguiente ejemplo.


Y ahora está el problema de crear la imagen usando un filtro “ATT alike”. Pero aquí no diré cómo hacer esto (hasta que acabe el reto). Cuando aparezcan los resultados explicaré el filtro a detalle. Es decir, parte del reto es discurrir cómo se puede hacer un filtro de esta naturaleza y no sólo seguir la descripción que pueda hacer yo del mismo. Así pues, el reto tiene este giro adicional, con respecto a retos anteriores.

Los resultados fueron bastante satisfactorios y además, el software crea este tipo de imágenes de forma relativamente rápida. Por ejemplo, he aquí la imagen procesada con regiones de 9 pixeles y otra con regiones de 20 pixeles. Mientras más pixeles por región, más anchas son las franjas oscuras. ¿Cuál de los dos resultados le gusta más?
                 9 pixeles                             20 pixeles

Considerando todo esto, el siguiente reto de la programación lúdica es hacer el filtro ATT. En este caso no se describe cómo funciona ese filtro ATT y el programador que participe debe hallar cómo generar dicho filtro. Es decir, se complica un poco más el asunto, pues la descripción del filtro no se da. Cada quien tendrá que hallarla. Así pues, este reto es aún más complejo que el del filtro óleo.

He aquí las bases adicionales del reto:

  • Ganará el programa que transforme la imagen de Peter Weinberger (que aparece más abajo), en el menor tiempo posible. El segundo mejor tiempo obtendrá el segundo lugar. Desde luego, el resultado debe estar de acuerdo con la definición del filtro ATT del cual hemos hablado.
  • Habrá dos lugares: Ambos se llevarán una taza con el logotipo de La_Morsa. Mi intención es que al imprimir esas tazas aparezca una leyenda con el título de la misma y el lugar obtenido, para que quede constancia por el tiempo de vida de la taza.
  • Los programas pueden hacerse en cualquier lenguaje de propósito general y no se vale usar en éste particularmente, bibliotecas que hagan filtros gráficos. Los programadores tienen que resolver el problema por sí mismo, sin ayuda de bibliotecas externas. (Desde luego, se vale usar alguna biblioteca para cargar/guardar la imagen de Weinberger para procesarla, la cual es un JPG, pero nada más). Así pues, C, C++, C#, Pascal (Delphi), Javascript, Python, Ruby, Visual BASIC, Visual C, Java, etcétera, son idóneos para esta labor.
  • Los autores de los programas deberán mandar el código fuente y el archivo ejecutable en Windows 7.
  • Un autor puede mandar versiones mejoradas de su propio software dentro del tiempo del concurso. No se tomarán en cuenta las que se salgan del tiempo establecido.
  • En la medida de lo posible, el programa debe indicar el tiempo total del proceso realizado para crear la imagen tipo logo de ATT de Weinberger
  • El autor debe enviar el código fuente y quienes ganen aceptan que su código quede accesible para quien lo quiera ver.
  • Los programas deben poderse ejecutar en el sistema operativo Windows 7 de 32/64 bits. Se correrán en una máquina AMD con 6 núcleos y los resultados obtenidos son inapelables y definitivos. De nuevo aclaro: este es un reto de buena fe y no un concurso estrictamente. Los premios son meramente un estímulo extra para que se animen a entrarle al reto. Evidentemente asumo que el código de cada concursante es creación del mismo y que no andan copiando el código de otras partes, foros, sitios en Internet, etcétera. En caso de hallar que el código fue copiado, el programador queda descalificado.
  • El reto dura una semana a partir del día de la publicación del artículo. Por ejemplo, si éste se publica un 10 de mayo a las 3 de la tarde, el reto se cierra el 17 de mayo a esa misma hora.
  • Cuando reciba algún programa participante en el reto, le enviaré un acuse de recibo para asegurarnos que están todos los que son y son todos los que están.
  • El concurso es para quienes viven en la República Mexicana. Si alguien de otro país quiere participar es bienvenido, pero no podrá acceder a los premios (puede haber excepciones).
  • Los programas deben ser enviados a morsa@la-morsa.com o en su defecto a lopem@hotmail.com, por si alguna de las direcciones no funciona.
Así que queridos y entusiastas programadores, a entrarle al reto. Afilen sus herramientas de programación y que gane el mejor.

Imagen a procesar:


A quien le interese el filtro ATT, puede pedírmelo a morsa@la-morsa.com y a vuelta de correo lo recibirá sin costo alguno.

Wednesday, February 27, 2013

Generador de fotografías antiguas


La fotografía tuvo un balbuceante inicio. Las primeras fotografías, si mal no recuerdo llamadas daguerrotipos, eran de pésima calidad, en blanco y negro. La razón de esto es que no se sabía lo que hoy sabemos de química y de N productos químicos que permiten impresión en color, con una gran resolución si se necesita. Hoy, ya en el siglo 21, la fotografía ha evolucionado a grados insospechados y no es para asustar a nadie que se puedan conseguir cámaras de 16 megapixeles por unos cuantos cientos de dólares.

Así pues, hay un largo camino desde las primeras fotografías a las que se pueden hacer actualmente. Hace no muchos años, en el tiempo en donde aún no se podían conseguir cámaras digitales, era común que la gente fuese a establecimientos específicos de fotografía, a imprimir sus placas. Con la llegada de las cámaras digitales, el esquema cambió. Ahora todas las imágenes pueden verse en la computadora y para imprimirlas, pues usamos papel normal e impresoras de colores, ya sean de inyección de tinta o laser. Hay, desde luego, papeles fotográficos, que dan mucha más calidad a las fotografías digitales, pero es claro que esto es más costoso y es para un público muy especializado.

El tiempo en el que la gente común y corriente mandaba a imprimir sus fotografías a establecimientos dedicados a esto han pasado. Ya de hecho prácticamente no existen y quienes tengan fotografías de ese época verá con cierta nostalgia que los colores van cambiando. El paso del tiempo hace que en cierta medida se pierda brillantez en las fotos impresas. Si nos remontamos a más años en el pasado, veremos que las fotografías en blanco y negro pasan a decolorarse y adquieren un color sepia.

El Programa

Pues bien, el Generador de fotografías antiguas hace precisamente esto: convierte una imagen digital en su equivalente en sepia, como si hubiesen pasado muchos años sobre esa foto. El efecto es interesante y realmente sencillo de hacer.

El programa requiere una fotografía en color o blanco y negro digital, es decir, un archivo BMP o JPG. Una vez cargada ésta al software, se puede cambiar un parámetro que permite hacer más o menos sepia la imagen. Al oprimir la opción de Procesar, el sistema mostrará la imagen avejentada, en color sepia, como si le hubiesen caído los años encima.

El programa permite grabar el resultado final en un archivo JPG.

La imagen aparece distorsionada en la pantalla si es más grande que la que el software presenta, pero puede eliminarse la distorsión usando la opción 'stretch', que es una especie de interruptor, que se apaga o se prende, llamándolo una y otra vez.

Es un programa sencillo, que técnicamente implementa el filtro sepia.

A quien le interese puede pedírmelo a morsa@la-morsa.com y se lo mandaré de forma gratuita a vuelta de correo.