翻转,翻转,刻意


24

总览

给定纯PPM(P3)格式的图像作为输入,对于图像p中的每个像素,将以下4个像素的红色,绿色和蓝色分别替换为所有4个像素各自通道的下限平均值:

  1. p 本身

  2. p垂直翻转图像时位于的位置的像素

  3. p水平翻转图像时位于的位置的像素

  4. p垂直和水平翻转图像时位于的位置的像素

以纯PPM(P3)格式输出结果图像。

为了进一步说明,请考虑将此8x8图像放大到128x128:

第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格式有效即可。唯一的例外是您必须使用普通(P3)格式,而不是二进制(P6)格式。
  • 您必须提供验证,以确保您的解决方案可以为上述测试图像输出正确的图像。
  • 所有图像的位深度为8位。

额外阅读:Netpbm格式的维基百科页面


测试代码段(感谢卡尔文的兴趣爱好)


是否允许打开/保存ppm文件的图像库?
加尔文的爱好

@ Calvin'sHobbies是
Mego

3
翻转,翻转,平均youtube.com/watch?v=D8K90hX4PrE
Luis Mendo

3
也许是“翻转,失败,是认真的”?
科纳·奥布莱恩

2
@CᴏɴᴏʀO'Bʀɪᴇɴ这听起来像是一场派对,哦,等等,路易斯发布了什么。
Addison Crump

Answers:


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进行转置以获得每个像素分量的列表列表,取平均值并截断以将每个列表整数化(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缩略图输出(不确定为什么这样做是必要的,因为无论如何它们都是相同的,但是问题是这样的,所以...):

企鹅 昆托 彼得 微型位

感谢nneonneo节省了2个字节!


3
我需要输出,因为人们习惯于发布解决方案而不进行测试。为+1 -flop,我真的很惊讶它是一面旗帜。
Mego

1
使用C=convert$C代替2个字节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及更高版本中,可以使用flip而不是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

朱莉娅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))

这是一个lambda函数,它接受包含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

python 2 + PIL,268

现在我大量使用PIL,使用图像翻转和Alpha混合

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.