キクセル-量子ピクセル


35

前書き

キキセルは量子ピクセルです。従来のピクセルと同様に、3つの整数値(赤、緑、青)で表されます。ただし、キクセルは、組み合わせではなく、これら3つの状態の上位にあります。このスーパーポジションは、キクセルが観測されるまで持続します。この時点で、3つの古典的なピクセルのいずれかに崩壊します。RGB(255,0,0)RGB(0,255,0)およびRGB(0,0,255)

仕様

  • 表現
    • 各QUIXELは、0と255の間の3つの整数の配列として表されrgそしてbそれぞれ。
  • スーパーポジション
    • 各キクセルは、それぞれRGおよびで表される赤、青、緑の状態の間の上位にありBます。
  • 観察
    • 各キクセルが観察されると、3つの状態のいずれかに崩壊します。各古典的状態の確率は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)
    • 出力は確定的であってはなりません。これらは量子ピクセルです!同じ入力でも異なる出力になるはずです。
    • 言語に乱数を生成する方法がない場合は、ランダムなバイトを入力として使用できます
  • 得点

画像

モナリザによるレオナルド・ダ・ヴィンチ モナリザ

星月夜によってヴィンセント・ヴァン・ゴッホ ここに画像の説明を入力してください

サルバドール・ダリによる記憶の永続性 ここに画像の説明を入力してください

テディルーズベルトVS。ビッグフットによるSharpWriter ここに画像の説明を入力してください


画像のファイル名/ URLを入力引数にできますか?
ルイスメンドー

2
モナリザのJPEG画像は、出力画像に16x16の顕著な視覚的アーチファクトを引き起こしています。
wizzwizz4

1
@ wizzwizz4実際にはそうではありません。アーティファクトが含まれるのは、ダウンサイズのプレビューです。画像をクリックしてフルサイズで表示します。効果を与えるのはその画像のみの特定の幅だと思います。
アダム

2
量子空間がの場合、より良い(視覚的な)結果が得られます。RGBKここでK=255*3-R-G-B、量子ピクセルは4のいずれかになります(Kが選択されている場合、(0,0,0)を表示します。明らかな方法、3秒から4秒への変更、R + G + Bを追加する場合はKの追加など)。これを行った後のぼかしは、元のかなりノイズの多いコピーを再構築する必要があります。(Kはあなたが疑問に思った場合に備えて、黒またはキーを表します)
Yakk

2
@TLW言語に乱数を生成する方法がない場合は、ランダムバイトを入力として使用できます。
NonlinearFruit

回答:


13

Dyalog APL23 21 19 バイト

(R、G、B)トリプレットの表を取ります。

マイルのアルゴリズムに触発

{(255、0、0)、(0、255、0)、(0、0、255)}へのインデックスのテーブルを返します。恐ろしくもったいない。

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

(
?∘≢ランダムインデックス
選択

それぞれからします

(
全体
⍳3
)/¨⍨それぞれによって複製された最初の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
└─┴─┴─┴─┴─┘

3つの「純粋な」キクセルがどのようにそれぞれの色に崩壊したかに注目してください。

TryAPLオンライン!

崩壊したモナリザ


8

Mathematica、53バイト

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

匿名関数。Mathematica Imageを入力として受け取り、Image出力として返します。入力画像にはRGB色空間が必要であることに注意してください。


どのように機能しますか?
GreenAsJade

2
@GreenAsJadeは、<...>~ImageApply~#画像内の全画素にわたって関数を適用し、そしてRandomChoice[255#+1->IdentityMatrix@3]3×3の単位行列(すなわち、列生成するためにいくつかの重み付けされたRNGを使用して{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アルバム。


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

パイソン2、172の 166 162バイト

2番目と3番目のインデントレベルは、それぞれrawタブとrawタブにスペースを加えたものです。これはMarkdownで非常に悪い結果をもたらすため、タブは2つのスペースに置き換えられました。

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のAPL answerと同様の入力/出力形式を使用します。入力は、RGBタプルの2D配列です。出力は、、、またはの2D配列で0、それぞれ赤、緑、青を表します。例えば:12

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

以下は、PILを使用した古いPython 3の回答です。

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

すべてのピクセルを反復処理し、それにキクセル関数を適用します。ファイル名を入力として受け取り、その出力をに保存します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

テディルーズベルトvsビッグフット、キクセル化


@Doddyおそらく、それはPRNGであり、暗号的に安全なRNGではないからです。
someonewithpc

@someonewithpcああ、実は、携帯電話で見るときにその質問を書きました。最後の画像には規則的なグリッドのようなパターンがありますが、今ではコンピューターで見ると、この効果を持つ最初の画像です。
ドディ

@Doddyああ、そう!携帯電話の画像を押してみてください:効果が切り替わります!画像サンプリングについてだと思います
...-someonewithpc

@Doddyおそらく最初の質問を削除するので、密集した旗の赤のストライプについて質問しているとは思わない
...-GreenAsJade

4

R、58バイト

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

入力はrgおよびにbそれぞれ保持される3つの数値ベクトルで構成されます。

確率を正規化して合計する必要はありません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つある場合。1「R」「G」の画素、第2行「B」の第三の行の最初の行です。



4

J、20 18 17バイト

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

イメージは、0〜255の範囲の整数としてRGB値を表す次元h x w x 3の配列として入力されます。出力は、次元h x wのテーブルです。ここで、1は(255、0、0のrgb値です。 )、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の3dリストです。出力は次元h x wの 2dリストです。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入力は、各画素がフォームのリストである画素の2次元配列とします[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として使用または作成し、パラメータとして使用する必要があると思います。
NonlinearFruit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.