8

Algoritmo para un dibujo y la pintura robot -Algoritmo para un robot de dibujo y pintura: ¿algún consejo?

Hola

Quiero escribir una pieza de software que analiza una imagen y, a continuación, produce una imagen que capta lo que percibe el ojo humano en la imagen original, usando un mínimo de objetos de camino de bezier de variación de color y opacidad.

A diferencia de la reciente concurso de Twitter súper compresión (see: stackoverflow.com/questions/891643/twitter-image-encoding-challenge), mi objetivo no es crear una réplica que es fiel a la imagen, pero en lugar de replicar la experiencia humana de mirar la imagen.

Como ejemplo, si la imagen original muestra un globo rojo en la esquina superior izquierda, y la reproducción tiene algo que parece un globo rojo en la esquina superior izquierda, entonces habrá alcanzado mi objetivo, incluso si el globo en la reproducción no está del todo en la misma posición y no tiene el mismo tamaño o color.

Cuando digo "como lo percibe un ser humano", me refiero a esto en un sentido muy limitado. No estoy intentando analizar el significado de una imagen, no necesito saber de qué es una imagen, solo me interesan las características visuales clave que un ojo humano notaría, en la medida en que esto pueda ser automatizado por una Algoritmo que no tiene la capacidad de conceptualizar lo que realmente está observando.

¿Por qué este criterio inusual de la percepción humana sobre la precisión fotográfica?

Este software se usaría para conducir un robot de dibujo y pintura, que colaborará con un artista humano ().

En lugar de tratar las marcas hechas por humanos que no son fotogénicamente perfectas como necesariamente errores, el algoritmo debería tratar de incorporar lo que ya está en el lienzo en la imagen final.

Por lo tanto, el brillo relativo, el tono, la saturación, el tamaño y la posición son mucho más importantes que ser fotográficamente idénticos al original. El mantenimiento de la topología de las características, el bloque de color, los degradados, la curva convexa y cóncava será más importante la forma y el color exactos de esas características

¿Seguirme?

Mi problema es que sufro un poco del síndrome de "cuando tienes un martillo, todo parece un clavo". Para mí, parece que la forma de hacerlo es usar un algoritmo genético con algo así como la comparación de las transformadas wavelet (ver: grail.cs.washington.edu/projects/query/) utilizado por retrievr (ver: labs.systemone.at/retrievr/) para seleccionar las soluciones adecuadas.

Pero la razón principal por la que veo esto como la respuesta, es porque estas son las técnicas que conozco, probablemente haya soluciones mucho más elegantes usando técnicas de las que ahora no sé nada.

Sería especialmente interesante tener en cuenta las formas en que el sistema de visión humano analiza una imagen, por lo que quizás deba prestarse especial atención a las líneas rectas y ángulos, bordes de alto contraste y grandes bloques de colores similares.

¿Tiene alguna sugerencia sobre cosas que debo leer sobre visión, algoritmos de imagen, algoritmos genéticos o proyectos similares?

Gracias

Mat

PS. Parte de la ortografía anterior puede parecer incorrecta para usted y su revisión ortográfica. Solo se trata de variaciones ortográficas internacionales que pueden diferir del estándar en su país: p. Estándar australiano: color contra estándar americano: color

+0

Para el beneficio de los nuevos usuarios, quiero señalar que esta pregunta no se permitiría si se publicara hoy. Es muy amplio, pide recomendaciones generales y no tiene una respuesta definitiva. Es probable que todavía exista con fines históricos, así que no lo use como plantilla para una buena pregunta –

Respuesta

3

Hay un modelo que se puede implementar como un algoritmo para calcular un mapa de prominencia para una imagen, determinando qué partes de la imagen obtendrían la mayor atención de un ser humano.

El modelo se llama itti Koch modelo
puede encontrar un documento Startin here
Y más recursos y C++ código fuente here

+0

gracias, que es muy interesante –

+0

Una cosa buena de metafilter es que puedes asignar múltiples respuestas correctas, aquí solo tengo una opción. Me gustaría –

+0

(continuación) ... me hubiera gustado darle a todos el tinte verde, pero esta es la respuesta que me ha dado las direcciones más interesantes para explorar, gracias a todos ustedes –

