Quixels-量子像素


35

介绍

quixel是一个量子像素。与经典像素类似,它用3个整数值(红色,绿色,蓝色)表示。但是,Quixel处于这三个状态的超级位置,而不是组合状态。该超高位置仅持续到观察到该quixel为止,在该点上它折叠为三个经典像素之一;RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)

规格

  • 表示
    • 每个QUIXEL被表示为3点的整数0和255之间的阵列rgb分别。
  • 超级职位
    • 每个QUIXEL是在红色,蓝色和绿色状态之间的超级位置由下式表示RGB分别。
  • 观察
    • 观察到每个轴对偶时,它会崩溃为三种状态之一。每个古典状态的概率R = (r + 1) / (r + g + b +3) G = (g + 1) / (r + g + b + 3)B = (b + 1) / (r + g + b + 3)。这样,每个古典状态总是以非零的出现概率出现。
  • 输入值
    • 该函数或程序应拍摄一个Quixel图像。如何做到这一点很灵活。文件名,使用多维数组等都可以接受。
  • 输出量
    • 函数或程序应生成经典像素的图像。此生成图像的数据结构也很灵活。请注意,所有的像素应该是这三个中的一个:RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)
    • 输出不应确定 ; 这些是量子像素!相同的输入应导致不同的输出。
    • 如果您的语言无法生成随机数,则可以将随机字节作为输入
  • 计分

图片

蒙娜丽莎Leonaardo da Vinci) 蒙娜丽莎

星夜梵高 在此处输入图片说明

萨尔瓦多·达利Salvador Dali)的持久记忆 在此处输入图片说明

泰迪·罗斯福VS。大脚怪SharpWriter) 在此处输入图片说明


图像文件名/ URL可以作为输入参数吗?
路易斯·门多

2
蒙娜丽莎的JPEG图像在输出图像上引起了16x16突出的视觉伪像。
wizzwizz4 '16

1
@ wizzwizz4其实不是。这是具有人工制品的缩小预览。单击图像以全尺寸查看。我怀疑只有这种图像的特殊宽度才能产生效果。
2013年

2
如果您的量子空间为RGBK,其中K=255*3-R-G-B,然后使您的量子像素为4的任何一个,您将获得更好的(视觉)结果。(如果选择了K,则显示(0,0,0)。将RGB方程扩展到一种明显的方法,将3s更改为4s,并在添加R + G + B等时添加K)。执行此操作后进行模糊处理应重建原样的相当不错的噪点副本。(如果您想知道的话,K代表黑色或黑色)
Yakk

2
@TLW如果您的语言无法生成随机数,则可以将随机字节作为输入
NonlinearFruit

Answers:


13

Dyalog APL23 21 19 字节

取(R,G,B)三胞胎表。

受Miles算法启发

将索引表返回到{(255,0,0),(0,255,0),(0,0,255)}中。太浪费了。

(?∘≢⊃⊢)¨(⊂⍳3)/¨⍨1+⊢

