これをキュビィ!グレースケールのレッスン…えー…色…えー…何でも


27

ルービックキューブとクールなアートの大ファンである私は、この2つを組み合わせていくつかの本当にクールなことをすることに取り組んでいます。基本的にミニチュアルービックキューブを解いて、ルービックキューブアートを構成する基本的なピクセルを形成します。このようなアートの例は、次のリンクから見ることができます:http : //google.com/search?q=rubik%27s+cube+ art

現在、このCode Golfの目的は、画像を入力として受け入れ、次の方法で変換するコードを作成することです。

画像は、最初はWebセーフグレースケールカラーに縮小されます。この理由は、Webセーフグレースケールパレット(つまり、000000、333333、666666、999999、CCCCCC、およびFFFFFF)を分離する必要があるためです。グレースケールに変換する比色法のアルゴリズムは、http//en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscaleで入手できます。これをインスピレーションとして使用する必要があります。

次に、グレースケールを適切な色にレンダリングします。すばやく分解するには、000000はルービックの青、333333はルービックの赤、666666はルービックの緑、999999はルービックのオレンジ、CCCCCCはルービックの黄色、FFFFFFはルービックの白を指します。

結果のコードは、写真のパレットからルービックの色に直接レンダリングできると思います。Webセーフグレースケールへの変換から、対応するルービックパレットへの変換までの2段階の方法は、プロセスの背後にあるロジックについてのアイデアを提供するためのものです。

ルービックパレットの実際のRGB値は、以下に対応する必要があります。

  • 赤:#C41E3A
  • 緑:#009E60
  • 青:#0051BA
  • オレンジ:#FF5800
  • 黄色:#FFD500
  • 白:#FFFFFF

例として、次の画像からAbraham Lincolnの頭を切り取りここに画像の説明を入力してください、アルゴリズムをレンダリングして以下を生成しました。

ここに画像の説明を入力してください

グリッドが存在するため、画像を構成するために個々のミニチュアルービックキューブをどのように構成する必要があるかを確認できます。結果の画像の実際のサイズは45ピクセルx 45ピクセルです。つまり、(45/3)*(45/3)= 15 * 15 = 225のミニチュアルービックキューブを使用してこの画像を作成します。私が持っているようなグリッドで結果の画像を表示することを期待していません。

これが必要なものです:

  1. このアルゴリズムで処理される画像は、幅xピクセル、高さyピクセルである必要があります。たとえば、xとyは3の倍数です。これは、ルービックキューブモザイクの一部としてのレンダリングを容易にするためです。画像が非常に大きい場合は、処理前に45 x 45〜75 x 75前後のサイズに縮小することをお勧めします。このサイズ変更コンポーネントはオプションです。

  2. 画像をモザイクを作成するには、六色のルービックキューブパレットに変換する必要があります。

  3. 結果の画像は、処理後に有効なグラフィックファイルである必要があります。コードが機能することを証明するには、アメリカ合衆国の大統領の1人、または有名なハリウッドの有名人のイメージに対して実行します。私の例ではすでにエイブラハム・リンカーンを使用しているため、この大統領は使用できなくなりました。使用した言語、バイトカウント、およびコードのテストに使用したプレジデント/セレブリティ(ショットの前後を含む)を必ず指定してください

  4. 各エントリには、テストケースとして一意の社長/有名人が必要です。重複は受け付けません。これにより、異なるコードエントリのテストに重複した結果が使用されないことが保証されます。コードが機能していると言うのは非常に良いことですが、それを証明することは別のことです。

5.最短のコードが優先されます。

これを人気コンテストに変更します...バイトカウントを競わなくても誰がこれを行えるか見てみたいです。だから、2014年2月28日以降、賞金とともにこれを授与します。


4
リンクに頼るのではなく、ルービックRGB値を投稿に追加する方が良いと思います。
SztupY 14

「画像幅×ピクセルYピクセル高くなければならない処理される」というサイズ変更コードの一部であるか、またはそのイメージが必要なサイズに予め処理されることですか?
user2846289 14

1つの面のみを制約する場合、ルービックキューブの不可能な状態はありますか?
ニックT 14

