- 1. アルゴリズム概要
- 1. WangTilesとは
- 2. Wave Function Collapseとは
- 2. 画像の自動生成例
- 1. WangTiles
- 2. Wave Function Collapse (Overlapping Model)
- 3. WangTilesの処理内容
- 1. タイルパターン画像を用意する
- 2. タイルパターン画像を元に組み合わせて出力する
- 4. Wave Function Collapseの処理内容
- 1. 入力画像からパターンを抽出し、隣接情報を生成する
- 2. 各セルのエントロピーを最大で初期化する
- 3. 処理を繰り返してセルを確定させていく
- 5. (参考) HoudiniのWFCノードについて
- 6. おわりに

マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ~~~

マイケル
今日はとある面白いアルゴリズムを見つけたので実装してみました。
その名も「波動関数崩壊アルゴリズム(Wave Function Collapse)」です!!

エレキベア
か、かっこいい・・・・!!

マイケル
今回実装する内容はGitHubリポジトリに上げています!
細かい処理内容についてはこちらをご参照ください!
GitHub - python-wfc-generater
▲今回実装したリポジトリ

アルゴリズム概要

マイケル
今回紹介する波動関数崩壊アルゴリズムは、量子力学の波動関数の収縮(崩壊)から着想を得て作られたものなんだ。
※考え方が少し似ているだけで、実装内容自体は物理的に関係がありません

エレキベア
実際は関係ないのクマか・・・
しかしかっこよくて言いたくなるクマ

マイケル
名前もかっこいいけど、処理の結果も面白いんだ!
簡単にいうと 入力された画像からパターンを抽出して画像生成する という処理になっていて、例えば下記のわかめ画像を入力にすると大量のわかめが生産されます!

▲わかめっぽい入力画像

▲処理を実行すると大量のわかめが生産された

エレキベア
おお~~~これが自動で生成されるのクマか
最近の画像生成AIみたいクマね

マイケル
この処理がシンプルなアルゴリズムで行えるというのが面白いんだ!
また、Wave Function Collapseに似てシンプルな考え方として WangTiles というものもあります。
理解の助けになると思うので、まずWangTilesについて解説した後にWave Function Collapseの解説を行おうと思います。
WangTilesとは

マイケル
WangTilesの考え方は非常にシンプルで、各タイルの辺に対して隣接情報を定義して繋ぎ合わせるというものになっています。
このつなぎ合わせる部分に関しては特に方法は制限されていません。
- 数種のタイルからなる集合を選び、隣合う辺の色が一致するようにタイルのコピーを並べるという概念
- タイルの各辺に色やラベルがついており、隣り合うタイル同士は同じ色でなければならない
- 同じ色、ラベル同士を繋げることで新たな画像を生成する

エレキベア
繋ぐことが出来るタイルをパズルのように組み合わせるというわけクマね
非常にシンプルクマ

マイケル
WangTilesの実装として使いやすいものが下記論文で紹介されている方法で、
各行、列で同じルールのものが並ぶよう定義されています。
参考:
Tile-Based Texture Mapping on Graphics Hardware

▲各行、列が同じルールのタイルを並べる

マイケル
今回はこちらの方法を使用して実装を試してみます。
Wave Function Collapseとは

マイケル
そして本題の Wave Function Collapse についてですが、こちらも自動で画像生成を行うアルゴリズムで下記リポジトリにC#での実装が公開されています。
公式のGitHubリポジトリ GitHub - WaveFunctionCollapse

マイケル
WangTilesと異なるところは 生成処理のプロセスが明確に定義されている点 で、考え方も異なるものとなっています。
よくある説明としては下記のようなものが見られます。
- タイルマップ画像を入力として、パターンを選択して新たな画像を生成するアルゴリズム
- 全ての存在可能な状態(エントロピー)があるセルから1つに収束(崩壊)させ、伝搬させることで確定させていく

エレキベア
エントロピー・・・?収束・・・?
よく分からないクマ・・・

マイケル
量子力学の波動関数の収縮から着想を得ているから専門用語が使われているけどやっていることは単純で、
エントロピー=「各タイルが存在可能かの状態」を表すもの として、可能性が絞られたものから順にセルを確定していく といったものになっています。
- エントロピー
- 熱力学及び統計力学において定義される状態量
- WFCの場合、「各タイルが存在可能かの状態」を表す尺度となる

マイケル
下記の記事で紹介されているような 数独を解いていく感覚に近い のと、
実際にデモなどを触ってみるとイメージが掴みやすいと思います。
5分で学ぶ RustとWave Function Collapse (波動関数崩壊アルゴリズム)の旅 - Qiita
▲Rustで実装しながら解説いただいている記事、分かりやすい!
Wave Function Collapse - Mixed Initiative Demo by Martin Donald
▲Wave Function Collapseのデモ

