Quixels - Kuantum Pikselleri


35

Giriş

Bir piksel bir kuantum pikseldir. Klasik bir piksele benzer şekilde 3 tam sayı değeriyle (Kırmızı, Yeşil, Mavi) gösterilir. Bununla birlikte, dörtlüler bir kombinasyon yerine bu 3 durumun süper pozisyonundadır. Bu süper pozisyon yalnızca, pikselin üç klasik pikselden birine çarptığı noktada gözlemlenene kadar sürer; RGB(255,0,0), RGB(0,255,0)Ve RGB(0,0,255).

Şartname

  • temsil
    • Her QUIXEL 0 ile 255 arasında, 3 tamsayı dizisi olarak temsil edilir r, gve bsırasıyla.
  • Süper Pozisyonlar
    • Her QUIXEL ile temsil Kırmızı, Mavi ve Yeşil devletler arasında bir süper konumda R, Gve Bsırasıyla.
  • Gözlem
    • Her piksel gözlendiğinde, üç durumdan birine çöker. Her klasik durumun olasılığı R = (r + 1) / (r + g + b +3), G = (g + 1) / (r + g + b + 3) ve B = (b + 1) / (r + g + b + 3). Bu şekilde her klasik devlet her zaman sıfır olmayan bir olasılık olarak ortaya çıkma olasılığıdır.
  • Giriş
    • İşlev veya program, bir görüntüden titizlik almalıdır. Bunu nasıl yapıyor esnek. Çok boyutlu bir dizi kullanarak dosya ismi vb. Kabul edilebilir.
  • Çıktı
    • İşlev veya program klasik piksellerin görüntüsünü üretmelidir. Bu üretilen görüntünün veri yapısı da esnektir. Piksel tüm bu üçünden biri olması gerektiğini unutmayın: RGB(255,0,0), RGB(0,255,0)veRGB(0,0,255)
    • Çıktı deterministik olmamalı ; bunlar kuantum pikseller! Aynı giriş farklı çıkışlarla sonuçlanmalıdır.
    • Dilinizde rastgele bir sayı üretme yolu yoksa, rastgele baytları girdi olarak alabilirsiniz.
  • puanlama

Görüntüler

Mona Lisa , Leonardo da Vinci tarafından Mona Lisa

Vincent van Gogh tarafından Yıldızlı Gece görüntü tanımını buraya girin

Belleğin Azmi tarafından Salvador Dali görüntü tanımını buraya girin

Teddy Roosevelt VS. SharpWriter tarafından Bigfoot görüntü tanımını buraya girin


Resim dosya adı / URL bir giriş bağımsız değişkeni olabilir mi?
Luis Mendo,

2
Mona Lisa'nın bu JPEG resmi, çıktı resimlerinde 16x16 belirgin görsel eserlere neden oluyor.
wizzwizz4

1
@ wizzwizz4 Aslında değil. Eski eserlere sahip olan küçültülmüş önizlemedir. Resmi tam boyutlu görmek için üzerine tıklayın. Sadece efekti veren görüntünün belirli genişliği olduğundan şüpheleniyorum.
Adám

2
Kuantum alanınız varsa daha iyi (görsel) sonuçlar elde edersiniz RGBK, bu durumda K=255*3-R-G-Bkuantum piksellerinizi 4'ten herhangi biri yapın (K seçiliyse, ekran (0,0,0). RGB denklemlerinizi Genişlet bariz bir şekilde, 3'leri 4'lere değiştirmek, R + G + B'yi ekleyeceğiniz zaman K'yi eklemek gibi). Bunu yaptıktan sonra yapılan bir bulanıklık, orijinalin oldukça iyi gürültülü bir kopyasını yeniden yapılandırmalıdır. (K, merak ediyorsanız siyah ya da anahtar anlamına gelir)
Yakk,

2
@TLW Dilinizde rastgele bir sayı oluşturma yolu yoksa, rastgele baytları girdi olarak alabilirsiniz
NonlinearFruit

Yanıtlar:


13

Dyalog APL , 23 21 19 bayt

(R, G, B) üçüzlerinin tablosunu alır.

Millerin algoritmasından esinlenildi

Dizin tablosunu {(255, 0, 0), (0, 255, 0), (0, 0, 255)} değerine döndürür. Korkunç savurganlık.

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

(
?∘≢rasgele indeks
seçer
gelen
her

(
her biri tarafından kopyalanan
⍳3ilk üç endeksin tümü
)/¨⍨

1+⊢ artan üçüzler

TryAPL!


Eski versiyon

0-temelli indeks tablosunu {(255, 0, 0), (0, 255, 0), (0, 0, 255)} 'e döndürür

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

{... }in tablodaki her piksel için, şunu bulun:

+/ toplamı (yani gerçeklerin sayısı)

(?0)≥ rastgele 0 <sayı <1 şuna eşit veya büyük

+\ kümülatif toplamı

(1+⍵)÷ Artan RGB değerlerinin bölü

3+ üç artı

+/⍵ pikselin toplamı

Not: Dyalog APL seçtiğiniz sağlar arasındaki benzeşimsel jeneratör doğrusal LEHMER , Mersenne Twister ve İşletim Sisteminin RNG ¹ ² .

Örneğin, görüntü:

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

verebilir

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

Üç "saf" quixelin kendi renklerine göre nasıl daraltıldığına dikkat edin.

TryAPL çevrimiçi!

Yıkılmış Mona Lisa


8

Mathematica, 53 bayt

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

Anonim işlev Mathematica'yı Imagegirdi olarak alır ve Imageçıktı olarak döndürür . Giriş görüntüsünün bir RGB renk alanına sahip olması gerektiğini unutmayın.


O nasıl çalışır?
GreenAsJade,

2
@GreenAsJade <...>~ImageApply~#görüntüdeki tüm pikseller üzerinde bir fonksiyon uygulanır ve RandomChoice[255#+1->IdentityMatrix@3]3 x 3 kimlik matrisinin bir satır elde etmek için, bazı ağırlıklı bir rasgele sayı üreteci kullanan (örneğin {1, 0, 0}, {0, 1, 0}ya da {0, 0, 1}), kırmızı, yeşil, ve mavi için olan karşılık gelir.
LegionMammal978

5

C #, 366 243 bayt

Bu golf oynamak için @ TheLethalCoder'a çok teşekkürler!

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

Temel fikir:

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

Örnekler:

Mona Lisa

görüntü tanımını buraya girin

Yıldızlı Gece

görüntü tanımını buraya girin

Hafızanın sürekliliği

görüntü tanımını buraya girin

Teddy Roosevelt VS. Büyük ayaklar

görüntü tanımını buraya girin

İşte bunun klasik olmayan olduğunu göstermek için birkaç örnek daha güncellenmiş bir imgur albümü.


6
Color.Lime, saf yeşil renktir. Gelecekte referans olması için, işte bilinen renk tablosu .
süt

1
Heres 237 baytlık bir golf versiyonuna sahip: 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;};Ve hala geliştirilebilecek gelişmeler var
TheLethalCoder

