Présentation
Étant donné une image au format PPM (P3) ordinaire en entrée, pour chaque pixel p
de l'image, remplacez chacun des 4 pixels suivants rouge, vert et bleu par la valeur moyenne plancher des canaux respectifs des 4 pixels:
p
lui-mêmeLe pixel situé à
p
l'emplacement de lorsque l'image est retournée verticalementLe pixel situé à
p
l'emplacement de lorsque l'image est retournée horizontalementLe pixel situé à
p
l'emplacement de lorsque l'image est retournée verticalement et horizontalement
Sortez l'image résultante au format PPM (P3).
Pour plus d'explications, considérez cette image 8x8, agrandie à 128x128:
Soit p
le pixel rouge. Pour calculer la nouvelle valeur pour p
(et les 3 pixels bleus), les valeurs de p
et les 3 pixels bleus seront moyennées ensemble:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Exemples
Implémentation de référence
#!/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])
Ce programme prend un seul nom de fichier en entrée, formaté comme la sortie de pngtopnm <pngfile> -plain
, et génère une seule ligne de données PPM séparées par des espaces.
Une brève description du format P3
Un fichier texte en clair PPM généré à partir de pngtopnm <pngfile> -plain
ressemblera à ceci:
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>
<...>
Il s'agit du format utilisé par les exemples de fichiers d'entrée et de sortie. Cependant, PNM est très vague quant à sa mise en forme - tout espace peut séparer les valeurs. Vous pouvez remplacer tous les retours à la ligne du fichier ci-dessus par un seul espace chacun et conserver un fichier valide. Par exemple, ce fichier et ce fichier sont tous deux valides et représentent la même image. Les seules autres exigences sont que le fichier doit se terminer par un retour à la ligne de fin et qu'il doit y avoir width*height
des triplets RVB après le 255
.
Règles
- C'est le code-golf , donc la solution valide la plus courte l'emporte.
- Vous pouvez entrer et sortir des données PPM formatées de toute manière pratique et cohérente, tant qu'elles sont valides selon le format PPM décrit ci-dessus. La seule exception est que vous devez utiliser le format ordinaire (P3) et non le format binaire (P6).
- Vous devez vérifier que votre solution génère les images correctes pour les images de test ci-dessus.
- Toutes les images auront une profondeur de 8 bits.
Lecture supplémentaire: page wikipedia au format Netpbm
Réponses:
Pyth,
3029 octetsMon programme attend toutes les métadonnées sur la première ligne, et les données d'image ligne par ligne sur les lignes après sur stdin. Pour vous aider, voici un petit programme Python pour convertir n'importe quel fichier PPM valide en un fichier PPM que mon programme peut comprendre:
Une fois que vous avez les données d'image ligne par ligne, les opérations sont vraiment simples. J'ai d'abord lu les données d'image dans une liste de listes d'entiers (
JrR7.z
), puis je crée la version en miroir horizontal en regroupant tous les 3 entiers et en les inversant pour chaque ligne (Km_cd3J
). Ensuite, les versions en miroir vertical sont simplement_J_K
, car nous pouvons simplement inverser les lignes.Je prends toutes ces matrices, aplatis chacune d'elles dans un tableau 1d avec
.nM
, transpose avecC
pour obtenir une liste de listes de chacun des composants de pixel, moyenne et tronque à int chacune de ces listes (ms.Od
), et enfin imprimer joint par des retours à la lignej
.Notez que mon programme génère une sortie dans un format différent (mais toujours valide PPM). Les images de démonstration peuvent être consultées dans cet album imgur .
la source
Bash (+ ImageMagick), 64 + 1 = 65 octets
Le bon outil pour le travail.
Doit être exécuté dans un répertoire contenant un seul fichier
a
contenant les données PPM à transformer. Étant donné que ce nom de fichier est significatif, j'ai ajouté un octet au nombre d'octets.Sorties de vignettes PNG (je ne sais pas pourquoi cela est nécessaire car elles sont toutes les mêmes de toute façon, mais la question le dit, alors ...):
Merci à nneonneo pour avoir économisé 2 octets!
la source
-flop
, je veux vraiment être surpris que ce soit un drapeau.C=convert
et$C
au lieu dealias
.Matlab,
1068280 octetsL'image est chargée comme
n*m*3
matrice. Ensuite, nous inversons la matrice et l'ajoutons à elle-même pour les deux axes, puis l'écrivons à nouveau dans un fichier.Je n'ai pas trouvé d'endroit pour télécharger des fichiers texte si gros, alors voici les versions PNG:
la source
<img
tags!Mathematica,
8684 octetsMerci à DavidC pour les conseils. (enregistre 2 octets)
Les premier et second paramètres sont respectivement les chemins d'accès aux images d'entrée et de sortie.
Cas de test
Résultat
(Les versions PNG des images sont téléchargées ci-dessous)
la source
Join[#,(r=Reverse)/@#]
Julia, 157 octets
Il s'agit d'une fonction lambda qui accepte une chaîne contenant le chemin d'accès complet à un fichier PPM et l'écrase avec l'image transformée. Pour l'appeler, affectez-le à une variable.
Non golfé:
Exemples de sorties:
la source
python 2 + PIL, 268
Maintenant, j'utilise massivement PIL, en utilisant le retournement d'image et le mélange alpha
Les images résultantes sont disponibles ici
la source