뒤집어, 퍼, 의미


24

개요

일반 PPM (P3) 형식의 이미지가 입력 p으로 제공되면 이미지의 각 픽셀 에 대해 다음 4 픽셀의 빨강, 녹색 및 파랑을 각각 4 픽셀의 각 채널의 평균 값으로 바꿉니다.

  1. p 그 자체

  2. p이미지를 세로로 뒤집을 때의 위치 에 위치한 픽셀

  3. p이미지를 가로로 뒤집을 때의 위치 에 위치한 픽셀

  4. p이미지가 수직 및 수평으로 뒤집힐 때의 위치 에 위치한 픽셀

결과 이미지를 일반 PPM (P3) 형식으로 출력합니다.

자세한 설명은 128x128로 확대 된이 8x8 이미지를 고려하십시오.

2 단계 예

하자 p적색 픽셀 수. p(및 3 개의 파란색 픽셀)에 대한 새 값을 계산하려면 및 3 개의 파란색 픽셀 값이 p함께 평균화됩니다.

p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)

PPM : 입력 , 출력


PPM : 입력 , 출력


PPM : 입력 , 출력


PPM : 입력 , 출력


참조 구현

#!/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])

이 프로그램은 단일 파일 이름을 입력으로 사용하여의 출력과 같이 형식화 pngtopnm <pngfile> -plain되며 공백으로 구분 된 한 줄의 PPM 데이터를 출력합니다.


P3 형식에 대한 간략한 설명

에서 생성 된 PPM 일반 텍스트 파일 pngtopnm <pngfile> -plain은 다음과 같습니다.

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>

<...>

이것은 입력 및 출력 파일 예제가 사용하는 형식입니다. 그러나 PNM은 형식이 매우 느슨 합니다. 공백이 있으면 값이 분리 될 수 있습니다. 위 파일의 모든 줄 바꿈을 각각 단일 공백으로 바꾸고 여전히 유효한 파일을 가질 수 있습니다. 예를 들어, 이 파일이 파일은 모두 유효하며, 동일한 이미지를 나타낸다. 다른 요구 사항은 파일이 후행 줄 바꿈으로 끝나야하고. 뒤에 width*heightRGB 삼중 항이 있어야한다는 것 255입니다.


규칙

  • 이것은 이므로 가장 짧은 유효한 솔루션이 승리합니다.
  • 위에서 설명한 PPM 형식에 따라 유효한 한 편리하고 일관된 방식으로 형식화 된 PPM 데이터를 입력 및 출력 할 수 있습니다. 유일한 예외는 이진 (P6) 형식이 아닌 일반 (P3) 형식을 사용해야한다는 것입니다.
  • 솔루션이 위의 테스트 이미지에 올바른 이미지를 출력하는지 확인해야합니다.
  • 모든 이미지의 비트 심도는 8 비트입니다.

추가 자료 : Netpbm 형식 위키 백과 페이지


스 니펫 테스트 (캘빈의 취미 덕분에)


ppm 파일을 열거 나 저장하는 이미지 라이브러리가 허용됩니까?
Calvin 's Hobbies

@ Calvin'sHobbies 예
Mego

3
" 뒤집기, 튀기다, 평균 " youtube.com/watch?v=D8K90hX4PrE
Luis Mendo

3
어쩌면 "Flip it, flop it, mean"?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ 저 사람 파티처럼 들리 네요. 루이스가 게시 한 내용입니다.
애디슨 크럼

답변:


4

Pyth, 30 29 바이트

zjms.OdC.nM[JrR7.zKm_cd3J_J_K

내 프로그램은 첫 번째 줄의 모든 메타 데이터와 stdin 후 줄의 이미지 데이터를 한 줄씩 기대합니다. 도움이되도록, 이것은 유효한 PPM 파일을 내 프로그램이 이해할 수있는 PPM 파일로 변환하는 작은 Python 프로그램입니다.

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)]))

