Ters Çevir, Flop Et, Ciddiyim


24

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:

  1. p kendisi

  2. pGörüntü dikey olarak çevrildiğinde pikselin konumunda bulunan piksel

  3. pGörüntü yatay olarak çevrildiğinde pikselin konumunda bulunan piksel

  4. pGö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:

2. adım örneği

pKırmızı piksel olalım . p(Ve 3 mavi piksel) için yeni değeri hesaplamak için , 3 mavi pikselin değerlerinin portalaması 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

PPM: giriş , çıkış


PPM: giriş , çıkış


PPM: giriş , çıkış


PPM: giriş , çıkış


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> -plainve 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*heightaşağıdakileri takip eden RGB üçüzlerinin olması gerektiğidir 255.


kurallar

  • Bu , 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ı


Test Snippet'i (bunun için Calvin'in Hobileri sayesinde)


Ppm dosyalarını açan / kaydeden görüntü kütüphanelerine izin verilir mi?
Calvin'in Hobileri

@ Calvin'in Hobileri Evet
Mego

3
" Çevir,
Luis Mendo

3
Belki "Çevir, fırlat, kastet"?
Conor O'Brien,

2
@ C'O'Bʀɪᴇɴ Bir parti gibi geliyor, Luis’in gönderdiği şeyi bekleyin.
Addison Crump,

Yanıtlar:


4

Pyth, 30 29 bayt