▲初めは全てのセルがどのタイルになる可能性持っている

▲一つのセルが確定されると、その近辺のセルにも情報が伝搬して確定されていく

エレキベア
へ~~面白いクマね
セルを決めるとその近くのセルの候補も絞られていくクマね

マイケル
そして公式で用意されている方法として、下記2つのモデルが存在しています。
Simple Tile Modelが事前にタイルパターンを定義する必要があるのに対して、Overlapping Modelはパターン抽出も自動で行います。
- Simple Tile Model
- あらかじめ定義されたセットのタイルを使用して画像を生成する
- タイルは通常、辺や角が他のタイルと一致するよう設計される
- Overlapping Model
- 1枚の画像からタイル画像、重み、ルールを自動生成する
- 画像内の全てのNxNピクセルのパターンを分析する

エレキベア
ということはただ画像入力するだけで画像生成してくれるクマね
なんか最近のAI見たいクマ

マイケル
今回はせっかくなのでOverlapping Modelの方を実装して、パターン自動抽出も試してみました。
簡単に実装の解説も行いますので、お楽しみに!

マイケル
なお、着想元となった量子力学の波動関数の収縮については、ヨビノリさんの動画で丁寧に解説されているのでおすすめです!
気になった方はぜひチェックしてみてください。
- 量子力学の波動関数の収縮(崩壊)から着想されているが、直接的に関係があるわけではない
- 存在可能性がある状態から観測することで確定する、という現象が今回のアルゴリズムの着想となっている(恐らく)
数式なしでもしっかり学ぶ量子力学
▲ヨビノリさんによる解説動画


エレキベア
ヨビノリさんの動画はいつもお世話になってるクマ~~
画像の自動生成例

マイケル
それでは具体的な実装内容に入る前に、それぞれどのような画像生成結果になるのかを軽く見てみます。
WangTiles

マイケル
まずWangTilesについてですが、こちらは分かりやすく事前に定義したパターンを組み合わせて生成されます。
WangTilesにおける画像自動生成例
入力画像 | 画像サイズ | 出力画像 | 画像サイズ |
---|---|---|---|
![]() | 96x96 | ![]() | 240x240 |

エレキベア
ちゃんと道が繋がっているクマね
Wave Function Collapse (Overlapping Model)

マイケル
次にWaveFunctionCollapseによる結果を見てみます。
今回生成したのはOverlapping Modelで、3x3のパターンで自動抽出しています。
WaveFunctionCollapseにおける画像自動生成例
入力画像 | 画像サイズ | 出力画像 | 画像サイズ |
---|---|---|---|
![]() | 96x96 | ![]() | 240x240 |
![]() | 24x24 | ![]() | 15x24 |
![]() | 96x96 | ![]() | 240x240 |

マイケル
処理時間はかかりますが、それらしい画像が生成されていることが確認できました。
1枚目の入力画像はWangTilesの入力画像と同じですが、3x3で自動抽出しているため、2本で引かれた道ではなく1本の線が組み合わされて生成されている のが面白いですね。

エレキベア
結構それっぽくなったクマね
3枚目のわかめ画像もいい感じに繋がっていてすごいクマね
WangTilesの処理内容

マイケル
それでは実際に実装したスクリプトと共に処理内容について軽く触れていきます。
今回実装したWangTilesのスクリプトは下記になります。
GitHub - python-wfc-generater - wang_tiles_random.py
▲今回実装したWangTilesの処理
タイルパターン画像を用意する

マイケル
まずはタイルパターン画像を用意します。
今回は冒頭で紹介した下記論文の4x4パターンで用意しました。

▲4x4のタイルパターン画像を用意する
Tile-Based Texture Mapping on Graphics Hardware
▲今回実装した論文

マイケル
スクリプトでの定義部分は下記になります。
0、1でパターンを定義して、それぞれのタイルに対して付与して読み込んでいます。
▲タイルパターンン画像に合わせて隣接ルールを定義したもの

エレキベア
この辺は単純クマね
タイルパターン画像を元に組み合わせて出力する

マイケル
あとは各タイルのパターンをチェックしながら、接続できるタイルを並べていきます。
▲隣接ルールを元にランダムに画像を生成する

マイケル
生成処理は以上になります。
処理自体の速度も速く、解像度を上げてもいい感じに生成してくれます。

▲タイルパターン画像を組み合わせた状態(240x240)

▲更に大きな画像を生成した例(960x960)

