visão global
Dada uma imagem no formato simples PPM (P3) como entrada, para cada pixel p
na imagem, substitua cada um dos 4 pixels a seguir, vermelho, verde e azul pelo valor médio do piso dos respectivos canais de todos os 4 pixels:
p
em siO pixel localizado no
p
local quando a imagem é invertida verticalmenteO pixel localizado na
p
localização de quando a imagem é invertida horizontalmenteO pixel localizado no
p
local em que a imagem é invertida vertical e horizontalmente
Envie a imagem resultante no formato PPM (P3).
Para mais explicações, considere esta imagem 8x8, ampliada para 128x128:
Let p
Ser o pixel vermelho. Para calcular o novo valor para p
(e os 3 pixels azuis), os valores p
e os 3 pixels azuis serão calculados em média juntos:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Exemplos
Implementação de referência
#!/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])
Este programa usa um único nome de arquivo como entrada, formatado como a saída de pngtopnm <pngfile> -plain
, e gera uma única linha de dados PPM separados por espaços.
Uma Breve Descrição do Formato P3
Um arquivo de texto simples PPM gerado a partir pngtopnm <pngfile> -plain
será semelhante a este:
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>
<...>
Esse é o formato que os arquivos de entrada e saída de exemplo usam. No entanto, o PNM é muito flexível quanto à sua formatação - qualquer espaço em branco pode separar valores. Você pode substituir todas as novas linhas no arquivo acima por um único espaço cada e ainda assim ter um arquivo válido. Por exemplo, este arquivo e este arquivo são válidos e representam a mesma imagem. Os únicos outros requisitos são que o arquivo termine com uma nova linha à direita e que haja width*height
trigêmeos RGB após o 255
.
Regras
- Isso é código-golfe , então a solução válida mais curta vence.
- Você pode inserir e enviar dados PPM formatados de qualquer maneira conveniente e consistente, desde que sejam válidos de acordo com o formato PPM descrito acima. A única exceção é que você deve usar o formato simples (P3) e não o formato binário (P6).
- Você deve verificar se sua solução gera as imagens corretas para as imagens de teste acima.
- Todas as imagens terão uma profundidade de 8 bits.
Leitura extra: página wikipedia no formato Netpbm
Respostas:
Pitão,
3029 bytesMeu programa espera todos os metadados na primeira linha e os dados da imagem linha por linha nas linhas após stdin. Para ajudar, este é um pequeno programa Python para converter qualquer arquivo PPM válido em um arquivo PPM que meu programa possa entender:
Depois de ter os dados da imagem linha por linha, as operações são realmente simples. Primeiro, leio os dados da imagem em uma lista de listas de números inteiros (
JrR7.z
) e, em seguida, crio a versão espelhada horizontalmente agrupando a cada 3 números inteiros e revertendo-os para cada linha (Km_cd3J
). As versões espelhadas verticalmente são simples_J_K
, pois podemos apenas reverter as linhas.Eu pego todas essas matrizes, alisei cada uma delas em uma matriz 1d
.nM
, transponhoC
para obter uma lista de listas de cada um dos componentes de pixel, calcule a média e trunque para int cada uma dessas listas (ms.Od
) e, finalmente, imprimai as novas linhasj
.Observe que meu programa gera saída em um formato diferente (mas ainda é válido para PPM). As imagens de demonstração podem ser visualizadas neste álbum imgur .
fonte
Bash (+ ImageMagick), 64 + 1 = 65 bytes
Ferramenta certa para o trabalho.
Deve ser executado em um diretório que contém um único arquivo
a
que contém os dados do PPM a serem transformados. Como esse nome de arquivo é significativo, adicionei um byte à contagem de bytes.Saídas em miniatura PNG (não sei por que isso é necessário, porque são todos iguais, mas a pergunta diz isso, então ...):
Obrigado a nneonneo por salvar 2 bytes!
fonte
-flop
, eu realmente quero ser surpreendido por ser uma bandeira.C=convert
e em$C
vez dealias
.Matlab,
1068280 bytesA imagem é carregada como
n*m*3
matriz. Em seguida, invertemos a matriz e adicionamos a si mesma para ambos os eixos, e escrevemos novamente em um arquivo.Não consegui encontrar um lugar para carregar arquivos de texto tão grandes, então aqui estão as versões PNG:
fonte
<img
tags!Mathematica,
8684 bytesAgradeço a DavidC pelo conselho. (economiza 2 bytes)
O primeiro e o segundo parâmetros são os caminhos para as imagens de entrada e saída, respectivamente.
Casos de teste
Resultado
(As versões PNG das imagens são enviadas abaixo)
fonte
Join[#,(r=Reverse)/@#]
Julia, 157 bytes
Essa é uma função lambda que aceita uma sequência que contém o caminho completo para um arquivo PPM e a substitui pela imagem transformada. Para chamá-lo, atribua-o a uma variável.
Ungolfed:
Exemplo de saídas:
fonte
python 2 + PIL, 268
Agora eu uso massivamente o PIL, usando inversão de imagem e mistura alfa
As imagens resultantes estão disponíveis aqui
fonte