พลิกมันล้มเหลวหมายถึงมัน


24

ภาพรวม

กำหนดภาพในรูปแบบ PPM ธรรมดา (P3) เป็นอินพุตสำหรับแต่ละพิกเซลpในภาพให้แทนที่แต่ละสีแดงเขียวและน้ำเงิน 4 พิกเซลต่อไปนี้ด้วยค่าเฉลี่ยที่เป็นพื้นของช่องทางที่เกี่ยวข้องของพิกเซลทั้ง 4:

  1. p ตัวเอง

  2. พิกเซลตั้งอยู่ที่pตำแหน่งของเมื่อภาพถูกพลิกในแนวตั้ง

  3. พิกเซลตั้งอยู่ที่pตำแหน่งของเมื่อภาพถูกพลิกในแนวนอน

  4. พิกเซลตั้งอยู่ที่pตำแหน่งเมื่อภาพถูกพลิกทั้งในแนวตั้งและแนวนอน

แสดงผลภาพที่ได้ในรูปแบบ PPM ธรรมดา (P3)

สำหรับคำอธิบายเพิ่มเติมให้พิจารณาภาพ 8x8 นี้ขยายเป็น 128x128:

ตัวอย่างขั้นตอนที่ 2

อนุญาตpเป็นพิกเซลสีแดง ในการคำนวณค่าใหม่สำหรับp(และพิกเซล 3 สีฟ้า) ค่าของpและพิกเซลสีน้ำเงิน 3 ค่าจะถูกรวมเข้าด้วยกัน:

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*heightแฝดสาม RGB 255ดังต่อไปนี้


กฎระเบียบ

  • นี่คือ ดังนั้นวิธีแก้ปัญหาที่สั้นที่สุดจะชนะ
  • คุณสามารถป้อนข้อมูลและส่งออกข้อมูล PPM ที่จัดรูปแบบในลักษณะที่สะดวกและสอดคล้องกันตราบใดที่มันถูกต้องตามรูปแบบ PPM ที่อธิบายไว้ข้างต้น ข้อยกเว้นเพียงอย่างเดียวคือคุณต้องใช้รูปแบบธรรมดา (P3) และไม่ใช่รูปแบบไบนารี (P6)
  • คุณต้องให้การตรวจสอบว่าทางออกของคุณส่งภาพที่ถูกต้องสำหรับภาพทดสอบข้างต้น
  • ภาพทั้งหมดจะมีความลึกบิต 8 บิต

อ่านเพิ่มเติม: หน้ารูปแบบ Netpbm วิกิพีเดีย


ตัวอย่างการทดสอบ (ขอบคุณงานอดิเรกของ Calvin สำหรับเรื่องนี้)


ไลบรารีรูปภาพที่เปิด / บันทึกไฟล์ ppm ได้รับอนุญาตหรือไม่
งานอดิเรกของ Calvin

@ Calvin'sHobbies Yes
Mego

3
" พลิกมันปัดมันโดยเฉลี่ย " youtube.com/watch?v=D8K90hX4PrE
Luis Mendo

3
อาจจะ "พลิกมันปัดมันหมายถึง"?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴฟังดูคล้ายกับปาร์ตี้บางคนโอ้โหรออะไรหลุยส์โพสต์
Addison Crump

คำตอบ:


4

Pyth, 30 29 ไบต์

zjms.OdC.nM[JrR7.zKm_cd3J_J_K

โปรแกรมของฉันคาดว่าข้อมูลเมตาทั้งหมดในบรรทัดแรกและข้อมูลภาพแถวต่อแถวในบรรทัดหลังจากบน stdin เพื่อช่วยนี่เป็นโปรแกรม Python ขนาดเล็กเพื่อแปลงไฟล์ PPM ที่ถูกต้องใด ๆ ให้เป็นไฟล์ PPM ที่โปรแกรมของฉันสามารถเข้าใจได้:

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

Bash (+ ImageMagick), 64 + 1 = 65 ไบต์

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

เครื่องมือที่เหมาะสมสำหรับงาน

จะต้องทำงานในไดเรกทอรีที่มีไฟล์เดียวaที่มีข้อมูล PPM ที่จะแปลง เนื่องจากชื่อไฟล์นี้มีความสำคัญฉันจึงเพิ่มหนึ่งไบต์ไปยังจำนวนไบต์

รูปขนาดย่อ PNG แสดงผล (ไม่แน่ใจว่าทำไมจึงมีความจำเป็นเพราะยังเหมือนเดิมทุกประการ แต่คำถามบอกเช่นนั้นดังนั้น ... ):

เพนกวิน quintopia จางไป minibits

ขอบคุณnneonneoสำหรับการบันทึก 2 ไบต์!


3
ฉันต้องการผลลัพธ์เพราะผู้คนมีนิสัยที่ไม่ดีในการโพสต์โซลูชันโดยไม่ต้องทดสอบพวกเขา +1 สำหรับ-flopฉันต้องการประหลาดใจจริง ๆ ว่าเป็นธง
Mego

1
โกน 2 ไบต์โดยใช้C=convertและแทน$C alias
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แท็กได้!
ข้อบกพร่อง

1
ใน MATLAB R2013b และใหม่ก็เป็นไปได้ที่จะใช้พลิกแทนflipdim นั่นจะช่วยให้คุณประหยัดได้อีก 3 ไบต์ จริง ๆ แล้วความช่วยเหลือของflipdimกล่าวว่า: "flipdim จะถูกลบในการเปิดตัวในอนาคตใช้ FLIP แทน"
slvrbld

10

Mathematica, 86 84 ไบต์

ขอบคุณ DavidC สำหรับคำแนะนำ (บันทึก 2 ไบต์)

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

พารามิเตอร์ที่หนึ่งและสองคือเส้นทางไปยังภาพที่นำเข้าและส่งออกตามลำดับ


กรณีทดสอบ

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

Julia, 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 และเขียนทับด้วยอิมเมจที่แปลงแล้ว หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

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

ตัวอย่างผลลัพธ์:

เพนกวิน quintopia จางไป minibits


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.