genel bakış
Giriş olarak düz PPM (P3) biçiminde bir görüntü verildiğinde, görüntüdeki her piksel için p
, aşağıdaki 4 pikselin kırmızı, yeşil ve mavi renklerinin her birini 4 pikselin ilgili kanallarının ortalama ortalama değeriyle değiştirin:
p
kendisip
Görüntü dikey olarak çevrildiğinde pikselin konumunda bulunan pikselp
Görüntü yatay olarak çevrildiğinde pikselin konumunda bulunan pikselp
Görüntü hem dikey hem de yatay olarak çevrildiğinde pikselin konumunda bulunan piksel
Elde edilen görüntüyü düz PPM (P3) biçiminde çıktılayın.
Daha fazla açıklama için, 128x128 büyütülmüş bu 8x8 resmi göz önünde bulundurun:
p
Kırmızı piksel olalım . p
(Ve 3 mavi piksel) için yeni değeri hesaplamak için , 3 mavi pikselin değerlerinin p
ortalaması alınacaktır:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Örnekler
Referans uygulaması
#!/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])
Bu program girdi olarak tek bir dosya adını alır, çıktısı gibi biçimlendirilir pngtopnm <pngfile> -plain
ve boşluklarla ayrılmış tek bir PPM verisi satırı çıkarır.
P3 Formatının Kısa Bir Açıklaması
Üretilen bir PPM düz metin dosyası pngtopnm <pngfile> -plain
şuna benzer:
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>
<...>
Bu örnek giriş ve çıkış dosyalarının kullandığı formattır. Bununla birlikte, PNM formatlama konusunda çok gevşek - herhangi bir boşluk, değerleri ayırabilir. Yukarıdaki dosyadaki tüm yeni satırları tek bir boşlukla değiştirebilir ve yine de geçerli bir dosyaya sahip olabilirsiniz. Örneğin, bu dosya ve bu dosya hem geçerli, hem de aynı resmi temsil ediyor. Diğer gereklilikler, dosyanın izleyen bir yeni satırla bitmesi ve width*height
aşağıdakileri takip eden RGB üçüzlerinin olması gerektiğidir 255
.
kurallar
- Bu kod golf , bu yüzden en kısa geçerli çözüm kazanır.
- Yukarıda açıklanan PPM formatına göre geçerli olduğu sürece herhangi bir uygun ve tutarlı biçimde formatlanmış PPM verilerini girebilir ve çıktısını alabilirsiniz. Bunun tek istisnası, düz (P3) biçimini kullanmanız ve ikili (P6) biçimini kullanmamanız gerektiğidir.
- Çözümünüzün yukarıdaki test görüntüleri için doğru görüntüleri çıktığını doğrulamanız gerekir.
- Tüm görüntülerin bit derinliği 8 bit olacaktır.
Ekstra okuma: Netpbm formatı wikipedia sayfası