見出し画像

pythonでモザイクアートを作る

はじめに

@yutakikuchi_です。
多数の画像をタイル化して、1枚のモザイクアートを生成するpythonコードを書いてみました。元画像を1枚指定して、その画像の1pixel毎に似た色合いを持つ画像を探索して、タイル形式に埋め込んでいく形で実装しています。使用しているプログラミング言語はpythonでversionは3.7を想定しています。下のgithub repositoryにサンプルコードを載せておきました。

モザイクアートの生成例

metamaskのロゴを元画像、メトロポリタン美術館のデータをタイル化して組み合わせて、1枚のmetamaskのモザイクアートを出力します。

画像1

画像2

下の画像を一部を拡大すると、小さいタイル式の画像が色を引き出しているのが分かります。

画像3

どうやっているか

仕組みはそこまで複雑ではありません。下記のパートによって成り立っています。

1. 埋め込みたいタイル式画像を取得する。上記githubではメトロポリタン美術館のデータをAPIを経由して利用(LicenseはCC0)
2. 元画像を読み込み、画像の1pixel毎の色合い(1次元)、rgbごとの輝度値(3次元)を組み合わせて、4つの次元データとして取得
3. 取得したタイル式画像1枚ずつの全体の平均色合い(1次元)、rgbごとの輝度値の平均(3次元)を組わせて、4次元データとして取得。(N枚のタイル画像からそれぞれ4次元データを取得)
4. scipyのscipy.spatial.cKDTreeを用いて、「2」の(x,y)座標の1pixelに最も近似するタイル画像を1枚を探索し、生成したいモザイクアートの(x,y)座標の画像として利用

今回の実装として、下記2つのURLを参考にしています。2つのURLともに取り組みは非常にgreatでしたが、実行してみるとエラーが出るなど些細な部分で試しづらかったので、改良を加えてみました。

- https://zenn.dev/eetann/books/2020-09-25-make-mosaic-art-python
https://gist.github.com/BilHim/77f17e2fa859a56c1d365c6e558b291f#file-mosaic-py

またその他のURLに掲載されているスクリプトも実施してみましたが、1枚の画像を生成するために10分以上かかるなどパフォーマンス面で難がありましたが、こちらで紹介するスクリプトについてはタイル画像1000枚から500x500のモザイク画像生成であれば4秒ほどで完了します。

今後NFTなど、アーティスト以外がアートを公開する機会が増えてきそうなので、サンプルコードを公開しました。

この記事が気に入ったらサポートをしてみませんか?