Quixels - Lượng tử pixel


35

Giới thiệu

Một quixel là một pixel lượng tử. Tương tự như một pixel cổ điển, nó được biểu thị bằng 3 giá trị nguyên (Đỏ, Xanh lục, Xanh lam). Tuy nhiên, quixels nằm ở vị trí siêu của 3 trạng thái này thay vì kết hợp. Vị trí siêu này chỉ tồn tại cho đến khi quixel được quan sát tại điểm mà nó sụp xuống một trong ba pixel cổ điển; RGB(255,0,0), RGB(0,255,0)RGB(0,0,255).

Đặc điểm kỹ thuật

  • Đại diện
    • Mỗi quixel được biểu diễn dưới dạng một mảng của 3 số nguyên từ 0 đến 255, r, gbtương ứng.
  • Siêu vị trí
    • Mỗi quixel là ở một vị trí siêu giữa Red, Blue và các quốc gia xanh đại diện bởi R, GBtương ứng.
  • Quan sát
    • Khi mỗi quixel được quan sát, nó sụp đổ vào một trong ba trạng thái. Xác suất của mỗi trạng thái cổ điển là R = (r + 1) / (r + g + b +3), G = (g + 1) / (r + g + b + 3)B = (b + 1) / (r + g + b + 3). Bằng cách này, mỗi trạng thái cổ điển luôn luôn có xác suất hiển thị khác không.
  • Đầu vào
    • Các chức năng hoặc chương trình nên có một hình ảnh của quixels. Làm thế nào nó làm điều này là linh hoạt. Một tên tệp, sử dụng một mảng nhiều chiều, vv đều được chấp nhận.
  • Đầu ra
    • Các chức năng hoặc chương trình sẽ tạo ra một hình ảnh của các pixel cổ điển. Cấu trúc dữ liệu cho hình ảnh được sản xuất này cũng linh hoạt. Lưu ý rằng tất cả các pixel nên là một trong những ba: RGB(255,0,0), RGB(0,255,0)RGB(0,0,255)
    • Đầu ra không nên mang tính quyết định ; đây là những pixel lượng tử ! Đầu vào giống nhau sẽ dẫn đến đầu ra khác nhau.
    • Nếu ngôn ngữ của bạn không có cách tạo số ngẫu nhiên, bạn có thể lấy byte ngẫu nhiên làm đầu vào
  • Chấm điểm
    • Đây là để ít byte nhất giành chiến thắng.

Hình ảnh

Mona Lisa của Leonardo da Vinci nàng mô na Li Sa

Đêm đầy sao của Vincent van Gogh nhập mô tả hình ảnh ở đây

Sự kiên trì của ký ức bởi Salvador Dali nhập mô tả hình ảnh ở đây

Teddy Roosevelt VS. Bigfoot của SharpWriter nhập mô tả hình ảnh ở đây


Tên tệp / URL hình ảnh có thể là một đối số đầu vào không?
Luis Mendo

2
Hình ảnh JPEG đó của Mona Lisa đang gây ra các hiện vật hình ảnh nổi bật 16x16 trên các hình ảnh đầu ra.
wizzwizz4

1
@ wizzwizz4 Thật ra không phải vậy. Đó là bản xem trước thu nhỏ có đồ tạo tác. Nhấp vào hình ảnh để xem kích thước đầy đủ. Tôi nghi ngờ đó là chiều rộng cụ thể của chỉ hình ảnh đó mang lại hiệu ứng.
Adám

2
Bạn sẽ nhận được kết quả (trực quan) tốt hơn nếu không gian lượng tử của bạn RGBKở đó K=255*3-R-G-B, trong đó, sau đó làm cho pixel lượng tử của bạn là một trong số 4. (Nếu K được chọn, hiển thị (0,0,0). Mở rộng phương trình RGB của bạn trong cách rõ ràng, thay đổi 3 giây thành 4 giây, thêm K khi bạn sẽ thêm R + G + B, v.v.). Một vệt mờ sau khi làm điều này sẽ xây dựng lại một bản sao khá ồn ào của bản gốc. (K là viết tắt của màu đen hoặc chìa khóa, trong trường hợp bạn tự hỏi)
Yakk

