Кікселі - квантові пікселі


35

Вступ

Квіксель - це квантовий піксель. Подібно до класичного пікселя, він представлений 3 цілими значеннями (червоний, зелений, синій). Однак, кікселі знаходяться у суперположенні цих 3 станів замість комбінації. Ця суперположення триває лише до того моменту, коли спостерігається, коли кіксель спостерігається, коли він згортається на один із трьох класичних пікселів; RGB(255,0,0), RGB(0,255,0)і RGB(0,0,255).

Специфікація

  • Представництво
    • Кожен quixel представлений в вигляді масиву цілих чисел 3 від 0 до 255, r, gі bвідповідно.
  • Супер Позиції
    • Кожен quixel знаходиться в положенні супер між червоним, синім і зеленим станами представлені R, Gі Bвідповідно.
  • Спостереження
    • Коли спостерігається кожен кіксель, він руйнується в одному з трьох станів. Імовірність кожного класичного стану є R = (r + 1) / (r + g + b +3), G = (g + 1) / (r + g + b + 3) і B = (b + 1) / (r + g + b + 3). Таким чином, кожне класичне стан завжди як ненульова ймовірність появи.
  • Вхідні дані
    • Функція або програма повинні мати зображення кікселів. Як це зробити гнучко. Ім'я файлу, що використовує багатовимірний масив тощо, є прийнятними.
  • Вихідні дані
    • Функція або програма повинні створювати зображення класичних пікселів. Структура даних для цього виробленого зображення також гнучка. Зверніть увагу , що всі пікселі повинні бути один з цих трьох: RGB(255,0,0), RGB(0,255,0)іRGB(0,0,255)
    • Вихід не повинен бути детермінованим ; це квантові пікселі! Один і той же вхід повинен мати різні результати.
    • Якщо у вашій мові немає можливості генерувати випадкове число, ви можете взяти випадкові байти як вхідні дані
  • Оцінка балів

Зображення

Мона Ліза від Леонардо да Вінчі Мона Ліза

Зоряна ніч на Вінсент Ван Гог введіть тут опис зображення

Постійність пам'яті від Сальвадора Далі введіть тут опис зображення

Тедді Рузвельт В.С. Bigfoot від SharpWriter введіть тут опис зображення


Чи може ім'я / URL-адреса зображення бути вхідним аргументом?
Луїс Мендо

2
Це зображення JPEG Mona Lisa викликає 16x16 видатних візуальних артефактів на вихідних зображеннях.
wizzwizz4

1
@ wizzwizz4 Насправді це не так. Артефакти мають зменшений попередній перегляд. Клацніть зображення, щоб переглянути його в повному розмірі. Я підозрюю, що саме ефект дає саме таку картину.
Adám

