Monday, September 06, 2010

Fotos recursivas en color real

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:

  • Tomar una imagen a procesar (la que llamaremos imagen fuente)
  • Pasarla a tonos de gris
  • Copiar esa misma imagen 20 veces pero con diferentes tonos de gris, en un gradiente que va de muy claro a muy oscuro
  • Hacer una rejilla en la foto original. Tomar cada pequeña región (una sección de la rejilla), y calcular el tono de gris de la misma.
  • 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 20 fotos con tonos de gris diferentes. Para el efecto deseado fueron suficientes. Sin embargo, si quisiera hacer lo mismo con fotos a color ¿qué habría que hacer?

Sin embargo hay un grave problema de la recursión a color. Básicamente la dificultad reside en que la gama de tonos que hay que tener presentes crece muy rápido en color que en blanco y negro. Mencionamos antes que 256 tonos de gris son más que suficientes para pintar una imagen blanco y negro. Sin embargo, en color, las cosas son muy diferentes.
Si se quisiera tener una gama completa de imágenes (la misma imagen) con diferentes colores, ¿cuántos colores necesitaríamos usar? Una computadora personal puede desplegar actualmente millones de colores. Desde luego, no vamos a poner esa cantidad de imágenes. Quizás un cálculo conservador podría ser 256 para el Rojo, 256 para el verde y 256 para el azul. Eso hace que la cantidad de imágenes a crear sea de 768 mínimo, considerando que dejaríamos muchos colores fuera del espectro de trabajo, las cuales puede ser costoso en tiempo y espacio en disco. ¿qué otra posible solución existe? La solución es verdaderamente simple: usar una paleta de colores disminuída. Esa paleta es con la intención que quien ve en una computadora un color, en otra, de otra marca, vea exactamente los mismos colores. Dicha paleta se llama websafe, y consta de 216 colores y esto da un buen margen para una gama reducida, pero razonablemente completa de los siete colores del arco iris. Desde luego que la paleta de colores websafe ya no es necesaria considerando que las tarjetas de vídeo manejan millones de colores y así, dicha paleta resulta inútil en términos generales, pero para esta aplicación, resulta formidablemente buena. El programa de imágenes recursivas con 216 colores puede verse descrito aquí.

El procedimiento para crear una imagen recursiva de 216 colores, con la webpalette es: Tomar una imagen a procesar (la que llamaremos imagen fuente)
  • Copiar esa misma imagen 216 veces pero filtrando cada imagen con un color websafe diferente. Este filtro es equivalente a poner una mica de un color específico sobre la imagen original.
  • Hacer una rejilla en la foto original. Tomar cada pequeña región (una sección de la rejilla), y calcular el color promedio de la misma.
  • Sustituir la región analizada por la foto con el color más próximo.
Loas resultados obtenidos con este esquema son suficientemente buenos. Sin embargo, me pregunté ¿qué pasaría si pusiese colores reales. Evidentemente no sería buena idea generar 16 millones de tonos de color, como en el caso de las fotos recursivas en 216 colores. En lugar de eso, lo que puede hacerse es leer cada región, sacar el color promedio y entonces generar una foto con ese color promedio.