1
@WallyWestあなたは私のアプリMineCamを愛しています、これを行いますが、正方形を作るのではなく、鉱山クラフトブロックを使用し、リアルタイムのiPhoneカメラで毎秒15回それを行い、あなたの周りの世界全体を鉱山クラフトの宇宙。itunes.apple.com/us/app/minecam/id675845303?mt=8世界の母の種を生成することができた場合のみ)
アルバートレンショー14

2
@WallyWest:それは怠zyではありません。問題は、インターネットの残りの部分がダウンしている場合でも、開始するために必要なすべての情報を提供する必要があります。1〜2年で、そのリンクは削除され、誰もリンクを更新しません。あなたは(問題を解決する必要はありません)Webセーフグレースケールの色を作成する方法についての十分な情報を提供する場合、あなただけの簡単のように、小さなマッピングテーブルを追加した可能性#000000 => #0051BAなど、
SztupY

回答:


16

Imagemagick(108)

バージョン:ImageMagick 6.8.7-7 Q16 x86_64 2013-11-27

次の呼び出し:

$ convert -resize 75x75 -fx "q=p.intensity;q<1/6?#0051BA:q<2/6?#C41E3A:q<3/6?#009e60:q<4/6?#ff5800:q<5/6?#FFD500:#FFF" input output

ここで、inputそしてoutput入力と出力ファイル名のために変更されなければなりません。

私は唯一の間で文字をカウント-resizeし、#FFF"あなたは、このコメントに無料で無効な感じだと思うならば、。

私はレナをイメージとして使用しました(彼女はプレイボーイに出演しました、そしてそれをしている人は誰でもハリウッドの有名人として数えるべきですよね?)

入力:

入力画像

出力:

$ convert -resize 75x75 -fx "q=p.intensity;q<1/6?#0051BA:q<2/6?#C41E3A:q<3/6?#009e60:q<4/6?#ff5800:q<5/6?#FFD500:#FFF" Lenna.png LennaRubik.png

生成された画像

出力を拡大:

拡大画像

注:imagemagickのドキュメントによると、ステートメントに複数の条件演算子を含めることはできませんが、呼び出しはまだ正常に機能しているようです。したがって、おそらく修正され、ドキュメントは更新されませんでした。

結果画像で識別を実行します(実際に色が細かいことを示すため):

$ identify -verbose LennaRubik.png
  (...)   
  Colors: 6
  Histogram:
       338: (  0, 81,186) #0051BA srgb(0,81,186)
      1652: (  0,158, 96) #009E60 srgb(0,158,96)
      1187: (196, 30, 58) #C41E3A srgb(196,30,58)
      1674: (255, 88,  0) #FF5800 srgb(255,88,0)
       706: (255,213,  0) #FFD500 srgb(255,213,0)
        68: (255,255,255) #FFFFFF white
  (...)

レナが適切な有名人として数えられないと思うなら、ここにブルース・ウィリスがいます:

ブルースオリジナル

ブルース・スモール

ブルース・ラージ


+1私はあなたの答えはほとんど無敵だと思います(またはまったく無敵です)。間違いなくハリウッドの有名人やアメリカの大統領の写真を撮ってこれに追加することをお勧めします(レナを削除する必要はありません、両方を保持してください)。さもなければ、退屈な人が文句を言ったり、それを理由に投票するかもしれません。
ビクターStafusa 14

@Victor:Mathematica、Matlab、またはOctaveはこれを簡単に打ち負かすことができると思います。fx部品内の条件は、表現力の高い言語でさらに圧縮できるためです。また、これらの言語はネイティブイメージをサポートしています(したがって、imagemagick / gd / etcをインポートする必要があるため、文字は失われません)
SztupY 14

レナの@SztupY Iのよく知っている...私は...あまりにもブルース・ウィリスとのこと...ニースの仕事を数えましょう
WallyWest

1
レナはかわいい(r)。アップ。
blabla999 14

仕事に適切なツールを使用するための+1。私の理解では、imagemagickを使用する正しい方法は、オプションではなく出力ファイルよりも最初に画像を呼び出すことです。
CousinCocaine

14

Mathematica

グレタ・ガルボをフィーチャーした米国切手の正方形の領域で作業します。と呼ばれjます。

