ぱそきいろのIT日記

ぱそきいろがITに関する記事を書いていきます。

遊戯王カードでモザイクアートを作る【OpenCV】

こんにちは、ぱそきいろです。
社会人になったのですが、コロナの影響で在宅研修になりました。
0秒で帰社出来るので、余った時間でプログラミングで遊んでいます。
今回はpython+OpenCVでモザイクアートを作りました。
(遊戯王はシンクロ前までしか分かりません!)
よろしくお願いします!

製作物

出来上がったものは以下です。
闇遊戯をモザイクアートにします。

元画像
f:id:takabsk55:20200422223811p:plain

モザイクアート
f:id:takabsk55:20200422223945j:plain:h240

画像が荒くて申し訳ないのです、、、
拡大すると遊戯王カードでできています。

拡大
f:id:takabsk55:20200422230055j:plain

ちなみに、使ったカードは遊戯デッキに入ってそうなカードを選んでいますw
(遊戯が使いそうなシンクロモンスター分かんなくてスターダストドラゴンを入れてます、、)
(そして、遊戯といえば死者蘇生やった、、、大ミス、、、、)
f:id:takabsk55:20200422230713p:plain:h240

モザイクアート作成の手順

モザイクアートを作るために以下の手順を踏みます。

  1. モザイクアートに使うカードを同じ大きさに揃える
  2. 画像を縦横比 3:2 に分割する(分割した画像をセルと呼びます)
  3. セルのピクセル毎に一番似ているカードの種類を決める
  4. 同じセル内に一番多いカードの種類に置き換える

f:id:takabsk55:20200423205606p:plain:h300

2. の一番似ているカードの種類は以下の方法で判定します。
まず、カードの種類ごとに代表の色のRGBを決定します。
私はMacを使ってるので Digital Color Meterを使ってRGBを調べます。
例えばトラップカードならこんな感じです。
(ここでは、R:131 G:25 B:94)
f:id:takabsk55:20200423215513p:plain:h240
次に対象のピクセルに対して、カードの種類毎に二乗和をとり、最小となるカード種類を調べます。

\sqrt{(R_{pixel}-R_{card})^2+(G_{pixel}-G_{card})^2+(B_{pixel}-B_{card})^2}
これが最小となるカード種類を並べていきます。

gitにコードを載せます。
コードが汚いのは許してください。。。

github.com

作ったもの

次に作ったモザイクアートを載せます。

海馬瀬戸
f:id:takabsk55:20200423225256p:plain:h240

ブルーアイズホワイトドラゴン
(拡大したら分かりますが、ブルーアイズ関連のカードでできてます)
f:id:takabsk55:20200423225011p:plain:h240

ブラックマジシャン
(あまりきれいにできなかった。。。)
f:id:takabsk55:20200423225109p:plain:h240

カードの裏側
(これもあまりきれいにできなかった。。。)
f:id:takabsk55:20200423225108p:plain:h240


まとめ

お分かりかと思いますが、カードをいっぱい使っているので、完成したモザイクアートは容量がすごく大きいです。
(大体5MBくらいあります。。。)
ただ、使うカードを少なくすると、モザイクアートの再現度が下がるし、、、
いい方法があったら教えてください。
ありがとうございました。