Quixels - Quantum Pixels

35

pengantar

Quixel adalah piksel kuantum. Mirip dengan piksel klasik, ia direpresentasikan dengan 3 nilai integer (Merah, Hijau, Biru). Namun, quixel berada dalam posisi super 3 status ini, bukan kombinasi. Posisi super ini hanya berlangsung sampai quixel diamati pada titik mana ia runtuh menjadi satu dari tiga piksel klasik; RGB(255,0,0), RGB(0,255,0)dan RGB(0,0,255).

Spesifikasi

  • Perwakilan
    • Setiap quixel direpresentasikan sebagai larik 3 bilangan bulat antara 0 dan 255 r,, gdan bmasing - masing.
  • Posisi Super
    • Setiap quixel berada dalam posisi super antara negara Merah, Biru dan Hijau yang diwakili oleh R, Gdan Bmasing - masing.
  • Pengamatan
    • Ketika setiap quixel diamati, ia runtuh menjadi salah satu dari tiga kondisi. Probabilitas setiap keadaan klasik adalah R = (r + 1) / (r + g + b +3), G = (g + 1) / (r + g + b + 3) dan B = (b + 1) / (r + g + b + 3). Dengan cara ini setiap keadaan klasik selalu sebagai probabilitas yang tidak nol untuk muncul.
  • Memasukkan
    • Fungsi atau program harus mengambil gambar quixels. Cara kerjanya fleksibel. Nama file, menggunakan array multi-dimensi, dll semuanya dapat diterima.
  • Keluaran
    • Fungsi atau program harus menghasilkan gambar piksel klasik. Struktur data untuk gambar yang dihasilkan ini juga fleksibel. Perhatikan bahwa semua piksel harus menjadi salah satu dari tiga ini: RGB(255,0,0), RGB(0,255,0)danRGB(0,0,255)
    • Outputnya tidak harus deterministik ; ini adalah piksel kuantum ! Input yang sama harus menghasilkan output yang berbeda.
    • Jika bahasa Anda tidak memiliki cara untuk menghasilkan angka acak, Anda dapat mengambil byte acak sebagai input
  • Mencetak gol
    • Ini adalah sehingga byte paling sedikit menang.

Gambar

Mona Lisa oleh Leonardo da Vinci Mona lisa

Starry Night oleh Vincent van Gogh masukkan deskripsi gambar di sini

Persistence of Memory oleh Salvador Dali masukkan deskripsi gambar di sini

Teddy Roosevelt VS. Bigfoot oleh SharpWriter masukkan deskripsi gambar di sini

Buah Nonlinier
sumber
Bisakah nama file gambar / URL menjadi argumen input?
Luis Mendo
2
Gambar JPEG dari Mona Lisa itu menyebabkan 16x16 artefak visual yang menonjol pada gambar output.
wizzwizz4
1
@ wizzwizz4 Sebenarnya tidak. Ini adalah pratinjau yang dirampingkan yang memiliki artefak. Klik gambar untuk melihatnya berukuran penuh. Saya menduga hanya lebar tertentu dari gambar itulah yang memberikan efek.
Adám
2
Anda akan mendapatkan hasil (visual) yang lebih baik jika ruang kuantum Anda berada RGBK, di mana K=255*3-R-G-B, kemudian menjadikan piksel kuantum Anda menjadi salah satu dari 4. (Jika K dipilih, tampilkan (0,0,0). Perpanjang persamaan RGB Anda di cara yang jelas, mengubah 3s menjadi 4s, menambahkan K ketika Anda akan menambahkan R + G + B, dll). Kabur setelah melakukan ini harus merekonstruksi salinan berisik yang cukup baik dari aslinya. (K berarti hitam atau kunci, jika Anda bertanya-tanya)
Yakk
2
@ TTW Jika bahasa Anda tidak memiliki cara untuk menghasilkan angka acak, Anda dapat mengambil byte acak sebagai input
NonlinearFruit

Jawaban:

13

Dyalog APL , 23 21 19 byte

Mengambil tabel kembar tiga (R, G, B).

Terinspirasi oleh algoritma miles

Mengembalikan tabel indeks ke {(255, 0, 0), (0, 255, 0), (0, 0, 255)}. Sangat boros.

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

(
?∘≢indeks acak
memilih
dari
masing-masing

(
seluruh
⍳3tiga indeks pertama
)/¨⍨direplikasi oleh masing-masing

1+⊢ si kembar tiga bertambah

TryAPL!


Versi lama

Mengembalikan tabel indeks berbasis 0 ke {(255, 0, 0), (0, 255, 0), (0, 0, 255)}

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

{... }¨ untuk setiap quixel dalam tabel, cari:

+/ jumlah (yaitu jumlah kebenaran)

(?0)≥ 0 <angka <1 acak lebih besar dari atau sama dengan

+\ jumlah kumulatif

(1+⍵)÷ nilai RGB yang bertambah dibagi dengan

3+ tiga plus

+/⍵ jumlah quixel

Catatan: Dyalog APL memungkinkan Anda memilih antara Lehmer linear congruential generator , yang Mersenne Twister , dan System Operasi RNG ¹ ² .

Misalnya, gambar:

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

dapat memberi

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

Perhatikan bagaimana ketiga quixel "murni" itu runtuh ke warna masing-masing.

TryAPL online!

Mona Lisa yang pingsan

Adm
sumber
8

Mathematica, 53 byte

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

Fungsi anonim. Mengambil Mathematica Imagesebagai input dan mengembalikan Imageoutput sebagai. Perhatikan bahwa gambar input harus memiliki ruang warna RGB.

LegionMammal978
sumber
Bagaimana cara kerjanya?
GreenAsJade
2
@GreenAsJade <...>~ImageApply~#berlaku fungsi atas semua piksel dalam gambar, dan RandomChoice[255#+1->IdentityMatrix@3]menggunakan beberapa Ping tertimbang untuk menghasilkan deretan matriks identitas 3 × 3 (yaitu {1, 0, 0}, {0, 1, 0}, atau {0, 0, 1}) yang bersesuaian dengan merah, hijau, atau biru.
LegionMammal978
5

C #, 366 243 byte

Terima kasih banyak kepada @TheLethalCoder untuk bermain golf ini!

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

Ide dasar:

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

Contoh:

Mona lisa

masukkan deskripsi gambar di sini

Malam berbintang

masukkan deskripsi gambar di sini

Kegigihan Memori

masukkan deskripsi gambar di sini

Teddy Roosevelt VS. Kaki besar

masukkan deskripsi gambar di sini

Berikut adalah album imgur yang diperbarui dengan beberapa contoh lagi, untuk menunjukkan bahwa ini tidak deterministik.

ThreeFx
sumber
6
Warna. Kapur adalah warna hijau murni. Untuk referensi di masa mendatang, inilah tabel warna yang dikenal .
susu
1
Inilah versi golf untuk 237 byte: 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;};Dan masih ada perbaikan yang dapat dilakukan
TheLethalCoder
Sebenarnya 237 byte, byte tambahan adalah karakter yang tidak terlihat yang ditambahkan dalam komentar kode yang saya percaya
TheLethalCoder
4

Python 2, 172 166 162 byte

Level indent kedua dan ketiga adalah tab mentah dan tab mentah ditambah spasi, masing-masing; ini memainkan sangat buruk dengan penurunan harga, sehingga tab telah digantikan oleh dua spasi.

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

Menggunakan format input / output yang serupa dengan jawaban APL Adm . Input adalah array 2D tupel RGB; output array 2D 0, 1atau 2, mewakili merah, hijau, dan biru masing-masing. Sebagai contoh:

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

Di bawah ini adalah jawaban Python 3 saya yang lebih lama menggunakan PIL.

Python 3 + PIL, 271 250 245 243 byte

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