이미지 데이터를 한 줄씩 가져 오면 작업이 정말 간단합니다. 먼저 이미지 데이터를 정수 목록 ( JrR7.z) 목록으로 읽은 다음 3 개의 정수를 그룹화하고 모든 행 ( Km_cd3J) 마다 뒤집어 수평으로 미러링 된 버전을 만듭니다 . 그런 다음 세로 미러링 된 버전은 간단하게 _J_K행을 뒤집을 수 있기 때문에 간단 합니다.

나는 모든 행렬을 가져 와서 각각을 1d 배열로 평면화하고 .nM, C각 픽셀 구성 요소의 목록 목록을 가져 오기 위해 조옮김 하고 , 각 목록을 int하기 위해 평균화하고 자르고 ms.Od, 마지막으로 줄 바꿈으로 결합하여 인쇄 j합니다.

내 프로그램은 다른 형식으로 출력을 생성하지만 여전히 유효한 PPM입니다. 데모 이미지는 이 imgur 앨범에서 볼 수 있습니다 .


13

배쉬 (+ ImageMagick), 64 + 1 = 65 바이트

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

작업에 적합한 도구입니다.

a변환 할 PPM 데이터가 포함 된 단일 파일 이 포함 된 디렉토리에서 실행해야합니다 . 이 파일 이름이 중요하므로 바이트 수에 1 바이트를 추가했습니다.

PNG 축소판 출력 (어쨌든 모두 동일하기 때문에 이것이 왜 필요한지 확실하지 않지만 질문은 그렇게 말합니다.) :

펭귄 퀴 토피아 베드로 미니 비트

2 바이트를 절약 한 nneonneo 에게 감사 합니다!


3
사람들이 테스트하지 않고 솔루션을 게시하는 나쁜 습관이 있기 때문에 출력이 필요합니다. 에 +1하여 -flop, 나는 그것이 깃발이라는 사실에 놀랐습니다.
Mego

1
대신 C=convert및 을 사용하여 2 바이트를 제거하십시오 . $Calias
nneonneo

12

Matlab, 106 82 80 바이트

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

이미지가 n*m*3매트릭스 로로드됩니다 . 그런 다음 행렬을 뒤집어 두 축 모두에 추가하고 파일에 다시 씁니다.


텍스트 파일을 너무 크게 업로드 할 위치를 찾을 수 없으므로 PNG 버전은 다음과 같습니다.


옴, 난 당신이 <img태그를 사용할 수 있는지 몰랐어요 !
flawr

1
MATLAB R2013b 및 최신 사용할 수 있습니다 플립을 대신 flipdim . 3 바이트를 더 절약 할 수 있습니다. flipdim 의 도움말에 따르면 : "flipdim은 향후 릴리스에서 제거 될 예정입니다. 대신 FLIP을 사용하십시오."
slvrbld

10

매스 매 티카, 86 84 바이트

조언을 주신 DavidC에게 감사드립니다. (2 바이트 절약)

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

제 1 및 제 2 파라미터는 각각 입력 및 출력 이미지에 대한 경로이다.


테스트 사례

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

결과

(PNG 버전의 이미지는 아래에 업로드됩니다)

Import["penguin2.pnm"]

Import["quintopia2.pnm"]

Import["peter2.pnm"]


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

4

줄리아, 157 바이트

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))

PPM 파일의 전체 경로가 포함 된 문자열을 받아들이고 변환 된 이미지로 덮어 쓰는 람다 함수입니다. 호출하려면 변수에 지정하십시오.

언 골프 드 :

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

출력 예 :

펭귄 퀴 토피아 베드로 미니 비트


4

파이썬 2 + PIL, 268

이제 이미지 뒤집기와 알파 블렌딩을 사용하여 PIL을 대량으로 사용합니다.

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

결과 이미지는 여기에서 볼 수 있습니다


1
규칙에 따라 테스트 케이스의 출력을 포함하십시오.
Mego
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.