Pixel - Quantenpixel


35

Einführung

Ein Quixel ist ein Quantenpixel. Ähnlich wie bei einem klassischen Pixel wird es mit 3 ganzzahligen Werten (Rot, Grün, Blau) dargestellt. Anstelle einer Kombination befinden sich die Pixel jedoch in einer Superposition dieser drei Zustände. Diese Superposition hält nur so lange an, bis das Quixel beobachtet wird und zu einem von drei klassischen Pixeln zusammenfällt. RGB(255,0,0), RGB(0,255,0)Und RGB(0,0,255).

Spezifikation

  • Darstellung
    • Jede QUIXEL ist als eine Anordnung von 3 ganzen Zahlen dargestellt zwischen 0 und 255 r, gund bjeweils.
  • Super Positionen
    • Jeder QUIXEL ist in einer Superposition zwischen dem Rot, Blau und Grün Staaten vertreten durch R, Gund Bjeweils.
  • Überwachung
    • Wenn jedes Pixel beobachtet wird, kollabiert es in einen der drei Zustände. Die Wahrscheinlichkeit eines jeden klassischen Zustand ist R = (r + 1) / (r + g + b +3), G = (g + 1) / (r + g + b + 3) und B = (b + 1) / (r + g + b + 3). Auf diese Weise zeigt sich jeder klassische Zustand immer mit einer Wahrscheinlichkeit ungleich Null.
  • Eingang
    • Die Funktion oder das Programm sollte ein Bild von Pixeln aufnehmen. Wie das geht ist flexibel. Ein Dateiname, der ein mehrdimensionales Array usw. verwendet, ist akzeptabel.
  • Ausgabe
    • Die Funktion oder das Programm sollte ein Bild von klassischen Pixeln erzeugen. Die Datenstruktur für dieses erzeugte Bild ist ebenfalls flexibel. Beachten Sie, dass alle Pixel eines dieser drei sein sollte: RGB(255,0,0), RGB(0,255,0)undRGB(0,0,255)
    • Die Ausgabe sollte nicht deterministisch sein . Das sind Quantenpixel ! Der gleiche Eingang sollte zu unterschiedlichen Ausgängen führen.
    • Wenn Ihre Sprache keine Möglichkeit hat, eine Zufallszahl zu generieren, können Sie Zufallsbytes als Eingabe verwenden
  • Wertung
    • Dies ist so dass nur wenige Bytes gewinnen.

Bilder

Mona Lisa von Leonardo da Vinci Mona Lisa

Sternennacht von Vincent van Gogh Bildbeschreibung hier eingeben

Beharrlichkeit der Erinnerung von Salvador Dali Bildbeschreibung hier eingeben

Teddy Roosevelt VS. Bigfoot von SharpWriter Bildbeschreibung hier eingeben


Kann der Dateiname / die URL des Bildes ein Eingabeargument sein?
Luis Mendo

2
Dieses JPEG-Bild der Mona Lisa verursacht auf den Ausgabebildern 16x16 herausragende visuelle Artefakte.
Wizzwizz4

1
@ wizzwizz4 Eigentlich ist es nicht. Es ist die verkleinerte Vorschau, die Artefakte aufweist. Klicken Sie auf ein Bild, um es in voller Größe anzuzeigen. Ich vermute, es ist die bestimmte Breite nur dieses Bildes, die den Effekt gibt.
Adám

2
Sie erhalten bessere (visuelle) Ergebnisse, wenn Ihr Quantenraum war RGBK, wo K=255*3-R-G-B, dann machen Sie Ihre Quantenpixel zu einem der 4. (Wenn K ausgewählt ist, zeigen Sie (0,0,0) an. Erweitern Sie Ihre RGB-Gleichungen in offensichtliche Weise, Ändern von 3s zu 4s, Hinzufügen von K, wenn Sie R + G + B hinzufügen würden, etc). Eine Unschärfe danach sollte eine recht ordentliche, verrauschte Kopie des Originals erzeugen. (K steht für Schwarz oder Schlüssel, falls Sie sich gefragt haben)
Yakk

