El Zoom de película

¿Cuantas veces habéis visto una peli donde un detective comienza a hacer zoom con el ordenador sobre una foto hasta que se ven 4 pixeles gigantes y de repente esos 4 pixeles se arreglan mágicamente y sale la imagen de un sospechoso? A mi me pone de los nervios que hagan eso en una película seria, porque es imposible hacer un zoom infinito digital a partir de un bitmap; de lo contrario los satélites de USA podrían vernos hasta la caspa y el tito Bin Laden estaría ya capturado. Incluso en CSI, una serie donde todas las investigaciones se basan según ellos en el método científico, hay algunos capítulos donde se ha usado el típico «zoom mágico de película» (Como lo llamo yo) para encontrar sospechosos. Veamos un ejemplo clásico de Zoom mágico de película:

  
Tranquilo Grisom que ya tenemos la foto de satélite, esto se arregla con un par de Zooms!
(Por ahora todo normal, ahora viene el Zoom de peli que arregla los cuatro pixeles del final)

  

¡¡Aiba la ostia, está echado a la bartola mirando al satélite !! (Sonrisita típica de Grisom)
(Aquí tenéis el ejemplo clásico de Zoom de peli imposible de realizar)

Esto, evidentemente no se puede hacer, si pensáis que sí que se puede intentadlo xD. Pero yo creo que a partir de la tercera foto del ejemplo se ve claro que tenemos muy poca información de la cual es imposible sacar nada. Vamos a ver algunas de las técnicas más avanzadas que existen hoy en día para restaurar fotos que seguramente vendrán como filtros en las próximas de versiones de Photoshop, Gimp, Photopaint, y similares. Al final veremos un intento avanzado para realizar un Zoom de película. Toda la información está sacada de una tesis de un francés que me pasó mi compañero de carrera Mariano.

En esta tesis se utilizan técnicas para generar vectores de información de la imagen, de esta forma, si falta información (píxeles fallidos), ésta se puede generar a partir de los vectores circundantes. Veamos un ejemplo práctico donde en el ojo izquierdo existe ruido y en el ojo derecho se ha eliminado.

Aquí no hay ninguna magia, simplemente se «inventa» la información de los píxeles fallidos (Ruido) a partir de los píxeles circundantes con técnicas avanzadas. Por ejemplo, si todos los píxeles de la zona son rojos y aparece uno verde, lo más normal es que éste sea rojo también. Los típicos filtros para eliminar ruido utilizan técnicas similares.

Diréis que esto no es nada nuevo, pero la siguiente secuencia de imágenes es realmente impresionante. Vemos como utiliza sus técnicas de eliminación de ruido para eliminar trozos grandes de imágen que no desea.

  

Tampoco hace magia, fijaros que utiliza una máscara para indicarle al programa las zonas que no desea. Después el algoritmo rellenar las zonas de la máscara con la información más adecuada.

Finalmente veamos como INTENTA utilizar las técnicas de su tesis para hacer un Zoom de película. Para que no le quede muy mal utiliza imágenes de una película de dibujos animados

 

Fijaros que se ha conseguido eliminar la pixelación consecuencia del Zoom pero la imagen queda algo difusa. Usando un sistema como el de CSI habríamos conseguido una imágen final totalmente nítica 😉

Os recomiendo que visitéis la web donde vienen todas las imágenes.

Blogs de Alicante

Últimamente los Blogs de Alicante estamos comenzando a organizarnos. Ya tenemos una comunidad en Orkut que fundamos hace 2 meses y un wiki cortesía de Enrique Barbeito. Aquí tenéis la última lista de blogs, todos ellos de Alicantinos que tratan temas muy diversos:

Si no estás en la lista apúntate en el wiki

Recursos para aprender Japonés