Aslında 237 bayt, fazladan bayt, inanıyorum kod yorumunda eklenen görünmez karakterlerdir
TheLethalCoder

4

Python 2, 172 166 162 bayt

İkinci ve üçüncü girinti seviyeleri sırasıyla ham sekme ve raw sekme sırasıyla boşluktur; Bu Markdown ile gerçekten kötü oynuyor , bu yüzden sekmeler iki boşluk ile değiştirildi.

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'ın APL cevabına benzer bir giriş / çıkış formatı kullanır . Giriş, 2B RGB tuples dizisidir; Çıktı 2D dizisidir 0, 1ya 2sırasıyla kırmızı, yeşil ve mavi temsil. Örneğin:

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

Aşağıda PIL kullanarak eski Python 3 cevabım.

Python 3 + PIL, 271 250 245 243 bayt

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

Her pikselin üzerinde yinelenir ve piksel işlevini uygular. Dosya adını giriş olarak alır ve çıktısını içine kaydeder o.png.

İşte bazı sonuçlar:

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

Mona Lisa, pikselleşmiş

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

Yıldızlı Gece, pikselleşmiş

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

Belleğin Kalıcılığı, pikselleştirilmiş

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

Teddy Roosevelt vs Bigfoot, pikselize edilmiş


Muhtemelen bir PRNG olduğundan ve kriptografik olarak güvenli bir RNG olmadığından @Doddy.
birileriyle

@someonewithpc Oh aslında, bu soruyu telefonumda görüntülerken, son görüntünün üzerinde düzenli olarak ızgara benzeri bir yapıya sahip olduğunu yazdım, ancak şimdi, bir bilgisayarda görüntülerken, bu etkiyi gösteren ilk görüntü.
Doddy

@Doddy Ah, evet! Telefonunuzdaki resme basmayı deneyin: efektler değişecek! Ben ... görüntü örneklemesi ile ilgili olduğunu tahmin
someonewithpc

@Doddy Belki de ilk sorunuzu siliniz, bu nedenle kırmızı bayraklı kırmızı çizgileri sorduğunuzu sanmıyoruz ...
GreenAsJade

4

R, 58 bayt

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

Girdi üç sayısal tutulan vektörler oluşur r, gve bsırasıyla.

Olasılıkları normalize etmemize gerek yoktur, bunlar otomatik olarak gerçekleşir rmultinom.

Çıktı biçimindedir

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

1Her sütunda bir tane olduğu yerde . 1"R", "G" için piksel, ikinci satır ve "B" için üçüncü sıradaki birinci sıradadır.



4

J, 20 18 17 bayt

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

Görüntü, RGB değerlerini 0 - 255 aralığında tamsayılar olarak temsil eden, h x w x 3 boyutuna sahip bir dizi olarak girilir . Çıktı, h x w boyutlarına sahip bir tablodur, burada 1, rgb değeridir (255, 0, 0 ), 2, (0, 255, 0) ve 3, (0, 0, 255) 'dir.

açıklama

()"1Bu fiil her uygulanır, yani giriş Derece 1 arasında, her bir dizi uygulanacak olduğunu gösterir piksel .

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

Örnek


1
Mona Lisa'nızın diğerlerine göre farklı bir renk şeması vardır. Doğru çalıştığından emin misin?
wizzwizz4

@ wizzwizz4 Teşekkürler, resmi görüntülerken, ters sırada rgb pikselleri vardı.
mil

4

Jöle , 8 7 bayt

Jx‘Xµ€€

Girdi, h x w x 3 boyutlarına sahip bir 3d listesidir . Çıktı, h x w boyutlarına sahip bir 2d listesidir, burada 1, rgb değerini (255, 0, 0) gösterir, 2, (0, 255, 0) ve 3, (0, 0, 255).

Aşağıdaki örnek giriş, Mona Lisa görüntüsünün sol üst 4 x 4 bölgesidir.

Çevrimiçi deneyin!

açıklama

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 bayt

Burada mher bir piksel şeklinde bir listesi piksel 2 boyutlu dizi olarak alınan girişidir [r,g,b]. Her pikselin pozisyonunda sırasıyla 0,1,2gösterime döner (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]

Değişken olarak giriş yapmanıza izin verildiğini sanmıyorum (normal IO'yu destekleyen bir dilde tam bir program yazarken). Bence bunu kullanmak inputveya bir işlev yapmak ve mbir parametre olarak almak zorunda .
NonlinearFruit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.