Joe la serpiente tiene hambre.
Come fotos, un píxel a la vez.
Realmente le gustan los píxeles brillantes.
El reto
Programe a Joe para que coma los píxeles más brillantes que pueda encontrar, dado que solo puede moverse hacia arriba, abajo, izquierda o derecha.
Presupuesto
- Joe debe comenzar en el píxel superior izquierdo de la imagen.
- Joe solo puede moverse horizontal o verticalmente en 1 movimiento
- Joe solo tiene tiempo suficiente para mover 1/3 de la cantidad de píxeles en la imagen (1/3 tantos movimientos como píxeles). Si el número de píxeles no es múltiplo de 3, redondea hacia abajo al entero más cercano.
- Joe puede cruzarse en su camino, aunque eso cuenta como 0 brillo
- El brillo se basa en la suma de r, gyb, por lo que rgb (0,0,0) tiene un brillo de 0 mientras que rgb (255,255,255) tiene el brillo máximo.
Entrada
Puede ingresar la imagen como desee.
Salida
- una imagen que muestra el resultado final de su imagen (con píxeles negros comidos).
- La cantidad de brillo consumido (especifique qué rango en su respuesta)
Tanteo
Su programa será calificado en:
- El brillo promedio de los píxeles que Joe come / El brillo promedio de los píxeles en la imagen *
* puede codificar esto en su programa
Su puntaje total será el promedio de los puntajes de las siguientes imágenes:
Imágenes de prueba:
http://upload.wikimedia.org/wikipedia/en/thumb/f/f4/The_Scream.jpg/800px-The_Scream.jpg
code-challenge
image-processing
Estiramiento maniaco
fuente
fuente
[![image description](SE URL for downsized image)](URL for original image)
.Respuestas:
C ++, Puntuación:
1.420421.46766Esta es esencialmente una versión ligeramente más sofisticada de las dos soluciones existentes: de los cuatro movimientos posibles, selecciona la que maximiza el brillo. Sin embargo, en lugar de solo mirar el brillo del píxel objetivo, mira la suma ponderada del brillo del píxel en la vecindad del píxel objetivo, donde los píxeles más cercanos al objetivo tienen un mayor peso.
EDITAR: el uso de brillo no lineal en el cálculo de vecindad mejora ligeramente la puntuación.
Compilar con
g++ joe.cpp -ojoe -std=c++11 -O3 -lcairo
. Requiere cairo.Corre con
joe <image-file> [<radius>]
.<image-file>
es la imagen PNG de entrada.<radius>
(argumento opcional) es el radio del vecindario sumado, en píxeles (más pequeño es más rápido, más grande es (más o menos) mejor). Emite la puntuación y una imagen llamadaout.<image-file>
.Resultados
Más ojos dulces
fuente
if (o_neighborhood > o_max_neighborhood) o_max = *o, o_max_neighborhood = o_neighborhood;
solo este código lo establece. sin embargo, debido a nan involucrados, la comparación siempre es falsa, por lo tanto, o_max nunca se establece y se utiliza sin inicializar.Python 3, puntaje = 1.57
Primero, nuestra serpiente recorre la imagen creando líneas verticales con la misma distancia entre sí.
Podemos extender esta serpiente tomando dos puntos uno al lado del otro en una línea vertical y creando un bucle cuyos puntos finales son ellos.
Organizamos los puntos en pares y para cada par almacenamos el tamaño y el valor de brillo promedio del bucle que da el mayor brillo promedio.
En cada paso que elegimos, el par con el valor más alto extiende su bucle para lograr el brillo promedio máximo en la extensión y calculamos el nuevo tamaño de bucle óptimo y el valor de brillo óptimo para el par.
Almacenamos los tripletes (value, size, point_pair) en una estructura de montón ordenada por valor para que podamos eliminar el elemento más grande (en O (1)) y agregar el nuevo modificado (en O (log n)) de manera eficiente.
Nos detenemos cuando alcanzamos el límite de recuento de píxeles y esa serpiente será la serpiente final.
La distancia entre las líneas verticales tiene muy poco efecto en los resultados, por lo que se eligió una constante de 40 píxeles.
Resultados
Nota: la imagen original de "The Scream" no estaba disponible, así que utilicé otra imagen de "The Scream" con una resolución similar.
Gif que muestra el proceso de extensión de la serpiente en la imagen "remolino":
El código toma uno o más nombres de archivo (separados por espacios) de stdin y escribe las imágenes de serpiente resultantes en archivos png e imprime las puntuaciones en stdout.
fuente
Python 2 (puntaje: 0.0797116)
Solo un algoritmo codicioso muy simple e ingenuo para hacer rodar la pelota.
Salida:
fuente
sum of brightnesses of eaten pixels / amount of eaten pixels
es la fórmula correcta, correcta? Quizás sea un algoritmo realmente terrible;)The average brightness of pixels Joe eats / The average brightness of the pixels in the picture*
Java (puntuación: 0,6949)
Un algoritmo simple que come el píxel más brillante de los cuatro píxeles que rodean el píxel actual. En el caso de un empate, el píxel comido es aleatorio, lo que lleva a puntajes diferentes e imágenes resultantes en cada ejecución. Como tal, los puntajes a continuación son los promedios de más de 50 ejecuciones en cada imagen.
Para ejecutarlo, edite los tres argumentos (existentes como constantes de clase) en la fuente, o páselos a través de la línea de comandos en el formulario
java HungryImageSnake <source> <iterations> <printScores>
donde<source>
está el archivo fuente de la imagen para comer,<iterations>
es el número de veces que se come la imagen (tomando el puntaje promedio y guardar el mejor puntaje en todas las iteraciones), y<printScores>
es verdadero para imprimir el puntaje de cada iteración o falso para no hacerlo.Puntajes promedio, por imagen, más de cincuenta iteraciones:
Los mejores puntajes, por imagen, en las mismas cincuenta iteraciones:
Las imágenes de las carreras con la puntuación más alta:
Como es evidente a partir de las imágenes, mucho menos de un tercio de los píxeles se comen realmente, ya que la serpiente ocasionalmente se queda atrapada entre los píxeles que ya ha comido, en los que permanece atrapada dentro del área muerta hasta que la aleatoriedad de sus movimientos la lleva a Una porción comestible de la imagen.
Además, como resultado de los píxeles que vuelven a comer las serpientes, las puntuaciones están sesgadas hacia abajo, ya que el brillo cero de los píxeles muertos se vuelve a tener en cuenta en el promedio. Esperaría ver puntuaciones mucho más altas si el algoritmo de puntuación se modificara para dividir solo por el número de movimientos que llevaron a comer nuevos píxeles, en lugar de todos los movimientos (incluidos aquellos en los que la serpiente come un píxel ahora muerto que ha comido antes )
Por supuesto, un mejor enfoque sería crear algún tipo de brillo heurístico para cada píxel y encontrar la ruta de los
width * height / 3
píxeles con el brillo promedio más alto, pero dudo que este enfoque sea óptimo en tiempo de ejecución, especialmente en imágenes más grandes, ya que el número de posibles permutaciones sería muy grande. Puedo tomar una oportunidad en alguna forma de este enfoque más tarde y publicarlo en una respuesta separada si es así.fuente
Python 2, Puntuación: 1.205
Creé una solución rápida de Python hace algún tiempo, pero olvidé publicarla. Aquí está. Encuentra los bloques más ricos en la imagen, luego viaja a cada bloque, comiendo todos los mejores bloques a los que llega.
Resultados
Imagen de ejemplo
Python 2.7 Code
fuente