Escriba un programa que tome una imagen truecolor estándar y un solo color RGB de 24 bits (tres números del 0 al 255). Modifique la imagen de entrada (o envíe una nueva imagen con las mismas dimensiones) de modo que su color promedio sea exactamente el único color que se ingresó. Puede modificar los píxeles de la imagen de entrada de la forma que desee para lograrlo, pero el objetivo es hacer que los cambios de color sean lo más visualmente imperceptibles posible .
El color promedio de una imagen RGB es realmente un conjunto de tres medios aritméticos , uno para cada canal de color. El valor rojo promedio es la suma de los valores rojos en todos los píxeles de la imagen divididos por el número total de píxeles (el área de la imagen), redondeados al número entero más cercano. Los promedios verde y azul se calculan de la misma manera.
Este script Python 2 (con PIL ) puede calcular el color promedio de la mayoría de los formatos de archivo de imagen:
from PIL import Image
print 'Enter image file'
im = Image.open(raw_input()).convert('RGB')
pixels = im.load()
avg = [0, 0, 0]
for x in range(im.size[0]):
for y in range(im.size[1]):
for i in range(3):
avg[i] += pixels[x, y][i]
print 'The average color is', tuple(c // (im.size[0] * im.size[1]) for c in avg)
(Hay programas de color promedio similares aquí , pero no necesariamente hacen exactamente el mismo cálculo).
El requisito principal para su programa es que para cualquier imagen de entrada, el color promedio de su salida correspondiente debe coincidir exactamente con el color que se ingresó, según el fragmento de Python o algún código equivalente. La imagen de salida también debe tener exactamente las mismas dimensiones que la imagen de entrada.
Por lo tanto, técnicamente podría enviar un programa que simplemente colorea la entrada completa con el color promedio especificado (porque el promedio siempre sería ese color), pero este es un concurso de popularidad : la presentación con el mayor número de votos ganará , y será tan trivial la sumisión no le dará muchos votos a favor. Ideas novedosas como aprovechar las peculiaridades de la visión humana, o reducir la imagen y dibujar un borde de color a su alrededor (con suerte) le dará votos.
Tenga en cuenta que ciertas combinaciones de colores e imágenes promedio requieren cambios de color extremadamente notables. Por ejemplo, si el color promedio para igualar fuera negro (0, 0, 0), cualquier imagen de entrada necesitaría hacerse completamente negra porque si los píxeles tuvieran valores distintos de cero, también harían que el promedio no sea cero ( salvo errores de redondeo). Tenga en cuenta tales limitaciones al votar.
Imágenes de prueba
Algunas imágenes y sus colores promedio predeterminados para jugar. Haga clic para ver los tamaños completos.
A. promedio (127, 127, 127)
De las imágenes de fejesjoco con respuesta de todos los colores . Encontrado original en su blog .
B. promedio (62, 71, 73)
Yokohama . Proporcionado por Geobits .
C. promedio (115, 112, 111)
Tokio . Proporcionado por Geobits .
D. promedio (154, 151, 154)
La cascada de Escher . Original .
E. promedio (105, 103, 102)
Monte Shasta . Proporcionado por mí
F. promedio (75, 91, 110)
Notas
- Los formatos exactos de entrada y salida y los tipos de archivos de imagen que usa su programa no importan demasiado. Solo asegúrese de que esté claro cómo usar su programa.
- Probablemente sea una buena idea (pero técnicamente no es un requisito) que si una imagen ya tiene el color promedio objetivo, debería salir como está.
- Publique imágenes de prueba con la entrada de color promedio como (150, 100, 100) o (75, 91, 110), para que los votantes puedan ver las mismas entradas en diferentes soluciones. (Publicar más ejemplos que esto está bien, incluso alentado).