zjms.OdC.nM[JrR7.zKm_cd3J_J_K

Programım ilk satırdaki tüm meta verileri ve görüntü verisi stdin'den sonraki satırlarda satır satır beklemektedir. Yardımcı olmak için bu, geçerli bir PPM dosyasını PPM dosyasına dönüştürmek için programımın anlayabileceği küçük bir Python programıdır:

import sys
p3, w, h, d, *data = sys.stdin.read().split()
print(p3, w, h, d)
for i in range(0, int(w) * int(h), int(w)):
    print(" ".join(data[i:i+int(w)]))

Görüntü verilerini satır satır aldığınızda işlemler gerçekten basittir. İlk önce resim verilerini bir tam sayı listesi ( JrR7.z) listesine okudum , sonra her 3 tam sayıyı gruplayarak ve bunları her satır için tersine çevirerek yatay olarak yansıtılmış sürümü oluşturdum Km_cd3J. O zaman dikey olarak yansıtılmış versiyonlar basit _J_Kçünkü sıraları tersine çevirebiliyoruz.

Tüm bu matrisleri alıyorum, her birini bir 1d dizisine düzleştiriyorum , piksel bileşenlerinin her birinin bir listesini elde etmek için .nMgeçiş yapıyorum C, bu listelerin her birinin ortalama ( ms.Odtr) 'sini kestim ve son olarak da yeni çizgilerle birleştirilip baskı yapıyorum j.

Programımın farklı bir formatta çıktı ürettiğini unutmayın (ancak yine de geçerli PPM). Demo görüntüler bu imgur albümünde izlenebilir .


13

Bash (+ ImageMagick), 64 + 1 = 65 bayt

C=convert;$C a -flip b;$C a -flop c;$C c -flip d;$C * -average e

İş için doğru alet.

aDönüştürülecek PPM verilerini içeren tek bir dosya içeren bir dizinde çalıştırılmalıdır . Bu dosya adı önemli olduğundan, bayt sayımına bir bayt ekledim.

PNG küçük resim çıktıları (bunun neden gerekli olduğundan emin değiller çünkü yine de hepsi aynılar, ama soru öyle diyor ...):

penguen quintopia Peter minibits

2 bayt kaydettiğiniz için nneonneo'ya teşekkürler !


3
Çıktılara ihtiyacım var çünkü insanlar test etmeden çözümler gönderme konusunda kötü bir alışkanlığa sahipler. +1 için -flop, bunun bir bayrak olduğuna şaşırmak istiyorum.
Mego

1
Kullanarak C=convertve $Cyerine 2 bayt'ı tıraş edin alias.
nneonneo

12

Matlab, 106 82 80 bayt

i=imread(input(''))/4;for k=1:2;i=i+flipdim(i,k);end;imwrite(i,'p3.pnm','e','A')

Resim n*m*3matris olarak yüklenir . Sonra matrisi çevirip her iki eksen için kendine ekledik ve tekrar bir dosyaya yazdık.


Metin dosyalarını bu kadar büyük yüklemek için bir yer bulamadım, PNG sürümleri burada:


Omg, <imgetiketleri kullanabileceğini bile bilmiyordum !
kusur

1
MATLAB R2013b ve daha yenisinde , flipdim yerine flip kullanmak mümkündür . Bu size 3 bayt daha kazandırmalı. flipdim'in yardımı aslında: "flipdim gelecekteki bir sürümde kaldırılacak. Bunun yerine FLIP kullanın."
slvrbld

10

Mathematica, 86 84 bayt

Tavsiye için DavidC'ye teşekkürler. (2 bayt kaydeder)

Export[#2,⌊Mean@Join[#,(r=Reverse)/@#]&@{#,r/@#}&@Import[#,"Data"]⌋~Image~"Byte"]&

Birinci ve ikinci parametreler, sırasıyla giriş ve çıkış görüntülerine giden yollardır.


Test durumları

f=%; (assign the function to symbol f)
f["penguin.pnm","penguin2.pnm"]
f["quintopia.pnm","quintopia2.pnm"]
f["peter.pnm","peter2.pnm"]

Sonuç

(Resimlerin PNG sürümleri aşağıya yüklenir)

Import["penguin2.pnm"]

Import["quintopia2.pnm"]

Import["peter2.pnm"]


Join[#,(r=Reverse)/@#]
DavidC

4

Julia, 157 bayt

using FileIO
s->(a=load(s);b=deepcopy(a);d=a.data;(n,m)=size(d);for i=1:n,j=1:m b.data[i,j]=mean([d[i,j];d[n-i+1,j];d[i,m-j+1];d[n-i+1,m-j+1]])end;save(s,b))

Bu, bir PPM dosyasının tam yolunu içeren bir dize kabul eden ve dönüştürülen görüntünün üzerine yazan bir lambda işlevidir. Aramak için değişkene atayın.

Ungolfed:

using FileIO

function f(s::AbstractString)
    # Load the input image
    a = load(s)

    # Create a copy (overwriting does bad things)
    b = deepcopy(a)

    # Extract the matrix of RGB triples from the input
    d = a.data

    # Store the size of the matrix
    n, m = size(d)

    # Apply the transformation
    # Note that we don't floor the mean; this is because the RGB values
    # aren't stored as integers, they're fixed point values in [0,1].
    # Simply taking the mean produces the desired output.
    for i = 1:n, j = 1:m
        b.data[i,j] = mean([d[i,j]; d[n-i+1,j]; d[i,m-j+1]; d[n-i+1,m-j+1]])
    end

    # Overwrite the input
    save(s, b)
end

Örnek çıktılar:

penguen quintopia Peter minibits


4

piton 2 + PIL, 268

Şimdi görüntü çevirme ve alfa harmanlama kullanarak toplu olarak PIL kullanıyorum

from PIL import Image
I=Image
B,T=I.blend,I.FLIP_TOP_BOTTOM
a=I.open(raw_input()).convert('RGB')
exec'b=a@I.FLIP_LEFT_RIGHT);c=a@T);d=b@T)'.replace('@','.transpose(')
x,y=a.size
print'P3',x,y,255
for r,g,b in list(B(B(B(a,b,0.5),c,0.25),d,0.25).getdata()):print r,g,b

Sonuç görüntüleri burada bulabilirsiniz


1
Lütfen kuralların gerektirdiği şekilde test senaryolarının çıktılarını ekleyin.
Mego
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.