Quixels - Квантовые Пиксели

35

Введение

Quixel - это квантовый пиксель. Подобно классическому пикселю, он представлен 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соответственно.
  • наблюдение
    • Когда каждый quixel наблюдается, он разрушается в одно из трех состояний. Вероятность каждого классического состояния есть R = (r + 1) / (r + g + b +3), G = (g + 1) / (r + g + b + 3) а B = (b + 1) / (r + g + b + 3). Таким образом, каждое классическое состояние всегда как ненулевая вероятность появления.
  • вход
    • Функция или программа должны сделать снимок с изображением Quixels. Как это сделать, это гибко. Имя файла, использование многомерного массива и т. Д. Все приемлемо.
  • Выход
    • Функция или программа должны создавать изображение классических пикселей. Структура данных для этого полученного изображения также является гибкой. Обратите внимание , что все пиксели должны быть один из этих трех: RGB(255,0,0), RGB(0,255,0)иRGB(0,0,255)
    • Вывод не должен быть детерминированным ; это квантовые пиксели! Один и тот же вход должен приводить к различным выходам.
    • Если ваш язык не может генерировать случайное число, вы можете взять случайные байты в качестве входных данных
  • счет
    • Это поэтому выигрывает меньшее количество байтов.

Картинки

Мона Лиза от Леонардо да Винчи Мона Лиза

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

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

Тедди Рузвельт VS. Снежный человек от SharpWriter введите описание изображения здесь

NonlinearFruit
источник
Может ли имя файла / URL-адрес быть входным аргументом?
Луис Мендо
2
Это изображение JPEG Моны Лизы вызывает видимые визуальные артефакты 16x16 на выходных изображениях.
wizzwizz4
1
@ wizzwizz4 На самом деле это не так. Это предварительный просмотр с артефактами. Нажмите на изображение, чтобы просмотреть его в натуральную величину. Я подозреваю, что это конкретная ширина только того изображения, которое дает эффект.
Адам
2
Вы получите лучшие (визуальные) результаты, если ваше квантовое пространство было RGBK, где K=255*3-R-G-B, а затем сделайте ваши квантовые пиксели любым из 4. (Если выбрано K, отобразите (0,0,0). Расширьте ваши уравнения RGB в очевидный путь, изменение 3 с на 4 с, добавление K, когда вы добавите R + G + B и т. д.). Размытие после этого должно восстановить довольно приличную шумную копию оригинала. (K означает черный или ключ, если вам интересно)
Yakk
2
@TLW Если у вашего языка нет возможности генерировать случайное число, вы можете взять в качестве входных данных случайные байты
NonlinearFruit

Ответы:

13

Дьялог АПЛ , 23 21 19 байт

Принимает таблицу (R, G, B) триплетов.

Вдохновленный алгоритмом миль

Возвращает таблицу индексов в {(255, 0, 0), (0, 255, 0), (0, 0, 255)}. Ужасно расточительно.

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

(
?∘≢случайный индекс
выбирает
из
каждого из

(
все
⍳3первые три индекса
)/¨⍨повторяются каждым из

1+⊢ увеличенные триплеты

TryAPL!


Старая версия

Возвращает таблицу индексов на основе 0 в {(255, 0, 0), (0, 255, 0), (0, 0, 255)}

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

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

+/ сумма (то есть количество истин)

(?0)≥ случайное число 0 <число <1 больше или равно

+\ совокупная сумма

(1+⍵)÷ увеличенные значения RGB, деленные на

3+ три плюс

+/⍵ сумма квикселя

Примечание: Dyalog APL позволяет выбрать между Лехмер линейного конгруэнтного генератора , то Вихрь Мерсенна и RNG операционной системы ¹ ² .

Например, изображение:

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

Mathematica, 53 байта

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

Анонимная функция. Принимает Mathematica в Imageкачестве входных данных и возвращает в Imageкачестве выходных данных. Обратите внимание, что входное изображение должно иметь цветовое пространство RGB.

LegionMammal978
источник
Как это работает?
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;
}

Примеры:

Мона Лиза

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

Звездная ночь

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

Постоянство памяти

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

Тедди Рузвельт VS. Большая ступня

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

Вот обновленный imgur альбом с несколькими другими примерами, чтобы показать, что это недетерминировано.

ThreeFx
источник
6
Color.Lime - чистый зеленый цвет. Для дальнейшего использования, вот известная таблица цветов .
молоко
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 . Вход представляет собой двумерный массив кортежей RGB; выход представляет собой 2D массив 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

Мона Лиза, quixelized

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

Звездная ночь, Quixelized

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

Стойкость памяти, quixelized

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

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

медь
источник
@Doddy Вероятно, потому что это PRNG, а не криптографически безопасный RNG.
Someonewithpc
@someonewithpc Да, на самом деле, я написал этот вопрос при просмотре на моем телефоне, где на последнем изображении есть регулярный узор в виде сетки, но теперь при просмотре на компьютере это первое изображение с таким эффектом.
Додди
@ Додди О, да! Попробуйте нажать на изображение на вашем телефоне: эффекты будут переключаться! Я предполагаю, что речь идет о выборке изображений ...
someonewithpc
@Doddy Может быть, удалите свой первый вопрос, поэтому мы не думаем, что вы спрашиваете о плотных
флажках
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».

JDL
источник
4

Pyth - 11 10 байт

Принимает RGB 2d битовую карту и выводит битовую карту с индексированным 3-битным цветом.

mLOs.emkbk

Этот уровень вложенности вредит моей голове.

Попробуйте это онлайн здесь .

Maltysen
источник
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
У вашей Моны Лизы цветовая гамма другая. Вы уверены, что это работает правильно?
wizzwizz4
@ wizzwizz4 Спасибо, при отображении изображения у меня были пиксели rgb в обратном порядке.
миль
4

Желе , 8 7 байт

Jx‘Xµ€€

Входные данные - это трехмерный список с размерами h x w x 3. Выходные данные - это двумерный список с размерами h x w, где 1 представляет значение rgb (255, 0, 0), 2 - (0, 255, 0) и 3 является (0, 0, 255).

Пример ввода ниже - это верхняя левая область 4 x 4 изображения Моны Лизы.

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

объяснение

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]
gowrath
источник
Я не верю, что вам разрешено принимать входные данные в качестве переменной (при написании полной программы на языке, который поддерживает нормальный ввод-вывод). Я думаю, что вы должны использовать inputили сделать это функцией и принять mв качестве параметра.
Нелинейный