j

f[i_,rs_,m_:True]:=
Module[{(*rs=rastersize-4*)r={0.77,0.12,0.23},gr={0,0.62,0.38},b={0,0.32,0.73},o={1,0.35,0},y={1,0.84,0},w={1,1,1},
c1={r,gr,b,o,y,w},grayGreta,garboColors},
grayGreta=(*Reverse@*)ImageData[ColorQuantize[Rasterize[i,(*ImageResolution \[Rule]15*)RasterSize->rs+1,ImageSize->rs],6]];
garboColors=Union@Flatten[grayGreta,1];
ArrayPlot[grayGreta/.Thread[garboColors-> RGBColor@@@c1],
Mesh->If[m==True,{rs-1,rs-1},None],MeshStyle->Black]]

関数fは3つのパラメーターを取ります。

  • i 画像を参照します
  • rs、ラスターサイズ
  • m、メッシュラインを使用する必要があるかどうかを示すブール変数。(デフォルト設定はTrueです)。

15、30、45、75のラスターサイズを使用:

GraphicsGrid[{{f[j, 15], f[j, 30]}, {f[j, 45], f[j, 75]}}, ImageSize -> 800]

4ガルボ

こんなにたくさんのピースでルーブリックのキューブを作っている人は誰もいません!それにもかかわらず、興味深い運動。


色をいじる

これは以前のエントリからです。コードは少し異なります。 Graphicsの代わりに使用されますArrayPlot。また、正方形ではありませんが、完全なスタンプを使用します。

6!= 720のRubrikキューブカラーの順列があります。

以下は、上の行の中央の画像を表示します(下の6つの画像を設定)。グレースケール値を最も暗いものから最も明るいものに並べると、色は{r、gr、b、o、y、w}になります。それにもかかわらず、他のバリエーションも機能します。

i はグレースケールの元の画像です。

Graphics[Raster[(g=Reverse@ImageData[ColorQuantize[Rasterize[i,RasterSize->75],6]])
/.Thread[Union@Flatten[g,1]-> {{7,1,2},{0,6,4},{0,3,7},{10,4,0},{10,8,0},{10,10,10}}/10]]]

i は、Greta Garboの完全なスタンプの元のグレースケール画像です。

Rasterize[garbo,RasterSize->75 画像を75 x 75配列にラスタライズします。

ColorQuantize[<>, 6] グレースケール値を6のセットに減らします。

ImageData画像からデータ配列を取得します。逆さまになります。

Reverse データ配列、ひいては画像を反転させます。

garboColors 量子化画像の6つのグレースケール値です。

Graphics[Raster 最終画像を表示します。

rubrikColors 6つのRubrikキューブカラーのRGB値です。

赤、緑、青、オレンジ、黄、白のさまざまな色の組み合わせが与えられています。

r={0.77,0.12,0.23};gr={0,0.62,0.38};b={0,0.32,0.73};o={1,0.35,0};y={1,0.84,0};w={1,1,1};
c1={r,gr,b,o,y,w};
c2={r,b,gr,o,y,w};
c3={b,r,gr,o,y,w};
c4={gr,b,r,o,y,w};
c5={b,r,gr,y,o,w};

そしてコード:

grayGreta=Reverse@ImageData[ColorQuantize[Rasterize[i,RasterSize->75],6]];
garboColors=Union@Flatten[grayGreta,1];
Grid[{{i,
Graphics[Raster[grayGreta/.Thread[garboColors-> c1]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c2]]]},
{Graphics[Raster[grayGreta/.Thread[garboColors-> c3]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c4]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c5]]]}}]

ガルボ


ガルボス・ガロア

以下は、6つのRubrikキューブカラーを使用したGreta Garboの(720個の)72個の画像です。一部の画像は他の画像よりもうまく機能しますよね?