2
Ви отримаєте кращі (візуальні) результати, якщо ваш квантовий простір був RGBKде K=255*3-R-G-B, тоді зробіть, щоб ваші квантові пікселі були будь-якими з 4. (Якщо вибрано K, відображіть (0,0,0). Розширіть рівняння RGB у полі Очевидний спосіб - зміни 3s на 4s, додавання K, коли ви додасте R + G + B тощо). Розмивання після цього має відновити досить пристойну галасливу копію оригіналу. (K означає чорний або ключ, якщо ви
задумалися

2
@TLW Якщо у вашій мові немає можливості генерувати випадкове число, ви можете взяти випадкові байти як вхідні дані
NonlinearFruit

Відповіді:


13

Діялог APL , 23 21 19 байт

Бере таблицю з (R, G, B) трійки.

Натхненний алгоритмом миль

Повертає таблицю індексів у {(255, 0, 0), (0, 255, 0), (0, 0, 255)}. Жахливо марнотратний.

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

(
?∘≢випадковий індекс
вибирається
з
кожного з

(
цілі
⍳3перші три індекси, що
)/¨⍨повторюються кожним із

1+⊢ збільшені трійки

СпробуйтеAPL!


Стара версія

Повертає таблицю індексів на основі 0 в {(255, 0, 0), (0, 255, 0), (0, 0, 255)}

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

{... }¨ для кожного квакселя в таблиці знайдіть:

+/ сума (тобто кількість істин)

(?0)≥ випадкове 0 <число <1 більше або дорівнює

+\ сукупна сума

(1+⍵)÷ збільшені значення RGB, поділені на

3+ три плюс

+/⍵ сума кікселя

Примітка: Dyalog APL дозволяє вам вибрати між лінійним генератором лінійного конгруенції , Mersenne Twister і RNG N ² операційної системи .

Наприклад, зображення:

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

може дати

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

Зверніть увагу, як три "чисті" кікселі згорнулися до відповідних кольорів.

СпробуйтеAPL онлайн!

Звалилася Мона Ліза


8

Математика, 53 байти

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

Анонімна функція. Бере Mathematica Imageяк вхідний і повертає Imageяк вихідний. Зауважте, що вхідне зображення повинно мати кольоровий простір RGB.


Як це працює?
GreenAsJade

2
@GreenAsJade <...>~ImageApply~#застосовує функцію по всім пікселям в зображенні, і RandomChoice[255#+1->IdentityMatrix@3]використовує деяку зважену RNG для отримання ряду одиничної матриці 3 × 3 (тобто {1, 0, 0}, {0, 1, 0}чи {0, 0, 1}) , яка відповідає червоний, зелений або синій.
LegionMammal978

5

C #, 366 243 байт

Величезне спасибі @TheLethalCoder за гольф!

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

Основна ідея:

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

Приклади:

Мона Ліза

введіть тут опис зображення

Зоряна ніч

введіть тут опис зображення

Наполегливість пам’яті

введіть тут опис зображення

Тедді Рузвельт В.С. Велика нога

введіть тут опис зображення

Ось оновлений альбом imgur з ще декількома прикладами, щоб показати, що це недетерміновано.


6
Колір. Вапно - це чисто зелений колір. Для подальшого ознайомлення ось відома таблиця кольорів .
молоко

1
Ось версія для гольфу на 237 байт: 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;};І ще вдосконалення можна зробити
TheLethalCoder

Його фактично 237 байтів, додаткові байти - це невидимі символи, які додаються в коментарі до коду, я вважаю
TheLethalCoder

4

Python 2, 172 166 162 байт

Другий та третій рівні відступу - це необмежена та необроблена вкладка плюс пробіл відповідно; це грає дуже погано з Markdown, тому вкладки були замінені двома пробілами.

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

Використовує аналогічний формат вводу / виводу для відповіді APL Адама . Вхід - це 2D масив RGB-кортежів; вихід - двовимірний масив з 0, 1або 2, що представляє червоний, зелений і синій відповідно. Наприклад:

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

Нижче моя відповідь на Python 3, використовуючи PIL.

Python 3 + PIL, 271 250 245 243 байт

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

Ітератується над кожним пікселем і застосовує до нього функцію quixel. Приймає ім'я файлу як вхідне і зберігає його вихід у o.png.

Ось деякі результати:

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

Мона Ліза, кікселізована

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

Зоряна ніч, квіксизована

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

Наполегливість Пам’яті, кікселізована

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

Тедді Рузвельт проти Бігфута, кітелізований


@Doddy Мабуть тому, що це PRNG, а не криптографічно захищений RNG.
whowithpc

@someonewithpc О, власне, я писав це питання під час перегляду на своєму телефоні, де останнє зображення має на ньому звичайний сітчастий візерунок, але зараз, переглядаючи на комп’ютері, це перше зображення з таким ефектом.
Додді

@Doddy О, так! Спробуйте натиснути на зображення на телефоні: ефекти будуть перемикатися! Я здогадуюсь про вибірку зображень ...
whowithpc

@Doddy Можливо, видаліть перше запитання, тому ми не думаємо, що ви запитуєте про червоні смуги густого прапора ...
GreenAsJade

4

R, 58 байт

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

Вхід складається з трьох числових векторів, що знаходяться в r, gі bвідповідно.

Нам не потрібно нормалізувати ймовірності підсумовувати одиницю, що відбувається автоматично в rmultinom.

Вихід має форму

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

Там, де 1в кожному стовпчику є одинарний . У 1першому рядку для пікселів "R", у другому рядку для "G" та третьому рядку для "B".



4

J, 20 18 17 байт

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

Зображення вводиться у вигляді масиву з розмірами h x w x 3, що представляє значення RGB як цілі числа в діапазоні 0 - 255. Вихід - це таблиця з розмірами h x w, де 1 - значення rgb (255, 0, 0 ), 2 є (0, 255, 0), а 3 - (0, 0, 255).

Пояснення

()"1Представляє , що це дієслово повинен бути застосований до кожного масиву рангу 1 на вході, а це означає , що він буде застосовуватися до кожного пікселя .

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

Приклад


1
Ваша Mona Lisa має іншу кольорову гаму для інших. Ви впевнені, що це працює правильно?
wizzwizz4

@ wizzwizz4 Спасибі, під час відображення зображення у мене були пікселі rgb у зворотному порядку.
милі

4

Желе , 8 7 байт

Jx‘Xµ€€

Вхід - це 3d-список із розмірами h x w x 3. Вихід - це 2d-список із розмірами h x w, де 1 являє собою значення rgb (255, 0, 0), 2 - (0, 255, 0), і 3 є (0, 0, 255).

Зразок введення нижче - це лівий верхній край 4 x 4 зображення Mona Lisa.

Спробуйте в Інтернеті!

Пояснення

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 байт

Де mвхід береться як двовимірний масив пікселів, де кожен піксель - це список форми [r,g,b]. У кожній позиції пікселя повертається 0,1,2до представлення (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]

Я не вірю, що вам дозволяється приймати дані як змінну (коли ви пишете повну програму мовою, яка підтримує звичайний IO). Я думаю, ви повинні використовувати inputабо зробити це функцією і взяти mза параметр.
нелінійний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.