Quixels - Pixels quânticos

35

Introdução

Um quixel é um pixel quântico. Semelhante a um pixel clássico, é representado com 3 valores inteiros (vermelho, verde, azul). No entanto, os quixels estão em uma super posição desses 3 estados, em vez de uma combinação. Essa super posição dura apenas até que o quixel seja observado, no ponto em que cai para um dos três pixels clássicos; RGB(255,0,0), RGB(0,255,0)E RGB(0,0,255).

Especificação

  • Representação
    • Cada quixel é representado como uma matriz de 3 números inteiros entre 0 e 255 r, ge brespectivamente.
  • Super Posições
    • Cada Quixel está em uma posição de super entre o vermelho, azul e verde estados representados por R, Ge Brespectivamente.
  • Observação
    • Quando cada quixel é observado, ele entra em colapso em um dos três estados. A probabilidade de cada estado clássico é R = (r + 1) / (r + g + b +3), G = (g + 1) / (r + g + b + 3) e B = (b + 1) / (r + g + b + 3). Dessa forma, cada estado clássico sempre tem uma probabilidade diferente de zero de aparecer.
  • Entrada
    • A função ou programa deve ter uma imagem de quixels. Como isso é flexível. Um nome de arquivo, usando uma matriz multidimensional, etc, são aceitáveis.
  • Saída
    • A função ou programa deve produzir uma imagem de pixels clássicos. A estrutura de dados para esta imagem produzida também é flexível. Note-se que todos os pixels deve ser um destes três: RGB(255,0,0), RGB(0,255,0)eRGB(0,0,255)
    • A saída não deve ser determinística ; estes são pixels quânticos ! A mesma entrada deve resultar em saídas diferentes.
    • Se seu idioma não tem como gerar um número aleatório, você pode usar bytes aleatórios como entrada
  • Pontuação

Imagens

Mona Lisa por Leonardo da Vinci Monalisa

Noite estrelada por Vincent van Gogh insira a descrição da imagem aqui

Persistência da Memória por Salvador Dali insira a descrição da imagem aqui

Teddy Roosevelt VS. Bigfoot por SharpWriter insira a descrição da imagem aqui

NonlinearFruit
fonte
O nome do arquivo / URL da imagem pode ser um argumento de entrada?
Luis Mendo
2
Essa imagem JPEG da Mona Lisa está causando artefatos visuais proeminentes de 16x16 nas imagens de saída.
Wizzwizz4
11
@ wizzwizz4 Na verdade, não é. É a visualização reduzida que possui artefatos. Clique na imagem para vê-la em tamanho real. Eu suspeito que é a largura particular apenas dessa imagem que dá o efeito.
Adám 31/08/16
2
Você obterá melhores resultados (visuais) se o seu espaço quântico for RGBKonde K=255*3-R-G-B, em seguida, faça com que seus pixels quânticos sejam um dos 4. (Se K estiver selecionado, exiba (0,0,0). maneira óbvia, alterando 3s para 4s, adicionando K quando você adicionaria R + G + B, etc). Um borrão depois de fazer isso deve reconstruir uma cópia barulhenta bastante decente do original. (K significa preto ou chave, no caso de você se perguntou)
Yakk
2
@TLW Se o seu idioma não tem nenhuma maneira de gerar um número aleatório, você pode tomar bytes aleatórios como entrada
NonlinearFruit

Respostas:

13

Dyalog APL , 23 21 19 bytes

Toma a tabela de trigêmeos (R, G, B).

Inspirado no algoritmo das milhas

Retorna a tabela de índices em {(255, 0, 0), (0, 255, 0), (0, 0, 255)}. Terrivelmente inútil.

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

(
?∘≢ índice aleatório
seleciona
de
cada um

(
os
⍳3três primeiros índices inteiros
)/¨⍨replicados por cada um dos

1+⊢ os trigêmeos incrementados

TryAPL!


Versão antiga

Retorna a tabela de índices baseados em 0 em {(255, 0, 0), (0, 255, 0), (0, 0, 255)}

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

{... }¨ para cada quixel na tabela, encontre o:

+/ a soma de (isto é, contagem de verdades de)

(?0)≥ um aleatório 0 <número <1 sendo maior ou igual a

+\ a soma acumulada de

(1+⍵)÷ os valores RGB incrementados divididos por

3+ mais três

+/⍵ a soma do quixel

Nota: O Dyalog APL permite escolher entre o gerador congruencial linear Lehmer , o Mersenne Twister e o RNG G ² do sistema operacional .

Por exemplo, a imagem:

┌──────────┬──────────┬───────────┬───────────┬─────────┐
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  
└──────────┴──────────┴───────────┴───────────┴─────────┘

pode dar

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

Observe como os três quixels "puros" desmoronaram em suas respectivas cores.

TryAPL online!

Mona Lisa em colapso

Adão
fonte
8

Mathematica, 53 bytes

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

Função anônima. Pega um Mathematica Imagecomo entrada e retorna um Imagecomo saída. Observe que a imagem de entrada deve ter um espaço de cores RGB.

LegionMammal978
fonte
Como funciona?
GreenAsJade 31/08/16
2
@GreenAsJade <...>~ImageApply~#aplica uma função ao longo do todos os pixels da imagem, e RandomChoice[255#+1->IdentityMatrix@3]utiliza alguns RNG ponderado para produzir uma linha da matriz identidade 3 × 3 (isto é {1, 0, 0}, {0, 1, 0}, ou {0, 0, 1}) que corresponde ao vermelho, verde ou azul.
LegionMammal978
5

C #, 366 243 bytes

Muito obrigado a @TheLethalCoder por jogar isso!

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;};

