Visión general
Dada una imagen en formato PPM simple (P3) como entrada, para cada píxel p
en la imagen, reemplace cada uno de los siguientes 4 píxeles rojo, verde y azul con el valor promedio de los canales respectivos de los 4 píxeles:
p
sí mismoEl píxel ubicado en
p
la ubicación de cuando la imagen se voltea verticalmenteEl píxel ubicado en
p
la ubicación de cuando la imagen se voltea horizontalmenteEl píxel ubicado en
p
la ubicación de cuando la imagen se voltea tanto vertical como horizontalmente
Imprima la imagen resultante en formato PPM (P3) simple.
Para una explicación más detallada, considere esta imagen de 8x8, ampliada a 128x128:
Deja que p
sea el píxel rojo. Para calcular el nuevo valor de p
(y los 3 píxeles azules), los valores de p
y los 3 píxeles azules se promediarán juntos:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Ejemplos
Implementación de referencia
#!/usr/bin/python
import sys
from itertools import *
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return list(izip_longest(*args, fillvalue=fillvalue))
def flatten(lst):
return sum(([x] if not isinstance(x, list) else flatten(x) for x in lst), [])
def pnm_to_bin(p):
w,h = map(int,p[1].split(' '))
data = map(int, ' '.join(p[3:]).replace('\n', ' ').split())
bin = []
lines = grouper(data, w*3)
for line in lines:
data = []
for rgb in grouper(line, 3):
data.append(list(rgb))
bin.append(data)
return bin
def bin_to_pnm(b):
pnm = 'P3 {} {} 255 '.format(len(b[0]), len(b))
b = flatten(b)
pnm += ' '.join(map(str, b))
return pnm
def imageblender(img):
h = len(img)
w = len(img[0])
for y in range(w):
for x in range(h):
for i in range(3):
val = (img[x][y][i] + img[x][~y][i] + img[~x][y][i] + img[~x][~y][i])//4
img[x][y][i],img[x][~y][i],img[~x][y][i],img[~x][~y][i] = (val,)*4
return img
def main(fname):
bin = pnm_to_bin(open(fname).read().split('\n'))
bin = imageblender(bin)
return bin_to_pnm(bin)
if __name__ == '__main__':
print main(sys.argv[1])
Este programa toma un solo nombre de archivo como entrada, formateado como la salida de pngtopnm <pngfile> -plain
, y genera una sola línea de datos PPM separados por espacios.
Una breve descripción del formato P3
Un archivo de texto sin formato PPM generado a partir de este pngtopnm <pngfile> -plain
se verá así:
P3
<width in pixels> <height in pixels>
<maximum value as defined by the bit depth, always 255 for our purposes>
<leftmost 24 pixels of row 1, in RGB triples, space-separated; like (0 0 0 1 1 1 ...)>
<next 24 pixels of row 1>
<...>
<rightmost (up to) 24 pixels of row 1>
<leftmost 24 pixels of row 2>
<next 24 pixels of row 2>
<...>
<rightmost (up to) 24 pixels of row 2>
<...>
Este es el formato que utilizan los archivos de entrada y salida de ejemplo. Sin embargo, PNM es muy flojo sobre su formato: cualquier espacio en blanco puede separar valores. Puede reemplazar todas las líneas nuevas en el archivo anterior con un solo espacio cada una, y aún así tener un archivo válido. Por ejemplo, este archivo y este archivo son válidos y representan la misma imagen. Los únicos otros requisitos son que el archivo debe terminar con una nueva línea final, y debe haber width*height
tripletes RGB después de 255
.
Reglas
- Esto es código golf , por lo que gana la solución válida más corta.
- Puede ingresar y enviar datos PPM formateados de manera conveniente y consistente, siempre que sean válidos de acuerdo con el formato PPM descrito anteriormente. La única excepción es que debe usar el formato plano (P3) y no el formato binario (P6).
- Debe proporcionar la verificación de que su solución genera las imágenes correctas para las imágenes de prueba anteriores.
- Todas las imágenes tendrán una profundidad de 8 bits.
Lectura adicional: página de Wikipedia en formato Netpbm
Respuestas:
Pyth,
3029 bytesMi programa espera todos los metadatos en la primera línea, y los datos de la imagen fila por fila en las líneas después de stdin. Para ayudar, este es un pequeño programa de Python para convertir cualquier archivo PPM válido en un archivo PPM que mi programa pueda entender:
Una vez que tiene los datos de la imagen fila por fila, las operaciones son realmente simples. Primero leo los datos de la imagen en una lista de listas de enteros (
JrR7.z
), luego creo la versión reflejada horizontalmente agrupando cada 3 enteros e invirtiéndolos para cada fila (Km_cd3J
). Entonces las versiones espejadas verticalmente son simplemente_J_K
, ya que podemos simplemente revertir filas.Tomo todas esas matrices, las aplasto en una matriz 1d
.nM
, las transpongoC
para obtener una lista de listas de cada uno de los componentes de píxeles, promedio y trunco en int cada una de esas listas (ms.Od
), y finalmente imprimo unidas por nuevas líneasj
.Tenga en cuenta que mi programa genera resultados en un formato diferente (pero aún válido PPM). Las imágenes de demostración se pueden ver en este álbum de imgur .
fuente
Bash (+ ImageMagick), 64 + 1 = 65 bytes
Herramienta adecuada para el trabajo.
Debe ejecutarse en un directorio que contenga un único archivo
a
que contenga los datos PPM para transformar. Como este nombre de archivo es significativo, he agregado un byte al recuento de bytes.Salidas en miniatura PNG (no estoy seguro de por qué esto es necesario porque de todos modos son todas iguales, pero la pregunta lo dice, así que ...):
¡Gracias a nneonneo por guardar 2 bytes!
fuente
-flop
, realmente quiero sorprenderme de que sea una bandera.C=convert
y en$C
lugar dealias
.Matlab,
1068280 bytesLa imagen se carga como
n*m*3
matriz. Luego volteamos la matriz y la agregamos a sí misma para ambos ejes, y la escribimos nuevamente en un archivo.No pude encontrar un lugar para cargar archivos de texto tan grandes, así que aquí están las versiones PNG:
fuente
<img
etiquetas!Mathematica,
8684 bytesGracias a DavidC por el consejo. (ahorra 2 bytes)
El primer y segundo parámetro son las rutas a las imágenes de entrada y salida, respectivamente.
Casos de prueba
Resultado
(Las versiones PNG de las imágenes se cargan a continuación)
fuente
Join[#,(r=Reverse)/@#]
Julia, 157 bytes
Esta es una función lambda que acepta una cadena que contiene la ruta completa a un archivo PPM y la sobrescribe con la imagen transformada. Para llamarlo, asígnelo a una variable.
Sin golf:
Salidas de ejemplo:
fuente
pitón 2 + PIL, 268
Ahora uso masivamente PIL, usando volteo de imagen y mezcla alfa
Las imágenes resultantes están disponibles aquí.
fuente