ぴょこりんブログ

裏垢です。

複数の円のオブジェクトだけで画像の近似を得る。

この記事は異世界行ったら本気だすぴょこりんクラスタ Advent Calendar 2021のためにかきました。

はじめに

タイトルの通り「複数の円オブジェクトだけで画像の近似をつくる」です。

皆様は「遺伝的アルゴリズムで最高にエッチな画像を産み出そう!」ってヤツ覚えてますでしょうか。今日のネタはinspired by アレです。

元の問題設定から、まずモデルの複雑性を下げて問題設定を簡単にしています。元の問題では矩形と楕円が扱えましたが、本記事では円のみを取り扱います。加えて、透明度も元の問題設定では扱っていましたが、ここではこれも扱いません。

更にもっと根本的な話として、みんなの想像する「最高にエッチな画像」ではなく具体の画像を対象としているので、まぁその点だいぶ収束も安定することでしょう。

モデルとアルゴリズム

f:id:cappsLk:20211208001741p:plain

k個の円があると仮定して話を進めます。これを特定の画像の近似になるように円のパラメータを調整する、という問題になります。

円はパラメータとして、中心の座標(x,y), 半径rad、そして色 (r,g,b)が決まれば一意に定まります。なのでこれら6つのパラメータを持つ円がk個あるので、6×kのパラメータのもとで最適化をする問題になります。

目的関数としては、リファレンスの画像に似せたいので、リファレンス画像との二乗誤差を目的関数としましょう。

そして、探索方法としては、それぞれのパラメータに対して、ほかのパラメータを固定し、「現在のパラメータから-n~nずらした場合の目的関数の値を算出し、それが最小になるパラメータを採用、更新する」というのを愚直に順番に6×k個の各パラメータごとに更新していく、ということをします。

更新のたびに少なくとも目的関数は現状と同じか、小さくなることが保証されるので、局所解に落ちるはずです。

簡単なデータで実験

試しに以下の画像に近づける、という感じでこのアルゴリズムを動かしてみます。

f:id:cappsLk:20211207222905p:plain

k=80、n=5でいきます。

初期値:

初期値は以下の画像です。果たして前の画像に近づくのでしょうか。 f:id:cappsLk:20211207222949p:plain

反復回数=5

f:id:cappsLk:20211207223355p:plain

反復回数=10

密だった画像に白が目立ってきた気がしますね。 f:id:cappsLk:20211207223145p:plain

反復回数=15

f:id:cappsLk:20211207223524p:plain

反復回数=20

さらに疎になってきました。もうリファレンスの画像にかなり近いですね。 f:id:cappsLk:20211207223245p:plain

反復回数=24

f:id:cappsLk:20211207223607p:plain

もとのリファレンス画像と見比べてみると、なかなかそっくりなところまで来たんじゃないでしょうか。簡単なアルゴリズムでもこれ位はいけるんですね。

これは実画像への適用も期待できそうです。

実画像に対しての適用

240×240の画像にk=500, n=20で試してみました。加えて初期値の半径を小さめにとるという感じにしてみました。あえて何をリファレンスにしたかは言いませんが、皆さん見たことがある画像のはずです。

初期値

f:id:cappsLk:20211208001027p:plain

反復回数=1 既にリファレンス画像わかりますね。

f:id:cappsLk:20211208001106p:plain

反復回数=5 約束された勝利。

f:id:cappsLk:20211208001620p:plain

反復回数=10 ほぼサチったって感じですかね。

f:id:cappsLk:20211208002434p:plain

一応反復時の目的関数の推移も取ってあります。 数値的にもいい具合にサチった感じですね。

f:id:cappsLk:20211208002544p:plain

一応貼っておくとリファレンス画像はこれ。

f:id:cappsLk:20211208002633p:plain

おわりに

思いのほかうまく行っちゃって楽しかった。収束したときの画像よりも1反復の時点での画像が魅力的なのが気になる(?)。gifアニメにしたり、途中で止めたり、目的関数に別の制約を入れたりしても楽しそう。

[おまけ] 円の数によるバリエーション

ご参考まで。高度に抽象化された僕のアイコンたち。

k=2

f:id:cappsLk:20211208010036p:plain

k=10

f:id:cappsLk:20211208003222p:plain

k=30

f:id:cappsLk:20211208010557p:plain

k=80

f:id:cappsLk:20211208003105p:plain

k=200

f:id:cappsLk:20211208004503p:plain

k=1000

f:id:cappsLk:20211208082328p:plain