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