1

Es una tarea bastante grande. Puede que le interese la vectorización de imágenes (no sé cómo se llama oficialmente), que se utiliza para tomar imágenes rasterizadas (como las imágenes que toma con una cámara) y genera un conjunto de líneas de bezier (creo) que se aproximan al imagen que usted pone. Dado que los buenos algoritmos a menudo producen conjuntos de líneas de muy alta calidad (leer: complejos) también estaría interesado en algoritmos de simplificación que pueden ayudar enormemente.

+0

Gracias rcix, Tengo la intención de pasar unos tres meses en esto, la experiencia sugiere que será más largo que eso. –

1

Lamentablemente no estoy al lado de mi biblioteca, o podría recomendar una serie de libros sobre psicología perceptual.

Lo primero que debes tener en cuenta es que la fisiología del ojo humano es tal que cuando examinamos una imagen o escena, solo estamos capturando bits muy pequeños a la vez, mientras nuestros ojos giran rápidamente. Nuestra mente analiza las diferentes partes para intentar formar un todo.

Puede comenzar encontrando un algoritmo para la ruta de un globo ocular mientras se mueve. Tal vez se siente atraído por el contraste?

Lo siguiente es que nuestros ojos ajustan la "exposición" según el contexto. Es como esas imágenes de alto rango dinámico, si se combinaban juntas no por múltiples exposiciones de una escena completa, sino por muchas imágenes pequeñas, cada una equilibrada por sí misma, pero mezclada en su entorno para formar un alto rango dinámico.

Ahora había un hallazgo en el cerebro de un mono de que hay una sola neurona que se ilumina si hay una línea diagonal en la parte superior izquierda de su campo de visión. Se pueden encontrar neuronas similares para líneas verticales y líneas horizontales en varias áreas del campo de visión de ese mono. La "diagonalidad" determina la frecuencia con la que esa neurona dispara.

se podría especular que se podrían encontrar otras neuronas y asignarlas a otras cualidades, como enrojecimiento o textura, y otras cosas.

Hay algo que los humanos pueden hacer que nunca he visto que un programa de computadora pueda hacer. es algo que se llama "cierre", donde un ser humano puede completar información sobre algo que está viendo, que en realidad no existe en la imagen. un ejemplo:

  * 






*     * 

¿es eso un triángulo? Si sabía que era de antemano, entonces probablemente podría hacer un programa para conectar los puntos. ¿Pero y si son solo puntos? ¿Cómo puedes saber? No intentaría esto a menos que tuviera una forma realmente inteligente de tratar con eso.

Hay muchos otros datos sobre la percepción humana que podría utilizar. Buena suerte, no has elegido una tarea sencilla.

+0

me has dado una muy buena idea, si pudiera seguir la mirada de los artistas en la imagen de origen, podría determinar las áreas clave de la imagen que llaman la atención, rostros de personas, etc., y usar esto para determinar cuál partes de la imagen deben ser reproducidas con mayor cuidado. Creo que dejaría el triángulo como está, tres estrellas, lo que sugiere una mejor manera de expresar mi objetivo, para reproducir una imagen que conserva las características que transmiten la mayor parte de la experiencia de la imagen. No puedo esperar diagramar la experiencia de ver la imagen Dejaré que el espectador encuentre el triángulo en las tres estrellas –

3

No puedo responder su pregunta directamente, pero debería echarle un vistazo a la máquina de pintura Aaron del artista/programador (Lisp) Harold Cohen.

+0

gracias dave que es realmente interesante –

+0

Al igual que muchos de los artistas pioneros que trabajan con la tecnología, comenzó trabajando en esto en los años 70, que creo que lo coloca en los libros de historia. Si logras verlo en algún lado, está dispuesto a hablar sobre el proceso a otros programadores. –

0

Creo que una cosa que podría ayudar en esta tarea enorme es la participación humana. me refiero a los datos. como si pudieras tener a muchas personas sentadas mirando puntos aleatorios (como en la publicación anterior) y conectarlos como ven bien. podrías aprovechar esos datos.

Cuestiones relacionadas