Como me voy a Japón en septiembre estoy estudiando el idioma con mucha motivación. Además, gracias a Internet la tarea se hace mucho más «sencilla» y amena. Para todos los públicos recomiendo una pequeña introducción a la lengua japonesa que os pondrá más en contacto con la cultura asiática. Si alguno de vosotros está tan loco como para querer aprender realmente Japonés aquí van algunas de las páginas web que me facilitan la vida:

  • Nipoweb – Con cursos de japonés y todo tipo de documentación sobre su cultura
  • Gunkan – Curso de japonés
  • Gorinkai – Curso muy básico (Lo podéis leer solo como curiosidad)
  • Rikai – Traductor de Kanjis
  • Slashdot.jp – Comunidad de geeks japoneses

Tumiki Fighters y el lenguaje de programación D

Estas vacaciones mi hermano, al que le gusta mucho jugar encontró en una web japonesa el Tumiki Fighters. Uno de los juegos más originales que he visto en los últimos años (Últimamente solo se preocupan por crear gráficos impactantes). Es un juego de naves pero podemos ir cogiendo los trozos de las naves enemigas para ir aumentando nuestro poder. Es como una mezcla de juego de naves y el Tetris por muy raro que pueda sonar. Funciona con los Cursores y la tecla Z para disparar.

Los jugones ya tardáis en bajaros el juego y superar mis 105.200 puntos y los 111.300 puntos de mi hermano. Y para los programadores va dedicada la nota técnica que sigue.