2
@TLW Wenn Ihre Sprache keine Möglichkeit hat, eine Zufallszahl zu generieren, können Sie Zufallsbytes als Eingabe verwenden
NonlinearFruit,

Antworten:


13

Dyalog APL , 23 21 19 Bytes

Nimmt Tabelle von (R, G, B) Drillingen.

Inspiriert vom Meilenalgorithmus

Gibt die Indextabelle in {(255, 0, 0), (0, 255, 0), (0, 0, 255)} zurück. Schrecklich verschwenderisch.

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

(
?∘≢Zufallsindex
wählt
aus
jedem von

(
die gesamten
⍳3ersten drei Indizes
)/¨⍨von jedem von repliziert

1+⊢ die inkrementierten Drillinge

TryAPL!


Alte Version

Gibt eine Tabelle mit 0-basierten Indizes in {(255, 0, 0), (0, 255, 0), (0, 0, 255)} zurück.

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

{... }¨ Finden Sie für jedes Pixel in der Tabelle Folgendes:

+/ die Summe von (dh Anzahl der Wahrheiten von)

(?0)≥ eine zufällige 0 <Zahl <1 ist größer oder gleich

+\ die kumulative Summe von

(1+⍵)÷ Die inkrementierten RGB-Werte geteilt durch

3+ drei plus

+/⍵ die Summe der Quixel

Hinweis: Dyalog APL können Sie wählten zwischen dem Lehmer Kongruenzgenerator , der Mersenne Twister und das Betriebssystem des RNG ¹ ² .

Zum Beispiel das Bild:

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

kann geben

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

Beachten Sie, wie die drei "reinen" Pixel auf ihre jeweiligen Farben reduziert wurden.

TryAPL online!

Zusammengebrochene Mona Lisa


8

Mathematica, 53 Bytes

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

Anonyme Funktion. Nimmt eine Mathematica Imageals Eingabe und gibt eine Imageals Ausgabe zurück. Beachten Sie, dass das Eingabebild einen RGB-Farbraum haben muss.


Wie funktioniert es?
GreenAsJade

2
@GreenAsJade <...>~ImageApply~#wendet eine Funktion über alle Pixel in dem Bild und RandomChoice[255#+1->IdentityMatrix@3]verwendet einige gewichtet RNG eine Zeile der 3 × 3 - Einheitsmatrix zu erzeugen (dh {1, 0, 0}, {0, 1, 0}oder {0, 0, 1}) entspricht , zu rot, grün oder blau.
LegionMammal978

5

C #, 366 243 Bytes

Vielen Dank an @TheLethalCoder für das Golfen!

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

Grundidee:

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

Beispiele:

Mona Lisa

Bildbeschreibung hier eingeben

Sternenklare Nacht

Bildbeschreibung hier eingeben

Beharrlichkeit der Erinnerung

Bildbeschreibung hier eingeben

Teddy Roosevelt VS. Bigfoot

Bildbeschreibung hier eingeben

Hier ist ein aktualisiertes Imgur-Album mit ein paar weiteren Beispielen, um zu zeigen, dass dies nicht deterministisch ist.


6
Color.Lime ist die reine grüne Farbe. Für zukünftige Referenz ist hier die bekannte Farbtabelle .
Melken Sie

1
Hier ist eine Golf-Version für 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;};Und es gibt noch Verbesserungen, die gemacht werden können
TheLethalCoder

Seine tatsächlich 237 Bytes die zusätzlichen Bytes sind unsichtbare Zeichen, die in den Code-Kommentar hinzugefügt werden, glaube ich
TheLethalCoder

4

Python 2, 172 166 162 Bytes

Die Ebenen für den zweiten und dritten Gedankenstrich bestehen aus einem unformatierten Tabulator und einem unformatierten Tabulator sowie einem Leerzeichen. Dies spielt wirklich schlecht mit Markdown, so dass die Tabulatoren durch zwei Leerzeichen ersetzt wurden.

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

Verwendet ein ähnliches Eingabe- / Ausgabeformat wie die APL-Antwort von Adám . Die Eingabe ist ein 2D-Array von RGB-Tupeln. Ausgang ist ein 2D - Array aus 0, 1oder 2, was rot, grün und blau sind. Beispielsweise:

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