(
?∘≢从每个随机索引中
选择

(
整个
⍳3前三个索引分别
)/¨⍨由每个

1+⊢ 三胞胎增加

试试APL!


旧版

将基于0的索引表返回到{(255,0,0),(0,255,0),(0,0,255)}中

{+/(?0)≥+\(1+⍵)÷3++/⍵}¨

{... }¨对于表中的每个quixel,请找到:

+/ 的总和(即事实的计数)

(?0)≥ 随机0 <数字<1大于或等于

+\ 的累计和

(1+⍵)÷ RGB增量值除以

3+ 三加

+/⍵ quixel的总和

注:Dyalog APL 可以让你选择之间莱默线性同余发生器,在梅森倍捻机和操作系统的RNG ¹ ²

例如,图像:

┌──────────┬──────────┬───────────┬───────────┬─────────┐
52 241 198148 111 45197 165 1809 137 120  46 62 75 
├──────────┼──────────┼───────────┼───────────┼─────────┤
81 218 1040 0 255   0 255 0    181 202 116122 89 76
├──────────┼──────────┼───────────┼───────────┼─────────┤
181 61 34 84 7 27   233 220 24939 184 160 255 0 0  
└──────────┴──────────┴───────────┴───────────┴─────────┘

可以给

┌─┬─┬─┬─┬─┐
10221
├─┼─┼─┼─┼─┤
22112
├─┼─┼─┼─┼─┤
02120
└─┴─┴─┴─┴─┘

请注意,三个“纯” Quixel如何折叠为各自的颜色。

在线尝试APL!

蒙娜丽莎倒塌


8

Mathematica,53个字节

RandomChoice[255#+1->IdentityMatrix@3]&~ImageApply~#&

匿名函数。将Mathematica Image用作输入,并返回a Image作为输出。请注意,输入图像必须具有RGB颜色空间。


它是如何工作的?
GreenAsJade '16

2
@GreenAsJade <...>~ImageApply~#应用于在图像中的所有像素的功能,并且RandomChoice[255#+1->IdentityMatrix@3]使用了一些加权RNG以产生3×3的单位矩阵的行(即{1, 0, 0}{0, 1, 0}{0, 0, 1}),其对应于红色,绿色,或蓝色。
LegionMammal978 '16

5

C#,366243字节

非常感谢@TheLethalCoder打高尔夫球!

var r=new Random();c=>{double t=c.R+c.G+c.B+3,x=(c.R+1)/t,d=r.NextDouble();return d<=x?Color.Red:d<=x+(c.G+1)/t?Color.Lime:Color.Blue;};b=>{fo‌​r(int x=0,y;x<b.Width;x++)for(y=0;y<b.Height;y++)b.SetPixel(x,y,g(‌​b.GetPixel(x,y)));re‌​turn b;};

基本思路:

using System;
using System.Drawing;
static Random r = new Random();

static Image f(Bitmap a) {
    for (int x = 0; x < a.Width; x++) {
        for (int y = 0; y < a.Height; y++) {
            a.SetPixel(x, y, g(a.GetPixel(x, y)));
        }
    }
    return a;
}

static Color g(Color c) {
    int a = c.R;
    int g = c.G;
    double t = a + g + c.B + 3;
    var x = (a + 1) / t;
    var y = x + (g + 1) / t;
    var d = r.NextDouble();
    return d <= x ? Color.Red : d <= y ? Color.Lime : Color.Blue;
}

例子:

蒙娜丽莎

在此处输入图片说明

星夜

在此处输入图片说明

记忆的持久性

在此处输入图片说明

泰迪·罗斯福VS。大脚

在此处输入图片说明

这是一张带有更多示例的更新的imgur专辑,以表明这是不确定的。


6
Color.Lime是纯绿色。为了供将来参考,这是已知的颜色表
牛奶

1
这是237个字节的高尔夫版本:var r=new Random();c=>{double t=c.R+c.G+c.B+3,x=(c.R+1)/t,d=r.NextDouble();return d<=x?Color.Red:d<=x+(c.G+1)/t?Color.Lime:Color.Blue;};b=>{for(int x=0,y;x<b.Width;x++)for(y=0;y<b.Height;y++)b.SetPixel(x,y,g(b.GetPixel(x,y)));return b;};还有很多可以改进的地方
TheLethalCoder '16

我相信它实际上是237个字节,多余的字节是在代码注释中添加的不可见字符
TheLethalCoder

4

Python 2中,172个 166 162字节

第二和第三缩进级别分别是原始选项卡和原始选项卡加上空格。这对Markdown 真的很不利,因此选项卡已被替换为两个空格。

from random import*
i=input()
E=enumerate
for a,y in E(i):
 for b,x in E(y):
  t=sum(x)+3.;n=random()
  for j,u in E(x):
   n-=-~u/t
   if n<0:i[a][b]=j;break
print i

使用与Adám的APL答案类似的输入/输出格式。输入是RGB元组的2D数组;输出是的2D阵列012分别表示红色,绿色,和蓝色。例如:

$ echo "[[(181,61,34),(39,184,160),(255,0,0)],[(84,7,27),(123,97,5),(12,24,88)]]" | python quixel.py
[[2, 2, 0], [0, 0, 0]]

以下是我使用PIL的较旧的Python 3答案。

蟒3 + PIL,271个 250 245 243字节

import random as a,PIL.Image as q
i=q.open(input())
w,h=i.size
for k in range(w*h):
 m=k//h,k%h;c=i.getpixel(m);t=sum(c)+3;n=a.random()
 for j,u in enumerate(c):
  n-=-~u/t
  if n<0:z=[0]*3;z[j]=255;i.putpixel(m,tuple(z));break
i.save('o.png')

遍历每个像素并将quixel函数应用于该像素。将文件名作为输入并将其输出保存在中o.png

结果如下:

$ echo mona-lisa.jpg | python quixel.py

蒙娜丽莎(Mona Lisa),半透明

$ echo starry-night.jpg | python quixel.py

繁星点点的夜晚

$ echo persistence-of-memory.jpg | python quixel.py

记忆的持久性

$ echo roosevelt-vs-bigfoot.jpg | python quixel.py

泰迪·罗斯福(Teddy Roosevelt)vs大脚怪(Bigfoot)


@Doddy可能是因为它是PRNG而不是加密安全的RNG。
某人

@someonewithpc哦,实际上,我在手机上查看时写了这个问题,最后一张图像上有规则的网格状图案,但是现在,在计算机上查看,这是第一张具有这种效果的图像。

@Doddy哦,是的!尝试按手机上的图像:效果会切换!我猜这是关于图像采样的……
someonewithpc '16

@Doddy也许删除您的第一个问题,所以我们认为您不是在问密集的红色标志条纹吗?
GreenAsJade '16

4

R,58个字节

mapply(function(r,g,b)rmultinom(1,1,c(r+1,g+1,b+1)),r,g,b)

输入包括在召开了三次数值向量rgb分别。

我们不需要将总和的概率归一化,这在中自动发生rmultinom

输出形式为

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    0    0    0    0    0    0    0    0     0
[2,]    0    0    0    1    0    0    1    1    1     0
[3,]    1    1    1    0    1    1    0    0    0     1

1每列中只有一个。的1是第一排为“R”的像素,第二行为“G”和第三行为“B”的。



4

20 18 17字节

(>:({~?@#)@##\)"1

图像输入为尺寸为h x w的数组 x 3表示RGB值,其范围为0-255之间的整数。输出为尺寸为h x w的表,其中1是rgb值(255,0,0 ),2是(0,255,0),3是(0,0,255)。

说明

中的()"1表示该动词将应用于输入中排名1的每个数组,这意味着它将应用于每个pixel

>:({~?@#)@##\  Input: array [R G B]
>:             Increment each, gets [R+1, G+1, B+1]
           #\  Gets the length of each prefix of [R G B], forms [1 2 3]
          #    Make a new array with R+1 copies of 1, G+1 copies of 2,
               and B+1 copies of 3
  (     )@     Operate on that array
       #         Get the length of the array of copies, will be R+G+B+3
     ?@          Generate a random integer in the range [0, R+G+B+3)
   {~            Select the value at that index from the array of copies and return

例


1
您的蒙娜丽莎与其他人的配色方案不同。您确定它运作正常吗?
wizzwizz4'8

@ wizzwizz4谢谢,在显示图像时,我的rgb像素顺序相反。
英里

4

果冻8 7字节

Jx‘Xµ€€

输入是尺寸为h x w x 3的3d列表。输出是尺寸为h x 的2d列表。 w其中1表示rgb值(255,0,0),2表示(0,255,0),并且3是(0,0,255)。

下面的示例输入是蒙娜丽莎图像的左上4 x 4区域。

在线尝试!

说明

Jx‘Xµ€€  Input: The 3d list of rgb pixels
    µ    Begin a monadic chain (Will operate on each pixel, input: [R, G, B])
J          Enumerate indices to get [1, 2, 3]
  ‘        Increment each to get [R+1, G+1, B+1]
 x         Make R+1 copies of 1, G+1 copies of 2, B+1 copies of 3
   X       Select a random value from that list of copies and return
     €€  Apply that monadic chain for each list inside each list

3

Python 3,119个字节

其中m是取为像素的2-d阵列,其中每个像素是具有以下形式的列表中的输入[r,g,b]。在每个像素的位置,分别返回0,1,2代表(250,0,0), (0,250,0), and (0,0,250)

import random
lambda m:[map(lambda x:x.index(sum((((i+1)*[i])for i in x),[])[random.randint(0,sum(x)+2)]),i)for i in m]

我不认为您可以将输入作为变量使用(使用支持普通IO的语言编写完整的程序时)。我认为您必须使用input或使其成为函数并m作为参数。
NonlinearFruit16年
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.