Si por ejemplo, tengo una imagen de 500x500 pixeles y decido que cada región tiene 10x10 pixeles. Tendré entonces 50x50 imágenes, es decir, un total de 2500 imágenes diferentes, cada una con los colores promedio de cada región. Esa cantidad de imágenes es más de diez veces las 216 imágenes originales, y en un caso poco usual, si cada región tuviese un promedio diferente, tendría que generar esas 2500 imágenes.
Sin embargo, la experiencia dice que muchas regiones repiten el color promedio. Así, podríamos solamente crear las imágenes que solamente tienen un color único. El problema que entonces surge es como no repetir imágenes. Grabar cada imagen con un número diferente (que son las que forman la biblioteca de imágenes, obliga a después a escribir un programa que las compare cada una con todas las demás y entonces se complica el asunto. Así, se me ocurrió que cada imagen de la biblioteca puede llamarse como su equivalente en color en hexadecimal. Así, una imagen prácticamente negra se llamará en el disco "000000.jpg". Una que tuviese un color específico podría ser "FF98CA.jpg".
Así pues, si se le asigna al nombre de cada imagen promedio filtrada con la imagen original, el color en hexadecimal, entonces si ésta se repite, sobreescribiría la imagen que ya estaba en disco. De esta forma en el disco quedarán solamente los colores únicos de la imagen procesada.
Hice pruebas con este criterio y he aquí los resultados:

Dar click en la imagen para hacer zoom

La imagen de la derecha es la imagen a procesar, la original pues. La de la izquierda es el resultado del proceso usando colores reales y la del centro es usando 216 colores. El resultado mejora bastante con respecto a 216 colores.

Dar click en la imagen para hacer zoom

De nuevo, puede verse a la derecha la imagen original, en medio al imagen con 216 colores y a la izquierda, la imagen con colores "reales". De nuevo, aunque no parece muy significativa la diferencia, en realidad el resultado es mejor.

A quien le interese este programa, escríbame a morsa@la-morsa.com y se lo enviaré sin ningún costo a su correo.

6 comments:

Francisco said...

De este y varios posts veo que conoces de manejo de imágenes digitales.
Estoy buscando la manera de visualizar los resultados de ciertas simulaciones en las que estoy trabajando. Son autómatas celulares en 2D, con 400x400 sitios. Cada uno de estos sitios, tiene asociado una propiedad que cambia con el tiempo. Específicamente es un campo escalar que llamamos "fase". En fin, puedo explicar con más detalle si lo deseas pero el caso es que mi simulación arroja al tiempo t los 160,000 valores de la fase y necesitamos ver su distribucióne espacial.
El siguiente paso es ligar varias de estos imágenes con algun otro software de manera que se haga una "película" de la simulación, pero por el momento me conformo con la primera parte.
Sabes de algún software que haga esto?
Gracias y saludos,

Morsa said...

Francisco,

Mi tesis de licenciatura fue sobre autómatas celulares en una dimensión. Creo entender algo de tu problema, pero escríbeme a morsa@la-morsa.com y discutimos el asunto, a ver si puedo ayudar en algo.

saludos
Manuel

biani said...

Hola Manuel


Lo que me vino a la mente después de leer tu blog es que con el tiempo nos hacemos mas diestros y es posible que las cosas que hicimos en el pasado mejoren...

Felicidades por tus logros.


Estoy escribiendote por que he estado pensando en algunas cosas relacionadas con el universo y de repente viendo algunas explicaciones de las lentes gravitacionales tuve una duda que no puedo aclarar.

En la creación de universo según el big bang, la materia fue arrojada desde un origen en todas direcciones.

se ha observado que el universo se encuentra en expansión, ¿se conoce en que dirección apunta el origen del universo?

la luz que recibimos de estrellas distantes en el universo tarda millones de años en llegar a nosotros es por eso que tenemos una imagen del pasado.

¿obtenemos imágenes del pasado en todas direcciones?

A que velocidad se propago la materia por el universo?

Si fue a velocidades mayores a la de la luz, como se convirtió la energía nuevamente en materia?

por que las galaxias siempre tienen un eje axial? creo que la convergencia del campo gravitacional obliga a eso pero si ahora se sabe que en el centro de cada galaxia usualmente existe un hoyo negro, ¿por que el campo gravitacional que genera tiene tal eje axial, eso parece que es determinado por una fuerza mayor, como en una coladrera el eje axial del campo obedece al campo gravitacional de la tierra. el eje axial de una galaxia obedece a un campo distinto, mas fuerte que el gravitacional.

en fin creo que divago demasiado pero en verdad me apasiona esto, espero que te sean interesantes estas preguntas.

saludos.

Morsa said...

Biani,

Gracias por tus palabras.

Contesto, en la medida de lo que sé, tus preguntas:

P: ¿se conoce en que dirección apunta el origen del universo?
R: No se sabe, hasta donde entiendo. De hecho, hay algo extraño que no sé qué explicación tenga. Desde la Tierra, todo se aleja de nosotros. Si el Universo estuviese en expansión, ¿por qué no se acercan unos objetos y se alejan otros? Es como si fuésemos el centro de la gran explosión, cosa por demás extraña.

P: ¿obtenemos imágenes del pasado en todas direcciones?
R: Sí, porque todo se está alejando de nosotros. Vemos un Universo que ya pasó.

P: A que velocidad se propago la materia por el universo?
R: A la velocidad de la luz. Ésa es la velocidad límite del Universo, hasta donde sabemos. Se han buscado los taquiones, que son partículas que irían más rápido que la luz. Sin embargo, los resultados son polémicos.

P: Si fue a velocidades mayores a la de la luz, como se convirtió la energía nuevamente en materia?
R: No tiene sentido tu pregunta mientras sea válido el postulado de que velocidad de la luz es la velocidad límite.

P: por que las galaxias siempre tienen un eje axial?
R: No sé. Ni idea.

saludos
Manuel

Francisco said...

P: ¿se conoce en que dirección apunta el origen del universo?
R: No se sabe, hasta donde entiendo. De hecho, hay algo extraño que no sé qué explicación tenga. Desde la Tierra, todo se aleja de nosotros. Si el Universo estuviese en expansión, ¿por qué no se acercan unos objetos y se alejan otros? Es como si fuésemos el centro de la gran explosión, cosa por demás extraña.

A mí me lo explicaron o lo leí en algún lado con la siguiente imagen. Imagina que el universo es la superficie de un globo que se está inflando (en esta imagen el universo es la superficie, el globo mismo, no el volumen contenido) y sobre el que está dibujados con tinta puntitos que representan las galaxias. En este globo todas las galaxias se están alejando de todas y cada una de ellas parecería ser el centro de expansión.

Morsa said...

Francisco,

La explicación parece sencilla, pero pensemos... ¿No deberíamos ver estrellas que se acercan hacia nosotros? ¿por qué todo se aleja, como si fuésemos el centro del big bang? No me queda claro nada.

saludos
Manuel