2
@TLW Nếu ngôn ngữ của bạn không có cách tạo số ngẫu nhiên, bạn có thể lấy các byte ngẫu nhiên làm đầu vào
Phi tuyến

Câu trả lời:


13

APL Dyalog , 23 21 19 byte

Lấy bảng của bộ ba (R, G, B).

Lấy cảm hứng từ thuật toán dặm

Trả về bảng chỉ số vào {(255, 0, 0), (0, 255, 0), (0, 0, 255)}. Lãng phí khủng khiếp.

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

(
?∘≢chỉ số ngẫu nhiên
chọn
từ
mỗi

(
toàn bộ
⍳3ba chỉ số đầu tiên được
)/¨⍨nhân rộng bởi mỗi

1+⊢ các bộ ba tăng

Hãy thử!


Phiên bản cũ

Trả về bảng của các chỉ số dựa trên 0 vào {(255, 0, 0), (0, 255, 0), (0, 0, 255)}

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

{... }cho mỗi quixel trong bảng, tìm:

+/ tổng của (tức là số sự thật)

(?0)≥ số 0 ngẫu nhiên <số <1 lớn hơn hoặc bằng

+\ tổng tích lũy của

(1+⍵)÷ các giá trị RGB tăng chia cho

3+ ba cộng

+/⍵ tổng của quixel

Lưu ý: Dyalog APL cho phép bạn chọn giữa máy phát đồng quy tuyến tính của Lehmer , Mersenne Twister và RNG ¹ ² của Hệ điều hành .

Ví dụ: hình ảnh:

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

có thể cho

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

Lưu ý cách ba quixel "tinh khiết" sụp đổ với màu sắc tương ứng của chúng.

Dùng thử trực tuyến!

Sụp đổ Mona Lisa


8

Toán học, 53 byte

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

Chức năng ẩn danh. Lấy một Mathicala Imagelàm đầu vào và trả về một Imageđầu ra. Lưu ý rằng hình ảnh đầu vào phải có không gian màu RGB.


Làm thế nào nó hoạt động?
GreenAsJade

2
@GreenAsJade <...>~ImageApply~#áp dụng một chức năng trên tất cả các pixel trong hình ảnh, và RandomChoice[255#+1->IdentityMatrix@3]sử dụng một số RNG trọng để sản xuất một hàng của ma trận sắc 3 × 3 (ví dụ {1, 0, 0}, {0, 1, 0}hoặc {0, 0, 1}) mà tương ứng với màu đỏ, xanh lá cây, hoặc màu xanh.
LegionMammal978

5

C #, 366 243 byte

Rất cảm ơn @TheLethalCoder đã chơi golf này!

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

Ý kiến ​​cơ bản:

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

Ví dụ:

nàng mô na Li Sa

nhập mô tả hình ảnh ở đây

Đêm đầy sao

nhập mô tả hình ảnh ở đây

Sự bền bỉ của trí nhớ

nhập mô tả hình ảnh ở đây

Teddy Roosevelt VS. Chân to

nhập mô tả hình ảnh ở đây

Đây là một album imgur được cập nhật với một vài ví dụ nữa, để cho thấy rằng điều này là không đặc biệt.


6
Color.Lime là màu xanh lá cây thuần khiết. Để tham khảo trong tương lai, đây là bảng màu đã biết .
sữa

1
Đây là phiên bản dành cho golf có giá trị là 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;};Và vẫn còn những cải tiến có thể được thực hiện
TheLethalCoder

Tôi thực sự có tới 237 byte, các byte bổ sung là các ký tự vô hình được thêm vào trong nhận xét mã mà tôi tin
TheLethalCoder

4

Python 2, 172 166 162 byte

Các mức thụt lề thứ hai và thứ ba lần lượt là một tab thô và một tab thô cộng với một khoảng trắng; Điều này thực sự rất tệ với Markdown, vì vậy các tab đã được thay thế bằng hai khoảng trắng.

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

Sử dụng định dạng đầu vào / đầu ra tương tự như câu trả lời APL của Adám . Đầu vào là một mảng 2D của các bộ dữ liệu RGB; đầu ra là một mảng 2D của 0, 1hay 2, đại diện cho màu đỏ, xanh lá cây, và màu xanh tương ứng. Ví dụ:

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

