Ikhtisar
Diberikan gambar dalam format PPM (P3) polos sebagai input, untuk setiap piksel p
dalam gambar, ganti masing-masing merah, hijau, dan biru 4 piksel berikut dengan nilai rata-rata lantai dari saluran masing-masing dari 4 piksel:
p
diriPixel terletak di
p
lokasi ketika gambar dibalik secara vertikalPixel terletak di
p
lokasi ketika gambar dibalik secara horizontalPixel terletak di
p
lokasi ketika gambar dibalik secara vertikal dan horizontal
Keluarkan gambar yang dihasilkan dalam format PPM (P3) polos.
Untuk penjelasan lebih lanjut, pertimbangkan gambar 8x8 ini, diperbesar menjadi 128x128:
Membiarkan p
menjadi piksel merah. Untuk menghitung nilai baru untuk p
(dan 3 piksel biru), nilai p
dan 3 piksel biru akan dirata-ratakan bersama-sama:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Contohnya
Implementasi Referensi
#!/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])
Program ini mengambil nama file tunggal sebagai input, diformat seperti output pngtopnm <pngfile> -plain
, dan output satu baris data PPM yang dipisahkan oleh spasi.
Penjelasan Singkat tentang Format P3
File plaintext PPM yang dihasilkan pngtopnm <pngfile> -plain
akan terlihat seperti ini:
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>
<...>
Ini adalah format yang digunakan oleh file input dan output contoh. Namun, PNM sangat longgar tentang pemformatannya - spasi apa pun dapat memisahkan nilai. Anda dapat mengganti semua baris baru dalam file di atas dengan masing-masing satu ruang, dan masih memiliki file yang valid. Misalnya, file ini dan file ini sama-sama valid, dan mewakili gambar yang sama. Satu-satunya persyaratan lain adalah bahwa file harus diakhiri dengan baris baru, dan harus ada width*height
triplet RGB yang mengikuti 255
.
Aturan
- Ini adalah kode-golf , sehingga solusi terpendek yang valid menang.
- Anda dapat memasukkan dan mengeluarkan data PPM yang diformat dengan cara apa pun yang nyaman dan konsisten, asalkan valid sesuai dengan format PPM yang dijelaskan di atas. Satu-satunya pengecualian adalah Anda harus menggunakan format biasa (P3), dan bukan format biner (P6).
- Anda harus memberikan verifikasi bahwa solusi Anda menghasilkan gambar yang benar untuk gambar uji di atas.
- Semua gambar akan memiliki kedalaman 8 bit.
Bacaan ekstra: halaman wikipedia format Netpbm
Jawaban:
Pyth,
3029 byteProgram saya mengharapkan semua metadata di baris pertama, dan data gambar baris demi baris di baris setelah di stdin. Untuk membantu, ini adalah program Python kecil untuk mengubah file PPM yang valid menjadi file PPM yang dapat dipahami oleh program saya:
Setelah Anda memiliki baris data data baris, operasi sangat sederhana. Pertama saya membaca data gambar ke dalam daftar daftar bilangan bulat (
JrR7.z
), kemudian saya membuat versi cermin horizontal dengan mengelompokkan setiap 3 bilangan bulat dan membalikkannya untuk setiap baris (Km_cd3J
). Maka versi yang dicerminkan secara vertikal adalah sederhana_J_K
, karena kita bisa membalikkan baris.Saya mengambil semua matriks itu, meratakan masing-masing ke dalam array 1d dengan
.nM
, transpos denganC
untuk mendapatkan daftar daftar masing-masing komponen pixel, rata-rata dan memotong ke int masing-masing daftar (ms.Od
), dan akhirnya mencetak bergabung dengan baris baruj
.Perhatikan bahwa program saya menghasilkan keluaran dalam format yang berbeda (tapi PPM masih valid). Gambar demo dapat dilihat di album imgur ini .
sumber
Bash (+ ImageMagick), 64 + 1 = 65 byte
Alat yang tepat untuk pekerjaan itu.
Harus dijalankan di direktori yang berisi satu file
a
yang berisi data PPM untuk diubah. Karena nama file ini signifikan, saya telah menambahkan satu byte ke jumlah byte.Output thumbnail PNG (tidak yakin mengapa ini perlu karena mereka semua tetap sama, tetapi pertanyaannya mengatakan demikian, jadi ...):
Terima kasih kepada nneonneo karena telah menghemat 2 byte!
sumber
-flop
, saya benar-benar ingin terkejut bahwa ini adalah bendera.C=convert
dan$C
bukannyaalias
.Matlab,
1068280 byteGambar dimuat sebagai
n*m*3
matriks. Kemudian kita balikkan matriks dan ditambahkan ke dirinya sendiri untuk kedua sumbu, dan menulis lagi ke file.Saya tidak dapat menemukan tempat untuk mengunggah file teks begitu besar, jadi di sini adalah versi PNG:
sumber
<img
tag!Mathematica,
8684 byteTerima kasih kepada DavidC untuk sarannya. (menghemat 2 byte)
Parameter pertama dan kedua adalah jalur ke gambar input dan output, masing-masing.
Uji kasus
Hasil
(Versi gambar PNG diunggah di bawah)
sumber
Join[#,(r=Reverse)/@#]
Julia, 157 byte
Ini adalah fungsi lambda yang menerima string yang berisi path lengkap ke file PPM dan menimpanya dengan gambar yang diubah. Untuk menyebutnya, tetapkan ke variabel.
Tidak Disatukan:
Output contoh:
sumber
python 2 + PIL, 268
Sekarang saya secara besar-besaran menggunakan PIL, menggunakan flipping gambar dan alpha blending
Gambar yang dihasilkan tersedia di sini
sumber