El juego es libre y está programado en un lenguaje de programación que había oído hablar muy poco de él. Se trata del lenguaje D,e intenta conjuntar lo bueno de Java y C++ eliminando los males de ambos (Se supone que C# debería haber cumplido esta mision). Parece que promete bastante viendo la comparativa con otros lenguajes similares. Aquí teneis la web desde donde os podéis bajar el compilador tanto para plataformas Unix como Windows y aquí está la referencia completa del lenguaje. Para los valientes queda la tarea de compilar el juego para que funcione en Linux.

Lógica Difusa – Fuzzy Logic

El post es un poco duro pero si leéis todo el artículo seguro que aprendéis cosas nuevas.

Hasta el siglo XX la lógica clásica se trabajaba con dos valores: Verdadero (1) o Falso (0). Pero durante el último siglo se comenzaron a crear nuevas lógicas que incorporaban más valores de certeza, por ejemplo la lógica de Lukasiewicz incorpora un nuevo valor, el de Medio Verdadero o Medio Falso según se vea. De esta forma ya tenemos tres valores (Estas lógicas se suelen llamar trivalentes) : Verdadero (1), Medio Verdadero (0.5) o Falso (0). Lo primera primera idea que nos viene a la cabeza es la seguir creando nuevos valores de verdad como vemos en la imagen donde ya tenemos 5 valores de verdad. Por ejemplo si una cosa sabemos casi seguro que es verdadera le asignaríamos el valor de verdad 0.75.

Si extendemos la idea a infinitos valores entre el 0 y el 1 hemos descubierto la Lógica Difusa. ¿Y para que coño sirve esta paranoia mental? Eso mismo pensaba la comunidad científica a mediados del siglo pasado, nadie apostaba un duro por la la Lógica Difursa. Pero llegaron los japoneses (Años 70) y le dieron utilidades prácticas que se usan hoy en día en todo el mundo. La primera aplicación práctica que le dieron fue la de frenar electrónicamente y con suavidad el Shinkansen (Tren bala) japonés.

Para frenar un coche normalmente vamos soltando el acelerador suavemente mientras frenamos suavemente calculando nosotros intuitivamente los que tardaremos en frenar etc, pero no solemos apretar el freno a fondo para frenar. Para hacer un programa que frenara un coche o un tren de forma automática lo primero que podríamos hacer sería: if(quieroParar) frenar(); . Esto haría que se frenara a lo bestia. Una mejora sería if(quieroParar & Velocidad_Alta) frenar_hasta_la_mitad(); else if(quieroParar & !VelocidadAlta) frenar_a_tope(). Si siguieramos introduciendo ifs hasta el infinito creando nuevos valores de Velocidad (Al igual que hacíamos al principio del artículo con los valores de Verdadero,MedioVerdadero, Falso etc) conseguiríamos un sistema fuzzy pero sería una chapuza. El ejemplo anterior es simplemente para que veais que frenar suavemente un tren de forma programada no es tan sencillo como podamos pensar a primera vista.

Veamos como hay que proceder para implementar un buen sistema fuzzy. Tener en cuenta que a partir de ahora trabajamos con números reales, es decir, entre el 100 y el 75 hay más valores, etc…


El eje vertical indica el valor de verdad de cada velocidad. El eje horizontal la velocidad.

En vez de explicar este esquema detenidamente, lo vamos a ver con un ejemplo práctico. Imaginaros que el tren viaja a 77km/h, operaríamos de la siguiente forma:

Buscamos en el eje horizontal la velocidad a la que vamos (77) y trazamos una vertical marcando las intersecciones con los triángulos. A partir de las intersecciones tomamos su valor de verdad mirando el eje vertical. En este caso tenemos dos intersecciones, la primera intersecta con el triángulo de Velocidad Media a una altura de 0.20 (Lo vemos en el eje vertical), la segunda intersección corta con el triángulo de Velocidad Alta a una altura de 0.45. Por lo tanto la consideración del sistema es que si vamos a 77 Km/h nuestra velocidad es 0.2 Media y 0.45 Alta. Es decir, hemos conseguido que el sistema tenga una estimación ‘difusa’ de la velocidad actual. Probad a sustituir otros valores de velocidad y veréis como lo que se obtiene tiene bastante sentido, si ponemos por ejemplo 98km/h saldrá un valor de 0.90 Alta etc.

Veis como hemos conseguido que el sistema pueda saber en cada momento una consideración sobre la velocidad que llevamos. A partir de los valores obtenidos se puede tomar ya una decisión sobre cuanto hay que pulsar el freno (Para explicar esto necesitaría unos cuantos posts ya que habría que crear otro esquema como el anterior para los valores del freno y combinarlo todo). Lo importante se que os quedéis con la idea de que al tener muchos valores entre Verdadero(Velocidad Alta) y Falso (Velocidad Lenta) podemos conseguir frenar de forma suave.

Si quisieramos tener un sistema más preciso (que frenara más suavemente) podríamos crear más triángulos que indicarna Velocidad Muy Alta, Velocidad Muy baja etc. Veamos un ejemplo para el diseño de un sistema de aire acondicionado. Con un aire acondicionado si queremos ahorrar energía y que los cambios de temperatura no sean muy bruscos se puede usar un sistema fuzzy para regular de forma automática su funcionamiento. Si programamos el aire acondicionado con if(temperatura>18) enfriar(); else calentar(); gastaremos mucha energía ya que estaremos continuamente pasando a más de 18 grados y después a menos de 18 grados, necesitamos un sistema fuzzy 😉 Veamos como sería el esquema fuzzy de un sistema de aire acondicionado:


Supongo que con este esquema ya habréis pillado la idea, o quizás os he liado más.

Finalmente os muestro algunas aplicaciones prácticas además de las ya comentadas. Entre paréntesis pongo una pregunta para que veáis el porqué se usa un sistema fuzzy en estros aparatos.

Hoy en día los sistemas de lógica difusa están en las camaras de fotos para calcular si llega mucha o poca luz al diafragma (¿Poca, bastante, mucha luz?), en robots para que se muevan con suavidad (¿Velocidad del brazo Alta, Baja?), en sistemas de piloto automático y ontrol de aviones (¿Altura del avión Baja, Alta, Muy Alta?) o por ejemplo el sistema que acaba de sacar Toyota para aparcar automáticamente el coche (¿Cerca, Lejos, Muy Cerca, Muy Lejos del bordillo?.

Después de este artículo tan duro si algo no está bien explicado, hay alguna inconsistencia o no os habéis enterado de nada avisad.

Cooperative Linux

Interesante iniciativa para crear algo parecido a VMWare pero en su versión de código libre. Para quien no conozca VMWare, se trata de una máquina virtual que es capaz de ejecutar Linux desde Windows y viceversa. La gente de Colinux está intentando hacer algo similar, todavía está en una fase de desarrollo muy temprana pero promete mucho.

Suscribirse