GraphicsGrid@Partition[(Graphics[Raster[grayGreta /. Thread[garboColors -> #]]] & 
/@ Take[Permutations[{r, gr, b, o, y, w}, {6}], 72]), 12]

ガルボスガロア


グレタ、ああグレタ...これは思ったよりも良くなった。@DavidCarraher、ここではいい仕事...
WallyWest

@WallyWest。ありがとう。非常に興味深い挑戦でした。
DavidC 14

Mathematicaがimagemagickに勝ると確信していましたが、これをさらにゴルフすることはできませんか?これらの機能はすべて必要ですか?
SztupY

1
@SztupYコードの半分は、色を正しくすることに専念しています。Reverse画像を逆さまにして残してしまう可能性はありますが、他の機会は見当たりません。Mathematicaは表現力豊かですが、大きな言葉を使用します。画像に熟達した人はおそらくコードサイズを少し減らすことができますが、彼らはあなたのimagemagickコードを打ち負かすことができるとは思いません。
DavidC 14

1
実際、コード全体にいくつかの矛盾がありました。それらが消えてくれることを願っています。i元の画像を保持します。grルーブリックのグリーンを表します。 gグレースケール画像のラスタライズおよび量子化された画像データを指します。
DavidC 14

6

Smalltalk(Smalltalk / X)、289 139 *

入力:i; 出力:r

r:=i magnifiedTo:75@75.
r colorMapProcessing:[:c||b|b:=c brightness.Color rgbValue:(#(16r0051BA 16rC41E3A 16r009e60 16rff5800 16rFFD500 16rFFFFFF)at:(b*6)ceiling)]

入力:

ここに画像の説明を入力してください

出力:

ここに画像の説明を入力してください

拡大:

ここに画像の説明を入力してください

(すべての若者向け:これはマドンナではありません;-)

[*]倍率を75x75(最初の行)までカウントしていません-既にサイズ変更されたものを入力として使用できます。大丈夫だと思います。


I崇拝マリリン・モンロー...かなりの選択...リサイズしたオプション機能...
WallyWest

4

Postscript、およびTRUE Rubikカラー!;-)

さて、このソリューションは、やや高度に特殊化された球体に制限されているため、ここでは少しトピックから外れています。しかし、たとえば「奇妙な数字の質問」(実際に機能するものを作成できないこと)に多くのフラストレーションを感じた後、私は何かを公​​開することを決めたので、これを半完成の落書きの山から引き出してそれを提示可能にしました。

ソリューションは、この質問の第1リビジョンがサイトへのリンクによって必要な色を定義するという事実を利用します。これは、Pantone(R)色が使用され、RGB色は近似のみであることを明確に述べています。そして、私は本物の色ができるのに、なぜ私は近似をするのだろうと思いましたか?-:)

10 dict begin
/Size 75 def
/Names  [(PMS 012C) (PMS 021C) (PMS 347C)   (PMS 200C)    (PMS 293C)   ] def
/Colors [[0 .16 1 0][0 .65 1 0][1 0 .39 .38][0 .9 .72 .28][1 .56 0 .27]] def
<</PageSize [Size dup]>> setpagedevice
Size dup scale
true setoverprint
(%stdin) (r) file 100 string readline pop 
(r) file <</CloseSource true>>/DCTDecode filter
0 1000000 string 
dup <</CloseTarget true>>/NullEncode filter 
{
    3 index 3 string readstring
    {
        4 -1 roll 1 add 4 1 roll
        {} forall
        0.11 mul exch 0.59 mul add exch 0.3 mul add cvi
        1 index exch write
    } {pop exit} ifelse
} loop
closefile
0 3 -1 roll getinterval
exch closefile
/data exch def
/n data length sqrt cvi def
1 1 Names length {
    /N exch def
    { 
        dup N Names length 1 add div gt 
            {N 1 add Names length 1 add div gt 
                {1} {0} ifelse} 
            {pop 1} 
        ifelse
    } settransfer
    [/Separation Names N 1 sub get /DeviceCMYK {
        Colors N 1 sub get 
        { 1 index mul exch } forall pop
    }] setcolorspace
    <<
        /ImageType        1
        /Width            n
        /Height           n
        /ImageMatrix      [n 0 0 n neg 0 n]
        /BitsPerComponent 8
        /Decode           [0 1]
        /DataSource       data
    >> image
} for
showpage
end

このコードは、例として保存しrubik.ps、通常の呪文でGhostscriptに入力します:

gs -q -sDEVICE=psdcmyk -o out.psd rubik.ps

次に、次の行で、JPGファイル名の入力を待機します。

kelly.jpg

そして、すべてがうまくいけば、出力をout.psdファイルに保存します。

入力は正方形のRGB JPEG(任意のサイズ)である必要があり、出力はスポットカラーチャンネルのPSDです。ファイルを表示するにはPhotoshopが必要です。GSデバイスをpsdcmyk他のデバイスに変更しても、使用可能なものは何も生成されません。入力としてのJPEG-ポストスクリプトインタープリターはそこからデータストリームを直接デコードできるため。正方形-プログラムはsqrt文字列の長さに依存して画像の幅(および高さ)を検出するため。

最初の行は、出力イメージのサイズ(デフォルトの75から変更可能)とカラーパレット(色とその数も変更可能)を定義します。他のものはハードコーディングされていないと思います。

どうしたの?RGBトリプレットのストリームは、オンザフライでグレースケール値の文字列に変換され(単純な式を使用)、通常の8ビットコントーンイメージディクショナリが構築され、5つのSeparationカラースペースで5つの同一のイメージを重ねて描画するために使用されます。トリックは、image演算子の各呼び出しの前に伝達関数を適用することです。たとえば、黄色のペイントの場合、この関数は0.167 .. 0.333の範囲の入力値に対してのみ0を返し、そうでない場合は1を返します。

入力:

ここに画像の説明を入力してください

Photoshopで開いた出力75x75のスクリーンショット、800%拡大:

ここに画像の説明を入力してください

Photoshopチャンネルパレット:

ここに画像の説明を入力してください


1
Grace Kellyを使用するための+1 ...あなたは私の完全な尊敬を持っています...
WallyWest

3

C#

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        unchecked
        {
            var t = new[] { 0xFFC41E3A, 0xFF009E60, 0xFF0051BA, 0xFFFF5800, 0xFFFFD500, 0xFFFFFFFF }.Select(v => Color.FromArgb((int)v)).ToArray();
            var o = new Bitmap(Bitmap.FromFile(args[1]));
            var m = double.Parse(args[0]);
            var r = Math.Min(m / o.Width, m / o.Height);
            var w = (int)(o.Width * r);
            var h = (int)(o.Height * r);

            o = new Bitmap(o, w - (w % 3), h - (h % 3));
            for (int y = 0; y < o.Height; y++)
                for (int x = 0; x < o.Width; x++)
                    o.SetPixel(x, y, N(o.GetPixel(x, y), t));
            o.Save(args[2], ImageFormat.Png);
        }
    }

    static Color N(Color c, Color[] t)
    {
        return t.OrderBy(v => Math.Abs(W(v) - W(c))).First();
    }

    static double W(Color c)
    {
        return .11 * c.B + .59 * c.G + .30 * c.R;
    }
}

次の3つのパラメーターで実行する必要があります。

foo.exe 75 d:\test.jpg d:\out.png

75最大はどこですか width / height d:\test.jpgは入力ファイルでd:\out.pngあり、出力ファイルです。

このコンテストのさまざまな画像の出力:

ウォーリーウエスト SztupY 1 SztupY 2 blabla999

私自身の有名人:

ガース!

出力:

ガース75 ガース225

ただし、他の(75x75より大きい)サイズでは、より良い画像が得られます。

150 300

そして、大統領に固執するなら:

ダバヤ294 ダバヤ75 ダバヤ225

これは(より長い?)codegolfではないので、コードを「最小化」することをあまり気にしませんでした。また、指示では、画像が幅と高さ(正方形)と同じでなければならないという具体的な言及がなかったので、トリミングを気にしませんでした。私ない、しかし、必ず画像は3つの画素幅/高の倍数であることを確認してください。正方形の画像が必要な場合は、:P最後に正方形の入力を使用します。アルゴリズムは最適にはほど遠い。

あともう少し(人々は熱いひよこ/インターネットヒーローをもっと支持するので:P

カリバイロン300 カリバイロン75 カリバイロン225 ホフ300 ホフ75 ホフ225


3

ブレインファック

++++[->+[,.----------]<]>>>>---->->++++++++++>>------------>+++>+++>--
--->++++++[->+++++<]---->+[-<+++++++<+++<+++++<+++<+++<++++++<++++++<+
<++>>>>>>>>>]<[<]<<,+[,<++++++>[>++++++[->+++++++<]>+[<<[->]>[<]>-]<<<
->]+<[-[-[-[-[[-].>>>>>>>>.<.<<<<<<-<]>[->>>>>[.<]<<]<]>[-.>>>[>]<<<.<
.[<]<<]<]>[--.+>>>[>]<<.[<].<<]<]>[--.+>>>[>]<.[<].<<]<]>[--...+],,+]

これには、EOFとして-1を持ち、赤いピクセルの1つが255である場合、8ビットセルよりも高いBFインタープリター/コンパイラーが必要です。 。jitbfを使用すると、マシンの整数サイズが何であっても、EOFとして強制的に-1にすることができます。

jitbf --eof -1 rubiks.bf < angelina.pnm > angelina-rubix.pnm

レンダリングされる画像ファイル形式は、Gimpのオプションとして生の完全なRGB PNMファイル(P6)です。

緑のチャネルのみを使用します(これは、カラー画像をグレースケールに変換する多くの方法の1つです)。値を0未満に減らすことなく値を43減らして、使用するルービックカラーを見つけ、対応する正しいRBGカラーを出力するスイッチを使用します。

Hackers(1995)のAngelina Jolieの画像を75x75に縮小し、アプリケーションで処理しました:

アンジェリーナ・ジョリー75x75 /フェアユース ルービックキューブカラーのアンジェリーナジョリー75x75 /フェアユース 同じスケーリング6倍

同じ、元のサイズを使用しだけです:

同じものが最初に縮小されない/フェアユースのみ

そして、私は精神的なので、ここにも大統領がいます:

ウィキペディアのアーノルド・シュワルツェネッガーCC


オフトピックが、今日はXKCDもハッカーへの参照(1995)がある
Sylwester

1
これも同様です:xkcd.com/1247
Shade

1

Objective-C

私は昨夜この挑戦を見ました、そして-[NSArray indexOfObject:inSortedRange:options:usingComparator:]、それで遅延がこれまでにないほど少し混乱した時間を過ごしました。

- (UIImage  *)rubiksImage:(UIImage *)inputImg
{
    //Thank you http://stackoverflow.com/a/11687434/1153630 for the greyscale code
    CGRect imageRect = CGRectMake(0, 0, inputImg.size.width, inputImg.size.height);

    int width = imageRect.size.width;
    int height = imageRect.size.height;

    uint32_t *pixels = (uint32_t*)malloc(width * height * sizeof(uint32_t));

    memset(pixels, 0, width * height * sizeof(uint32_t));

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);

    CGContextDrawImage(context, imageRect, [inputImg CGImage]);

    const int RED = 1;
    const int GREEN = 2;
    const int BLUE = 3;

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            uint8_t* rgbaPixel = (uint8_t*)&pixels[y * width + x];
            uint32_t grayPixel = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];

            NSArray *r = [self rubixColorFromGrey:grayPixel];

            rgbaPixel[RED] = [r[2] integerValue];
            rgbaPixel[GREEN] = [r[1] integerValue];
            rgbaPixel[BLUE] = [r[0] integerValue];
        }
    }

    CGImageRef newCGImage = CGBitmapContextCreateImage(context);

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    free(pixels);

    UIImage* newUIImage = [UIImage imageWithCGImage:newCGImage];

    CGImageRelease(newCGImage);

    return newUIImage;
}