Ideia básica:

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;
}

Exemplos:

Monalisa

insira a descrição da imagem aqui

Noite estrelada

insira a descrição da imagem aqui

Persistência de memória

insira a descrição da imagem aqui

Teddy Roosevelt VS. Pé Grande

insira a descrição da imagem aqui

Aqui está um álbum imgur atualizado com mais alguns exemplos, para mostrar que isso não é determinístico.

ThreeFx
fonte
6
Color.Lime é a cor verde pura. Para referência futura, veja a tabela de cores conhecida .
milk
11
Heres uma versão golfed para 237 bytes: 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;};E ainda há melhorias que podem ser feitas
TheLethalCoder
É realmente 237 bytes os bytes extras são personagens invisíveis que são adicionados no comentário de código que eu acredito
TheLethalCoder
4

Python 2, 172 166 162 bytes

O segundo e o terceiro níveis de recuo são uma guia bruta e uma guia bruta mais um espaço, respectivamente; isso funciona muito mal com o Markdown, então as guias foram substituídas por dois espaços.

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

Usa um formato de entrada / saída semelhante à resposta do Adám no APL . A entrada é uma matriz 2D de tuplas RGB; saída é uma matriz 2D de 0, 1ou 2, representando vermelho, verde e azul, respectivamente. Por exemplo:

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

Abaixo está minha resposta mais antiga do Python 3 usando PIL.

Python 3 + PIL, 271 250 245 243 bytes

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

Repete cada pixel e aplica a função quixel a ele. Pega o nome do arquivo como entrada e salva sua saída em o.png.

Aqui estão alguns resultados:

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

Mona Lisa, quixelizada

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

Noite estrelada, quixelized

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

Persistência da Memória, quixelizada

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

Teddy Roosevelt vs Bigfoot, quixelized

Cobre
fonte
@Doddy Provavelmente porque é um PRNG e não um RNG criptograficamente seguro.
Someonewithpc
@someonewithpc Ah, na verdade, eu escrevi essa pergunta ao visualizar no meu telefone, onde a última imagem tem um padrão de grade regular, mas agora, vendo no computador, é a primeira imagem com esse efeito.
Doddy
@Doddy Oh, sim! Tente pressionar a imagem do seu telefone: os efeitos serão alternados! Eu acho que é sobre amostragem a imagem ...
someonewithpc
@Doddy Talvez excluir sua primeira pergunta, por isso não acho que você está perguntando sobre a bandeira densa tira vermelho ...
GreenAsJade
4

R, 58 bytes

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

A entrada consiste em três vetores numéricos mantidos em r, ge brespectivamente.

Não precisamos normalizar as probabilidades de somar uma, o que acontece automaticamente rmultinom.

Saída é da forma

     [,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

Onde existe um único 1em cada coluna. A 1é em primeira linha para pixels "R", a segunda linha de "L" e a terceira fila para "B".

JDL
fonte
4

Pitão - 11 10 bytes

Pega bitmap RGB 2d e gera bitmap com cores indexadas de 3 bits.

mLOs.emkbk

Esse nível de aninhamento está doendo minha cabeça.

Experimente online aqui .

Maltysen
fonte
4

J, 20 18 17 bytes

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

A imagem é inserida como uma matriz com dimensões h x w x 3 representando os valores RGB como números inteiros no intervalo de 0 a 255. A saída é uma tabela com dimensões h x w em que 1 é um valor rgb de (255, 0, 0 ), 2 é (0, 255, 0) e 3 é (0, 0, 255).

Explicação

O ()"1representa que esse verbo deve ser aplicado a cada matriz da classificação 1 na entrada, o que significa que será aplicado a cada 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

Exemplo

milhas
fonte
11
Sua Mona Lisa tem um esquema de cores diferente dos outros. Tem certeza de que funciona direito?
Wizzwizz4
@ wizzwizz4 Obrigado, ao exibir a imagem, eu tinha os pixels rgb na ordem inversa.
miles
4

Gelatina , 8 7 bytes

Jx‘Xµ€€

A entrada é uma lista 3d com dimensões h x w x 3. A saída é uma lista 2d com dimensões h x w em que 1 representa o valor rgb (255, 0, 0), 2 é (0, 255, 0) e 3 é (0, 0, 255).

A entrada de amostra abaixo é a região 4x4 superior esquerda da imagem da Mona Lisa.

Experimente online!

Explicação

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
milhas
fonte
3

Python 3, 119 bytes

Onde mé feita a entrada como uma matriz bidimensional de pixels em que cada pixel é uma lista do formulário [r,g,b]. Na posição de cada pixel, retorna 0,1,2para representar (250,0,0), (0,250,0), and (0,0,250)respectivamente.

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]
gowrath
fonte
Não acredito que você tenha permissão para receber entradas como uma variável (ao escrever um programa completo em um idioma que suporte IO normal). Eu acho que você tem que usar inputou tornar isso uma função e tomar mcomo parâmetro.
NonlinearFruit