Piksele - piksele kwantowe

35

Wprowadzenie

Quixel to piksel kwantowy. Podobnie jak klasyczny piksel, jest reprezentowany przez 3 wartości całkowite (czerwony, zielony, niebieski). Jednak piksele są w super pozycji tych 3 stanów zamiast kombinacji. Ta super pozycja trwa tylko do momentu zaobserwowania piksella, w którym to momencie zapada się w jeden z trzech klasycznych pikseli; RGB(255,0,0), RGB(0,255,0)I RGB(0,0,255).

Specyfikacja

  • Reprezentacja
    • Każdy Quixel jest reprezentowany jako tablica 3 liczb całkowitych od 0 do 255 r, gi bodpowiednio.
  • Super Pozycje
    • Każdy Quixel znajduje się w położeniu pomiędzy super-czerwony, niebieski i zielony członkowskie reprezentowane przez R, Gi Bodpowiednio.
  • Obserwacja
    • Kiedy obserwuje się każdy piksel, zapada się w jeden z trzech stanów. Prawdopodobieństwo każdego stanu klasycznego to R = (r + 1) / (r + g + b +3): G = (g + 1) / (r + g + b + 3) i B = (b + 1) / (r + g + b + 3). W ten sposób każdy stan klasyczny zawsze pojawia się jako niezerowe prawdopodobieństwo.
  • Wkład
    • Funkcja lub program powinien wykonać zdjęcie w postaci quikseli. Jak to robi, jest elastyczny. Akceptowana jest nazwa pliku, tablica wielowymiarowa itp.
  • Wydajność
    • Funkcja lub program powinien generować obraz klasycznych pikseli. Struktura danych dla tego wytworzonego obrazu jest również elastyczna. Zauważ, że wszystkie piksele powinno być jednym z tych trzech: RGB(255,0,0), RGB(0,255,0)iRGB(0,0,255)
    • Wynik nie powinien być deterministyczny ; to są piksele kwantowe ! To samo wejście powinno dawać różne wyniki.
    • Jeśli twój język nie ma możliwości wygenerowania losowej liczby, możesz pobrać losowe bajty jako dane wejściowe
  • Punktacja

Zdjęcia

Mona Lisa przez Leonardo da Vinci Mona Lisa

Starry Night przez Vincenta van Gogha wprowadź opis zdjęcia tutaj

Trwałość pamięci przez Salvador Dali wprowadź opis zdjęcia tutaj

Teddy Roosevelt VS. Bigfoot firmy SharpWriter wprowadź opis zdjęcia tutaj

Nieliniowe Owoce
źródło
Czy nazwa pliku / URL obrazu może być argumentem wejściowym?
Luis Mendo,
2
Ten obraz Mona Lisa w formacie JPEG powoduje powstanie widocznych artefaktów 16 x 16 na obrazach wyjściowych.
wizzwizz4,
1
@ wizzwizz4 W rzeczywistości tak nie jest. To pomniejszony podgląd zawierający artefakty. Kliknij obraz, aby wyświetlić go w pełnym rozmiarze. Podejrzewam, że to konkretna szerokość tylko tego obrazu daje efekt.
Adám
2
Otrzymasz lepsze (wizualne) wyniki, jeśli twoja przestrzeń kwantowa była RGBK, gdzie K=255*3-R-G-B, a następnie ustaw piksele kwantowe na dowolne z 4. (Jeśli wybrano K, wyświetl (0,0,0). Rozszerz równania RGB w oczywisty sposób, zmiana 3s na 4s, dodanie K, gdy dodasz R + G + B itp.). Rozmycie po wykonaniu tej czynności powinno zrekonstruować całkiem przyzwoitą, hałaśliwą kopię oryginału. (K oznacza czarny lub klucz, na wypadek gdybyś się zastanawiał)
Yakk
2
@TLW Jeśli twój język nie ma możliwości wygenerowania losowej liczby, możesz pobrać losowe bajty jako dane wejściowe
NonlinearFruit

Odpowiedzi:

13