- (NSArray *)rubixColorFromGrey:(uint32_t)p
{
    NSArray *colors = @[@0, @51, @102, @153, @204, @255];

    NSUInteger index = [colors indexOfObject:@(p)
                               inSortedRange:NSMakeRange(0, colors.count)
                                     options:NSBinarySearchingInsertionIndex | NSBinarySearchingFirstEqual
                             usingComparator:^(id a, id b) {
                                return [a compare:b];
                             }];
    switch (index) {
        case 0:
            return rgb(0, 81, 186);
            break;
        case 1:
            return rgb(196, 30, 58);
            break;
        case 2:
            return rgb(0, 156, 96);
            break;
        case 3:
            return rgb(255, 82, 0);
            break;
        case 4:
            return rgb(255, 213, 0);
            break;
        case 5:
            return rgb(255, 255, 255);
            break;

        default:
            break;
    }

    return colors; //go wild
}

NSArray *rgb(int r, int g, int b)
{
    return @[@(r), @(g), @(b)];
}

iPadで次のように実行しました。

UIImageView *img = [[UIImageView alloc] initWithImage:[self rubiksImage:[UIImage imageNamed:@"danny.png"]]];
[img setCenter:self.view.center];
[self.view addSubview:img];

ビフォー ダニーデビトビフォー アフター ダニーデビトアフター