エレキベア
すごいクマ~~~
無限に広がる道が生成できるクマね
Wave Function Collapseの処理内容

マイケル
それではWave Function Collapseの処理内容についても見てみます。
今回実装したのは簡易的なOverlapping Model で、 画像からパターン抽出も行う実装としています。
GitHub - python-wfc-generater - wfc_overlapping_model.py
▲今回実装したWaveFunctionCollapseの処理
- 実装内容
- 3x3のパターンを自動抽出する
- 隣接方向は上下左右のみで、回転の考慮もしていません

マイケル
なお下記のデモの結果がすごく分かりやすいので、こちらの画像を見ながら説明させていただく形にしています。
参考:
Wave Function Collapse - Mixed Initiative Demo by Martin Donald
▲Wave Function Collapseのデモ

エレキベア
どんな実装内容なのか楽しみクマ~~~~
入力画像からパターンを抽出し、隣接情報を生成する

マイケル
まず入力画像からのパターン抽出をどのように行うかというと、
NxNのパターンの組み合わせを全て確認して抽出しています。
今回は3x3で抽出していますが、これが4x4、5x5となるとパターンが膨大な数になり処理時間もその分増えるので注意が必要です。

▲入力した画像のNxNの組み合わせをチェックし、パターンを抽出する
▲パターン抽出処理

エレキベア
おおう・・・結構力技クマね・・・

マイケル
そしてここからどのように隣接情報を定義するかというと、各辺同士の2列が同じなら隣接可能と定義しています。
ここは生成したい画像やタイルのパターンによって調整してもいいかもしれません。
▲隣接情報の定義

エレキベア
ここがWangTilesでいうところの事前に行うタイルパターン定義に該当するクマね
各セルのエントロピーを最大で初期化する

マイケル
そしてここからエントロピー計算の処理に入っていきます。
まずは全てのセルの状態について、どのタイルになる可能性を持っているとして初期化します。

▲全てのセルの状態をどのタイルになる可能性を持っているとして初期化する
▲各セルのエントロピー初期化

マイケル
この時、開始セルのエントロピーだけ1減らしておくことで、最小セルとして扱えるようにします。
処理を繰り返してセルを確定させていく

マイケル
そしてここからは下記のように処理を繰り返すことでセルを確定させていきます。
- 最小エントロピーのセルをランダムに確定する
- 隣接するセルに伝搬して、隣接情報からエントロピーを再計算して絞り込む

▲一つのセルが確定されると、その近辺のセルにも情報が伝搬して確定されていく

エレキベア
存在が絞られたセルから確定して、周りのセルも絞っていくクマね
この部分は確かに数独みたいクマ
▲最小エントロピーのセル確定、隣接セルへの伝搬

マイケル
あとはこの処理を、全てのセルが確定するまで繰り返せば完了です!

▲全てのセルが確定されると画像生成が完了する

マイケル
なるほどクマ~~~
一つ一つ見ていけば結構シンプルクマね
(参考) HoudiniのWFCノードについて

マイケル
アルゴリズムに関しての説明は以上になります!
あとは余談にはなりますが、実はHoudiniにもWFC、WangTilesのノードが存在しています。
これらを活用したチュートリアルとノードのURLを下記に記載しておきます。
-
チュートリアル
-
Houdiniノード

マイケル
チュートリアルを見ると、Wave Function Collapseで処理した結果を WangTilesのノードに接続しているので一瞬なぜだろうとおもいますが、
WangTilesノードはあらかじめ3Dタイルがいくつか用意されており、あくまで処理結果から3D化するために使用しているようでした。

▲Wave Function Collapseで生成した結果

▲WangTilesノードのタイルセット情報

▲色情報(画像だとB値)を見てタイルを配置している

エレキベア
Houdiniに用意されているのは気軽に使用できそうでいいクマね
ダンジョン生成やってみたいクマ~~~
おわりに

マイケル
というわけで今回はWave Function Collapseについての解説でした!
どうだったかな??

エレキベア
名前だけ聞くと難しそうな印象だったクマが、内容を見てみると思ったよりシンプルで使いやすそうだったクマ

マイケル
昨今は画像生成AIも流行っているけど、こういったアルゴリズムは中身を理解して使用することである程度の制御が可能な点がメリットだと思います。
いろいろ遊びつつ、画像生成手法の選択肢の一つとして持っておけるとよさそうですね!

マイケル
それでは今日はこの辺で!
アデューー!!

エレキベア
クマ~~~~
【プロシージャル】Pythonで学ぶ波動関数崩壊アルゴリズム(Wave Function Collapse)~完~