Überblick
Ersetzen Sie bei einem Bild im PPM-Format (P3) als Eingabe für jedes Pixel p
im Bild die folgenden 4 Pixel (rot, grün und blau) durch den bodenebenen Durchschnittswert der jeweiligen Kanäle aller 4 Pixel:
p
selbstDas Pixel an
p
der Position, an der sich das Bild befindet, wenn es vertikal gespiegelt wirdDas Pixel an
p
der Position, an der sich das Bild befindet, wenn es horizontal gespiegelt wirdDas Pixel an
p
der Position, an der sich das Bild befindet, wenn es vertikal und horizontal gespiegelt wird
Das resultierende Bild wird im PPM-Format (P3) ausgegeben.
Betrachten Sie zur weiteren Erläuterung das auf 128x128 vergrößerte 8x8-Bild:
Sei p
das rote Pixel. Um den neuen Wert für p
(und die 3 blauen Pixel) zu berechnen , werden die Werte von p
und die 3 blauen Pixel zusammen gemittelt:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Beispiele
Referenzimplementierung
#!/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])
Dieses Programm verwendet einen einzelnen Dateinamen als Eingabe, der wie die Ausgabe von formatiert ist pngtopnm <pngfile> -plain
, und gibt eine einzelne durch Leerzeichen getrennte Zeile mit PPM-Daten aus.
Eine kurze Beschreibung des P3-Formats
Eine PPM-Klartextdatei, die aus generiert wurde pngtopnm <pngfile> -plain
, sieht folgendermaßen aus:
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>
<...>
Dies ist das Format, das die Beispiel-Eingabe- und Ausgabedateien verwenden. Allerdings PNM ist sehr locker über seine Formatierung - jede Leerzeichen kann Werte trennen. Sie können alle Zeilenumbrüche in der obigen Datei durch jeweils ein Leerzeichen ersetzen und dennoch eine gültige Datei haben. Zum Beispiel diese Datei und diese Datei sind beide gültig und repräsentieren das gleiche Bild. Die einzige andere Voraussetzung ist, dass die Datei mit einem abschließenden Zeilenumbruch endet und dass nach dem Zeilenumbruch width*height
RGB-Triplets folgen 255
.
Regeln
- Dies ist Code-Golf , also gewinnt die kürzeste gültige Lösung.
- Sie können PPM-Daten eingeben und ausgeben, die auf eine bequeme und konsistente Weise formatiert sind, solange sie gemäß dem oben beschriebenen PPM-Format gültig sind. Die einzige Ausnahme ist, dass Sie das einfache Format (P3) und nicht das binäre Format (P6) verwenden müssen.
- Sie müssen überprüfen, ob Ihre Lösung die richtigen Bilder für die obigen Testbilder ausgibt.
- Alle Bilder haben eine Bittiefe von 8 Bit.
Zusätzliche Lektüre: Wikipedia-Seite im Netpbm-Format
Antworten:
Pyth,
3029 BytesMein Programm erwartet alle Metadaten in der ersten Zeile und die Bilddaten Zeile für Zeile in den Zeilen nach auf stdin. Dies ist ein kleines Python-Programm zum Konvertieren einer gültigen PPM-Datei in eine PPM-Datei, die mein Programm verstehen kann:
Sobald Sie die Bilddaten Zeile für Zeile haben, sind die Operationen wirklich einfach. Zuerst lese ich die Bilddaten in eine Liste von Listen mit ganzen Zahlen (
JrR7.z
), dann erstelle ich die horizontal gespiegelte Version, indem ich alle 3 ganzen Zahlen gruppiere und sie für jede Zeile umkehre (Km_cd3J
). Dann sind die vertikal gespiegelten Versionen einfach_J_K
, da wir nur Zeilen umkehren können.Ich nehme all diese Matrizen, drücke sie zu einem 1d-Array zusammen
.nM
, transponiere mitC
, um eine Liste der Listen der einzelnenms.Od
Pixelkomponenten zu erhalten, mittle und schneide auf jede dieser Listen ab ( ) und drucke schließlich zusammen mit Zeilenumbrüchenj
.Beachten Sie, dass mein Programm Ausgaben in einem anderen Format generiert (aber immer noch gültiges PPM). Die Demo-Bilder können in diesem Bildalbum angesehen werden .
quelle
Bash (+ ImageMagick), 64 + 1 = 65 Bytes
Richtiges Werkzeug für den Job.
Muss in einem Verzeichnis ausgeführt werden, das eine einzelne Datei
a
enthält, die die zu transformierenden PPM-Daten enthält. Da dieser Dateiname von Bedeutung ist, habe ich der Byteanzahl ein Byte hinzugefügt.PNG-Thumbnail-Ausgaben (nicht sicher, warum dies notwendig ist, da sie sowieso alle gleich sind, aber die Frage lautet so, so ...):
Danke an nneonneo für das Speichern von 2 Bytes!
quelle
-flop
, ich möchte wirklich überrascht sein, dass es eine Flagge ist.C=convert
und$C
anstelle vonalias
.Matlab,
1068280 BytesDas Bild wird als
n*m*3
Matrix geladen . Dann drehen wir die Matrix um, addieren sie für beide Achsen zu sich selbst und schreiben sie erneut in eine Datei.Ich konnte keinen Ort finden, an dem ich so große Textdateien hochladen konnte. Hier sind die PNG-Versionen:
quelle
<img
Tags verwenden kannst !Mathematica,
8684 BytesDanke an DavidC für den Rat. (spart 2 Bytes)
Der erste und der zweite Parameter sind die Pfade zu den Eingangs- bzw. Ausgangsbildern.
Testfälle
Ergebnis
(PNG-Versionen der Bilder werden unten hochgeladen)
quelle
Join[#,(r=Reverse)/@#]
Julia, 157 Bytes
Dies ist eine Lambda-Funktion, die eine Zeichenfolge akzeptiert, die den vollständigen Pfad zu einer PPM-Datei enthält, und diese mit dem transformierten Bild überschreibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Ungolfed:
Beispielausgaben:
quelle
Python 2 + PIL, 268
Jetzt verwende ich massiv PIL, indem ich das Spiegeln von Bildern und das Alpha-Blending verwende
Resultierende Bilder sind hier verfügbar
quelle