Mathematica、286273バイト
Image[Array[1,{l=Length@#,l}]~ReplacePart~Thread[#&@@@Split[#&@@@FoldList[Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@#,0},_,#]&,{{1,1},I},Characters@Nest[StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"},"L",Log2@l]]]->Join@@MapAt[Reverse,#,2;;;;2]]]&@*ImageData
ふう!挑戦的だが楽しい!
説明
ImageData
ImageをRGB値の配列に変換します。
Array[1,{l=Length@#,l}]
head を使用してlby l配列を生成します1。ここで、lは入力の長さ(つまり、画像の幅)です。
この利回り{{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}(l混乱を減らすために大文字で書かれました)
StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"}
StringReplaceすべてのを置き換える機能"L"と"+RF-LFL-FR+"と"R"と"-LF+RFR+FL-"
Nest[ ... ,"L",Log2@l]
StringReplace関数をString "L"、Log2[l]時間に適用します。
Characters
結果StringをListの文字に変換します。
Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@#,0},_,#]&
次の名前のない関数:
- 2番目の入力がの場合、
"-"最初の入力の2番目の要素にを掛けますI。
- 2番目の入力がの場合、
"+"最初の入力の2番目の要素をで除算しIます。
- 2番目の入力がの場合、
"F"最初の入力を2番目の入力のReIm(入力の実部と虚部を分離する)だけ増やします。
FoldList [...、{{1,1}、I}、...]
から始めて{{1,1},I}、List文字の各要素を2番目の入力として使用して、上記の名前のない関数を累積的に適用します。このコードは、すべての反復の出力を生成します。
#&@@@Split[#&@@@ ... ]
それぞれの2番目の要素を取り除き、List重複を削除します。(この時点までのステップListは、ヒルベルト曲線の座標を生成します)
Join@@MapAt[Reverse,#,2;;;;2]
入力RGB配列を解きます(1行おきに反転し、平坦化します)。
Thread[ ... -> ... ]
Rule最初の入力の最初の要素(ヒルベルト曲線の座標)が2番目の入力の最初の要素(展開された画像)、2番目の要素が2番目の入力などとペアになるようにオブジェクトを作成します。
... ~ReplacePart~ ...
これらの代替適用RuleにSをArray第二のステップから。
Image
RGB値の配列に変換しますImage。
サンプルイン/アウト
入力:

出力:

入力:

出力:

逆関数(266 253バイト)
Image[MapAt[Reverse,Extract[#,#&@@@Split[#&@@@FoldList[Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@b,0},_,#]&,{{1,1},I},Characters@Nest[StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"},"L",Log2[l=Length@#]]]]]~Partition~l,2;;;;2]]&@*ImageData