总览
给定纯PPM(P3)格式的图像作为输入,对于图像p
中的每个像素,将以下4个像素的红色,绿色和蓝色分别替换为所有4个像素各自通道的下限平均值:
p
本身p
垂直翻转图像时位于的位置的像素p
水平翻转图像时位于的位置的像素p
垂直和水平翻转图像时位于的位置的像素
以纯PPM(P3)格式输出结果图像。
为了进一步说明,请考虑将此8x8图像放大到128x128:
我们p
是红色像素。为了计算p
(和3个蓝色像素)的新值,将和的3个蓝色像素的值一起求p
平均值:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
例子
参考实施
#!/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])
该程序以单个文件名作为输入,其格式类似于的输出pngtopnm <pngfile> -plain
,并输出由空格分隔的一行PPM数据。
P3格式的简要说明
从中生成的PPM纯文本文件pngtopnm <pngfile> -plain
如下所示:
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>
<...>
这是示例输入和输出文件使用的格式。但是,PNM的格式非常宽松- 任何空格都可以分隔值。您可以用一个空格替换上述文件中的所有换行符,并且仍然有一个有效文件。例如,此文件和此文件均有效,并且代表相同的图像。唯一的其他要求是文件必须以尾随换行符结尾,并且在后面必须有width*height
RGB三胞胎255
。
规则
- 这是代码高尔夫球,因此最短的有效解决方案将获胜。
- 您可以以任何方便且一致的方式输入和输出格式化的PPM数据,只要它对上述PPM格式有效即可。唯一的例外是您必须使用普通(P3)格式,而不是二进制(P6)格式。
- 您必须提供验证,以确保您的解决方案可以为上述测试图像输出正确的图像。
- 所有图像的位深度为8位。
额外阅读:Netpbm格式的维基百科页面