ビフォー グレース・ケリービフォー アフター グレース・ケリー・アフター


1

Python

形式:python rubik.py <input> <max_cubes> <output>

推奨アルゴリズムを使用してピクセルをグレースケールに変換します。

import Image, sys

def rubik(x, max_cubes = 25):

    img = x
    max_cubes *= 3

    if x.size[0] > max_cubes or x.size[1] > max_cubes:

        print "Resizing image...",

        if x.size[0] > x.size[1]:
            img = x.resize((max_cubes, int(max_cubes * float(x.size[1]) / x.size[0])), Image.ANTIALIAS)
        else:
            img = x.resize((int((max_cubes * float(x.size[0]) / x.size[1])), max_cubes), Image.ANTIALIAS)

    if x.size[0] % 3 or x.size[1] % 3:
        print "Sizes aren't multiples of 3"
        return

    print "Image resized to %i x %i pixels" % img.size

    out = Image.new('RGB', img.size)

    print "Converting image...",

    for x in xrange(out.size[0]):
        for y in xrange(out.size[1]):
            r, g, b = img.getpixel((x, y))
            if r == g == b == 255:
                out.putpixel((x,y), (255, 255, 255))
            else:
                l = 0.2126 * r + 0.7152 * g + 0.0722 * b
                l /= 255
                out.putpixel((x,y), (
                        (0x00, 0x51, 0xBA),
                        (0xC4, 0x1E, 0x3A),
                        (0x00, 0x9E, 0x60),
                        (0xFF, 0x58, 0x00),
                        (0xFF, 0xD5, 0x00)
                    )[int(5 * (l <= 0.0031308 and 12.92 * l  or 1.055 * l ** (1/2.4) - 0.055))])

    print "Image converted successfully."

    print "Stats:"
    h, v = img.size[0] / 3, img.size[1] / 3
    print "   ", h, "horiz. Rubik cubes"
    print "   ", v, "vert. Rubik cubes"
    print "   ", h * v, "total Rubik cubes"

    return out.resize((out.size[0], out.size[1]))