Dưới đây là câu trả lời Python 3 cũ hơn của tôi bằng 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')

Lặp lại trên mỗi pixel và áp dụng chức năng quixel cho nó. Lấy tên tệp làm đầu vào và lưu đầu ra của nó vào o.png.

Đây là một số kết quả:

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

Mona Lisa, quixelized

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

Đêm đầy sao, quixelized

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

Sự bền bỉ của bộ nhớ, quixelized

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

Teddy Roosevelt vs Bigfoot, quixelized


@Doddy Có lẽ vì đó là PRNG chứ không phải RNG an toàn về mặt mật mã.
someonewithpc

@someonewithpc Thật ra, tôi đã viết câu hỏi đó khi xem trên điện thoại của mình, nơi hình ảnh cuối cùng có hoa văn giống như lưới thông thường trên đó, nhưng bây giờ, xem trên máy tính, đó là hình ảnh đầu tiên có hiệu ứng này.
Doddy

@Doddy ơi! Hãy thử nhấn vào hình ảnh trên điện thoại của bạn: các hiệu ứng sẽ thay đổi! Tôi đoán đó là về lấy mẫu hình ảnh ...
someonewithpc

@Doddy Có thể xóa câu hỏi đầu tiên của bạn, vì vậy chúng tôi không nghĩ rằng bạn đang hỏi về các sọc đỏ cờ dày đặc ...
GreenAsJade

4

R, 58 byte

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

Đầu vào bao gồm ba vectơ số tổ chức tại r, gbtương ứng.

Chúng ta không cần bình thường hóa xác suất để tổng hợp thành một, điều đó sẽ tự động xảy ra rmultinom.

Đầu ra có dạng

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

Trường hợp có một duy nhất 1trong mỗi cột. Hàng 1nằm ở hàng đầu tiên cho pixel "R", hàng thứ hai cho "G" và hàng thứ ba cho "B".



4

J, 20 18 17 byte

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

Hình ảnh được nhập dưới dạng một mảng có kích thước h x w x 3 đại diện cho các giá trị RGB là số nguyên trong phạm vi 0 - 255. Đầu ra là một bảng có kích thước h x w trong đó 1 là giá trị rgb của (255, 0, 0 ), 2 là (0, 255, 0) và 3 là (0, 0, 255).

Giải trình

Đại ()"1diện cho rằng động từ này sẽ được áp dụng cho từng mảng của hạng 1 trong đầu vào, nghĩa là nó sẽ áp dụng cho từng 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

Thí dụ


1
Mona Lisa của bạn có cách phối màu khác với những màu khác. Bạn có chắc là nó hoạt động đúng không?
wizzwizz4

@ wizzwizz4 Cảm ơn, khi hiển thị hình ảnh, tôi có các pixel rgb theo thứ tự ngược lại.
dặm

4

Thạch , 8 7 byte

Jx‘Xµ€€

Đầu vào là danh sách 3d có kích thước h x w x 3. Đầu ra là danh sách 2d với kích thước h x w trong đó 1 đại diện cho giá trị rgb (255, 0, 0), 2 là (0, 255, 0) và 3 là (0, 0, 255).

Đầu vào mẫu bên dưới là vùng 4 x 4 trên cùng bên trái của hình ảnh Mona Lisa.

Hãy thử trực tuyến!

Giải trình

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 byte

Trường hợp mđầu vào được lấy dưới dạng một mảng pixel 2 chiều trong đó mỗi pixel là một danh sách của biểu mẫu [r,g,b]. Tại vị trí của mỗi pixel, trả về 0,1,2đại diện (250,0,0), (0,250,0), and (0,0,250)tương ứng.

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]

Tôi không tin rằng bạn được phép lấy đầu vào dưới dạng một biến (khi viết một chương trình đầy đủ bằng ngôn ngữ hỗ trợ IO bình thường). Tôi nghĩ rằng bạn phải sử dụng inputhoặc biến nó thành một hàm và lấy mlàm tham số.
Phi tuyến
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.