Dyalog APL , 23 21 19 bajtów

Pobiera tabelę trypletów (R, G, B).

Inspirowany algorytmem mil

Zwraca tabelę indeksów do {(255, 0, 0), (0, 255, 0), (0, 0, 255)}. Okropnie marnotrawstwo.

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

(
?∘≢losowy indeks
wybiera
z
każdego z nich

(
wszystkie
⍳3trzy pierwsze wskaźniki
)/¨⍨powielone przez każdy z

1+⊢ inkrementowane trojaczki

TryAPL!


Stara wersja

Zwraca tabelę indeksów opartych na 0 na {(255, 0, 0), (0, 255, 0), (0, 0, 255)}

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

{... }¨ dla każdego quixela w tabeli znajdź:

+/ suma (tj. liczba prawd)

(?0)≥ losowe 0 <liczba <1 jest większa lub równa

+\ skumulowana suma

(1+⍵)÷ przyrostowe wartości RGB podzielone przez

3+ trzy plus

+/⍵ suma quixel

Uwaga: Dyalog APL pozwala wybrać między liniowym generatorem kongruencjalnym Lehmera , Mersenne Twister i RNG ¹ ² systemu operacyjnego .

Na przykład obraz:

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

może dać

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

Zauważ, jak trzy „czyste” piksele rozpadły się na swoje kolory.

Wypróbuj APL online!

Upadła Mona Lisa

Adám
źródło
8

Mathematica, 53 bajty

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

Funkcja anonimowa. Pobiera Mathematica Imagejako dane wejściowe i zwraca Imagejako dane wyjściowe. Pamiętaj, że obraz wejściowy musi mieć przestrzeń kolorów RGB.

LegionMammal978
źródło
Jak to działa?
GreenAsJade
2
@GreenAsJade <...>~ImageApply~#stosuje się funkcję w stosunku do wszystkich pikseli w obrazie, i RandomChoice[255#+1->IdentityMatrix@3]wykorzystuje pewną ważonej RNG do wytworzenia rzędu macierzy jednostkowej 3 x 3 (to znaczy {1, 0, 0}, {0, 1, 0}czy {0, 0, 1}), która odpowiada na czerwony, zielony lub niebieski.
LegionMammal978
5

C #, 366 243 bajtów

Ogromne podziękowania dla @TheLethalCoder za grę w golfa!

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

Podstawowy pomysł:

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

Przykłady:

Mona Lisa

wprowadź opis zdjęcia tutaj

Gwieździsta noc

wprowadź opis zdjęcia tutaj

Trwałość pamięci

wprowadź opis zdjęcia tutaj

Teddy Roosevelt VS. Bigfoot

wprowadź opis zdjęcia tutaj

Oto zaktualizowany album imgur z kilkoma innymi przykładami, aby pokazać, że jest to niedeterministyczne.

ThreeFx
źródło
6
Color.Lime to czysto zielony kolor. Dla przyszłego odniesienia, oto znana tabela kolorów .
mleko
1
Oto wersja golfowa na 237 bajtów: 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;};I wciąż można wprowadzić
ulepszenia
Jego tak naprawdę 237 bajtów, dodatkowe bajty to niewidoczne znaki, które są dodawane w komentarzu do kodu. Uważam, że
TheLethalCoder
4

Python 2, 172 166 162 bajtów

Poziomy tiret drugie i trzecie to odpowiednio tabulator surowy i tabulator surowy oraz spacja; gra działa naprawdę źle z Markdown, więc karty zostały zastąpione dwoma spacjami.

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

Używa podobnego formatu wejścia / wyjścia , co odpowiedź APL firmy Adám . Dane wejściowe to tablica 2D krotek RGB; Wyjście jest tablicą 2D 0, 1lub 2, co stanowi czerwonym, zielonym i niebieskim. Na przykład:

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

Poniżej znajduje się moja starsza odpowiedź w języku Python 3 przy użyciu PIL.

Python 3 + PIL, 271 250 245 243 bajtów

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