if __name__ == "__main__":
    rubik(Image.open(sys.argv[1]).convert("RGB"), int(sys.argv[2])).save(sys.argv[3])

入力:

サンドロ・ペルティーニ
(ソース:ilmamilio.it

出力max_cubes = 25

サンドロ・ペルティーニ、ルービック1

出力max_cubes = 75

サンドロ・ペルティーニ、ルービック2

出力max_cubes = 225

サンドロ・ペルティーニ、ルービック3


白い色が欠けていませんか?そして、最も暗い色は青でなければなりませんが、私が今見ているように、それは他のいくつかの画像でも問題です。
user2846289 14年

@VAdimiRおっと!それらを間違った順序でマッピングしました。白が表示されないのは、FP精度(1.055-0.055 = 0.9999999999999999)によるものです。とにかく#FFFFFFの元の値でしか表示されないため、白をハードコードする必要があると思います。
オベロン14年

白について、私の意見では、0..1(明度)の範囲は6つの部分に分割され、0.83..1.00はすべて白にマッピングされます。そうでなければ、立方体の6色の画像を作成しても意味がありません。 、しかしそれは私がそれを読む方法です。
user2846289 14年

@Oberon Pertiniを使用した興味深い選択...彼はほぼ94歳まで生きていました...そしてPythonを使用した素晴らしい仕事であり、私が出会った最も簡単な言語の1つではないことを認めなければなりません。
WallyWest 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.