概要
入力としてプレーンPPM(P3)形式の画像が与えられた場合、画像内の各ピクセルp
について、次の4ピクセルの赤、緑、青のそれぞれを、4ピクセルすべての各チャネルのフロア平均値に置き換えます。
p
自体p
画像が垂直に反転されたときにの位置にあるピクセルp
画像が水平方向に反転されたときにの位置にあるピクセルp
画像が垂直と水平の両方に反転されたときにの位置にあるピクセル
結果の画像をプレーンPPM(P3)形式で出力します。
詳細については、128x128に拡大されたこの8x8画像を検討してください。
ましょう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は、そのは、書式設定について非常に緩んでいる- 任意の空白は値を分離することができます。上記のファイル内のすべての改行をそれぞれ1つのスペースに置き換えても、有効なファイルを保持できます。たとえば、このファイルとこのファイルは両方とも有効であり、同じイメージを表します。他の唯一の要件は、ファイルが最後の改行で終わらなければならないことであり、そこにする必要がありwidth*height
、以下のRGBトリプレット255
。
ルール
- これはcode-golfであるため、最短の有効なソリューションが優先されます。
- 上記のPPM形式に従って有効であれば、便利で一貫した方法でフォーマットされたPPMデータを入出力できます。唯一の例外は、バイナリ(P6)形式ではなく、プレーン(P3)形式を使用する必要があることです。
- ソリューションが上記のテストイメージに対して正しいイメージを出力することを確認する必要があります。
- すべての画像のビット深度は8ビットです。