Iterasikan setiap piksel dan terapkan fungsi quixel untuknya. Mengambil nama file sebagai input dan menyimpan hasilnya o.png.

Berikut ini beberapa hasilnya:

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

Mona Lisa, quixelized

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

Starry Night, quixelized

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

Kegigihan Memori, digabungkan

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

Teddy Roosevelt vs Bigfoot, quixelized

Tembaga
sumber
@Doddy Mungkin karena itu adalah PRNG dan bukan RNG yang aman secara kriptografis.
someonewithpc
@someonewithpc Oh sebenarnya, saya menulis pertanyaan itu ketika melihat di ponsel saya, di mana gambar terakhir memiliki pola seperti kotak di atasnya, tapi sekarang, melihat di komputer, itu adalah gambar pertama dengan efek ini.
Doddy
@ Ayah Oh, ya! Coba tekan gambar pada ponsel Anda: efeknya akan beralih! Saya kira ini tentang pengambilan sampel gambar ...
someonewithpc
@Doddy Mungkin hapus pertanyaan pertama Anda, jadi kami tidak berpikir Anda bertanya tentang garis merah bendera padat ...
GreenAsJade
4

R, 58 byte

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

Input terdiri dari tiga vektor numerik yang dipegang r, gdan bmasing - masing.

Kita tidak perlu menormalisasi probabilitas menjadi satu, yang terjadi secara otomatis di rmultinom.

Output dari formulir

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

Di mana ada satu 1di setiap kolom. Ada 1di baris pertama untuk "R" piksel, baris kedua untuk "G" dan baris ketiga untuk "B".

JDL
sumber
4

Pyth - 11 10 byte

Mengambil RGB 2d bitmap dan menghasilkan bitmap dengan warna 3-bit yang diindeks.

mLOs.emkbk

Tingkat bersarang itu melukai kepala saya.

Cobalah online di sini .

Maltysen
sumber
4

J, 20 18 17 byte

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

Gambar dimasukkan sebagai array dengan dimensi h x w x 3 mewakili nilai RGB sebagai bilangan bulat dalam rentang 0 - 255. Outputnya adalah tabel dengan dimensi h x w di mana 1 adalah nilai rgb dari (255, 0, 0 ), 2 adalah (0, 255, 0), dan 3 adalah (0, 0, 255).

Penjelasan

Yang ()"1menyatakan bahwa kata kerja ini harus diterapkan ke setiap array peringkat 1 di input, yang berarti bahwa itu akan berlaku untuk setiap 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

Contoh

mil
sumber
1
Mona Lisa Anda memiliki skema warna yang berbeda dengan yang lain. Apakah Anda yakin itu berfungsi dengan benar?
wizzwizz4
@ wizzwizz4 Terima kasih, ketika menampilkan gambar, saya memiliki piksel rgb dalam urutan terbalik.
mil
4

Jelly , 8 7 byte

Jx‘Xµ€€

Input adalah daftar 3d dengan dimensi h x w x 3. Outputnya adalah daftar 2d dengan dimensi h x w di mana 1 mewakili nilai rgb (255, 0, 0), 2 adalah (0, 255, 0), dan 3 adalah (0, 0, 255).

Input sampel di bawah ini adalah bagian kiri-atas 4 x 4 dari gambar Mona Lisa.

Cobalah online!

Penjelasan

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
mil
sumber
3

Python 3, 119 byte

Di mana minput diambil sebagai array 2-d piksel di mana setiap piksel adalah daftar formulir [r,g,b]. Di setiap posisi piksel, kembali 0,1,2untuk mewakili (250,0,0), (0,250,0), and (0,0,250)masing-masing.

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
sumber
Saya tidak percaya Anda diizinkan untuk mengambil input sebagai variabel (saat menulis program lengkap dalam bahasa yang mendukung IO normal). Saya pikir Anda harus menggunakan inputatau menjadikannya fungsi dan menganggapnya msebagai parameter.
NonlinearFruit