Iteruje po każdym pikselu i stosuje do niego funkcję quixel. Pobiera nazwę pliku jako dane wejściowe i zapisuje dane wyjściowe o.png.

Oto kilka wyników:

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

Mona Lisa, quixelized

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

Gwiaździsta noc, quixelized

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

Trwałość pamięci, quixelized

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

Teddy Roosevelt vs Bigfoot, quixelized

Miedź
źródło
@Doddy Prawdopodobnie dlatego, że jest to PRNG, a nie kryptograficznie bezpieczny RNG.
someonewithpc
@ someonewithpc O tak, napisałem to pytanie podczas oglądania na moim telefonie, gdzie ostatni obraz ma regularny wzór podobny do siatki, ale teraz, patrząc na komputerze, jest to pierwszy obraz z tym efektem.
Doddy,
@Doddy O tak! Spróbuj nacisnąć obraz w telefonie: efekty będą się przełączać! Chyba chodzi o próbkowanie obrazu ...
Someonewppc
@Doddy Może usuń swoje pierwsze pytanie, więc nie sądzimy, że pytasz o gęstą flagę czerwone paski ...
GreenAsJade
4

R, 58 bajtów

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

Wejściowy składa się z trzech wektorów numerycznych przeznaczonych do r, gi bodpowiednio.

Nie musimy znormalizować prawdopodobieństwa, aby sumować się do jednego, co dzieje się automatycznie w rmultinom.

Dane wyjściowe mają postać

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

Gdzie jest jeden 1w każdej kolumnie. 1Jest w pierwszym rzędzie dla pikseli „R”, w drugim rzędzie do „G” i trzecim rzędzie „B”.

JDL
źródło
4

Pyth - 11 10 bajtów

Pobiera bitmapę RGB 2d i wysyła bitmapę z indeksowanym 3-bitowym kolorem.

mLOs.emkbk

Ten poziom zagnieżdżania mnie boli.

Wypróbuj online tutaj .

Maltysen
źródło
4

J, 20 18 17 bajtów

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

Obraz jest wprowadzany jako tablica o wymiarach h x w x 3 reprezentujących wartości RGB jako liczby całkowite w zakresie 0 - 255. Dane wyjściowe to tabela o wymiarach h x w, gdzie 1 jest wartością rgb (255, 0, 0 ), 2 to (0, 255, 0), a 3 to (0, 0, 255).

Wyjaśnienie

()"1Oznacza, że ten czasownik ma być stosowana do każdej tablicy rangi 1 na wejściu, co oznacza, że będzie ona miała zastosowanie do każdego piksela .

>:({~?@#)@##\  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

Przykład

mile
źródło
1
Twoja Mona Lisa ma inną kolorystykę niż inne. Czy jesteś pewien, że to działa dobrze?
wizzwizz4,
@ wizzwizz4 Dzięki, podczas wyświetlania obrazu miałem piksele rgb w odwrotnej kolejności.
mile
4

Galaretka , 8 7 bajtów

Jx‘Xµ€€

Dane wejściowe to lista 3d o wymiarach h x w x 3. Dane wyjściowe to lista 2d o wymiarach h x w, gdzie 1 oznacza wartość rgb (255, 0, 0), 2 to (0, 255, 0), a 3 oznacza (0, 0, 255).

Przykładowe dane wejściowe poniżej to górny lewy region 4 x 4 obrazu Mona Lisa.

Wypróbuj online!

Wyjaśnienie

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
mile
źródło
3

Python 3, 119 bajtów

Gdzie mdane wejściowe są traktowane jako dwuwymiarowa tablica pikseli, gdzie każdy piksel jest listą formy [r,g,b]. W pozycji każdego piksela zwraca odpowiednio 0,1,2reprezentację (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]
gowrath
źródło
Nie sądzę, abyś mógł przyjmować dane wejściowe jako zmienną (podczas pisania pełnego programu w języku, który obsługuje normalne IO). Myślę, że musisz użyć inputtej funkcji lub ustawić ją mjako parametr.
NielinioweOwoce