Unten ist meine ältere Python 3-Antwort mit 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')

Iteriert über jedes Pixel und wendet die Quixel-Funktion darauf an. Übernimmt den Dateinamen als Eingabe und speichert die Ausgabe in o.png.

Hier sind einige Ergebnisse:

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

Mona Lisa, verpixelt

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

Sternennacht, verpixelt

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

Persistenz des Gedächtnisses, verpixelt

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

Teddy Roosevelt vs Bigfoot, verpixelt


@Doddy Wahrscheinlich, weil es sich um ein PRNG und nicht um ein kryptografisch sicheres RNG handelt.
Someonewithpc

@someonewithpc Oh, eigentlich habe ich diese Frage beim Betrachten auf meinem Telefon geschrieben, auf dem das letzte Bild ein reguläres gitterartiges Muster aufweist. Jetzt ist es beim Betrachten auf einem Computer das erste Bild mit diesem Effekt.
Doddy

@Doddy Oh, ja! Versuchen Sie, auf das Bild auf Ihrem Telefon zu drücken: Die Effekte werden umgeschaltet! Ich denke, es geht um Bildabtastung ...
Someonewithpc

@Doddy Vielleicht löschen Sie Ihre erste Frage, damit wir nicht glauben, dass Sie nach den dichten roten Streifen fragen ...
GreenAsJade

4

R, 58 Bytes

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

Eingabe besteht aus drei numerischen Vektoren gehalten in r, gund bjeweils.

Wir müssen die Wahrscheinlichkeiten nicht normalisieren, um eine Summe zu bilden, was automatisch in geschieht rmultinom.

Die Ausgabe erfolgt in der Form

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

Wo gibt es eine einzelne 1in jeder Spalte. Das 1steht in der ersten Zeile für "R" -Pixel, in der zweiten Zeile für "G" und in der dritten Zeile für "B".



4

J, 20 - 18 - 17 Bytes

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

Das Bild wird als Array mit den Abmessungen h x w x 3 eingegeben, die die RGB-Werte als Ganzzahlen im Bereich von 0 bis 255 darstellen. Die Ausgabe ist eine Tabelle mit den Abmessungen h x w, wobei 1 ein RGB-Wert von (255, 0, 0) ist ), 2 ist (0, 255, 0) und 3 ist (0, 0, 255).

Erläuterung

Das ()"1bedeutet , dass dieses VERB jedes Array des Rangs 1 in dem Eingang angelegt werden soll, was bedeutet , dass es für jeden gelten 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

Beispiel


1
Ihre Mona Lisa hat ein anderes Farbschema als die anderen. Bist du sicher, dass es richtig funktioniert?
Wizzwizz4

@ wizzwizz4 Danke, beim Anzeigen des Bildes hatte ich die RGB-Pixel in umgekehrter Reihenfolge.
Meilen

4

Gelee , 8 7 Bytes

Jx‘Xµ€€

Die Eingabe ist eine 3D-Liste mit den Abmessungen h x w x 3. Die Ausgabe ist eine 2D-Liste mit den Abmessungen h x w, wobei 1 den RGB-Wert (255, 0, 0) darstellt, 2 (0, 255, 0) und 3 ist (0, 0, 255).

Die folgende Beispieleingabe ist der 4 x 4-Bereich oben links im Mona Lisa-Bild.

Probieren Sie es online!

Erläuterung

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 Bytes

Wobei mdie Eingabe als 2D-Array von Pixeln verwendet wird, wobei jedes Pixel eine Liste des Formulars ist [r,g,b]. Kehrt an jeder Pixelposition zurück 0,1,2, um (250,0,0), (0,250,0), and (0,0,250)jeweils darzustellen .

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]

Ich glaube nicht, dass Sie Eingaben als Variable annehmen dürfen (wenn Sie ein vollständiges Programm in einer Sprache schreiben, die normale E / A unterstützt). Ich denke, Sie müssen inputeine Funktion verwenden oder machen und mals Parameter nehmen.
NonlinearFruit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.