月で絵を描く最近、月の絵文字で絵を描くツイートがバズっていました。これらの絵文字の濃淡を利用することで何かのロゴとか、オルガさんの「止まるんじゃねぇぞ...」とかを描くというわけです。***これは自動化できる。***そう思った私は早速emacsとterminalを立ち上げ、コーディングを開始しました。思っていたより完成は早く、朝の10時にコーディングを開始しお昼12時半には完成していたと思います。それでは手法とその結果を見ていきましょう。1.画像を読み込む※pythonのバージョンは3.6.4です。Image.open(img_file)```たったこれだけ。img.convert('L')```たったこれだけ。height))```さて、少し煩雑なコードになってしまいました。正確に説明することが難しいので、やりたいことがわかってくれればそれでいいです。やりたいことは比をできるだけ保ちながら、縦と横のピクセル数を**4の倍数にしたい**ということ。理由は、この後定義する月行列にあります。当然のことながら、月を何らかの数字に置き換えないとコンピュータは演算することができません。そこで私は次のような月行列を定義しました。行列*A*を4x4の正方行列とし、![texclip20180614162253.png](https://qiita-image-store.s3.amazonaws.com/0/221435/e66751e9-fc0d-e6e9-38b8-c954808d3eed.png)![texclip20180614162223.png](https://qiita-image-store.s3.amazonaws.com/0/221435/22690221-23e9-a070-a34d-7f8bb085247c.png)明るければ1、暗ければ-1とする。🌒に対応する月行列は、![texclip20180614162914.png](https://qiita-image-store.s3.amazonaws.com/0/221435/e29b3123-3493-c87e-4c84-e8223e3e0506.png)🌗に対応する月行列は、![texclip20180614163002.png](https://qiita-image-store.s3.amazonaws.com/0/221435/16e0a08e-d658-d681-d90e-dd6d580bd498.png)みたいな感じ。これを事前に8種類分用意しておく。1]])```これら月行列を用いて画像から月描画を行います。画質を4の倍数に落とした方が後々得するのです。(説明適当ですみません)そして、月行列のindexを上から0~7としました。index→絵文字とする関数も作っておきます。use_aliases=True)```pythonでは絵文字を扱う時にはemojiというライブラリを使用するのが手っ取り早いかと思います。pipなどお手元のパッケージインストーラーでインストールしましょう。1.```これに関してもやりたいことだけ理解してください。やりたいことは画像のピクセルに格納されている数値を0~255から-1~1に変換したいということです。脳みそ使わずに実験的に書いたので、細かいことは放っておいて下さい。ここまでで月描画における準備が完了しました。これらのコードを用いて月描画を行います。上までのコードを全て、`utils.py`というファイルに関数郡としてまとめておきます。col):"""画像の前処理。グレスケール、画質下げ、その他前処理。img```この関数群を`main.py`から呼び出す形式をとります。5.画像の一部と月行列でアダマール積を取る**ここが今回の月描画の肝です。**アダマール積とは、下のような要素ごとの掛け算のことです。preprocess(IMAGE_URL)```先ほど定義したutils.pyの中の関数を用いて`tsuki_matrix`(8つの行列)と`img`(1つの行列)を用意します。ここで重要なことは、どの行列も**-1~1の範囲で、明るければ1に近く、暗ければ-1に近い**という性質を持つ行列であるということです。アダマール積と取り、その合計を取ると、互いの類似度をうまく測ることができます。`tsuki_matrix`は4x4の行列なので、画像内の4x4の部分のみと類似度を測り、最も類似している月を採用します。それを画像内全ての位置で繰り返せばいいのです。hadamard.sum()tsuki_list.append(index2tsuki(max_index))```これで、画像内の4x4ピクセル部分の月が決定します。あとはこれを画像内全体で繰り返せばいいだけです。tsuki_list:sys.stdout.write(i)```これで全てのコーティングは終了です。あとは、ソースコード内の`画像名`の部分をお好みの画像名に変えてあげることで、python君がせっせこせっせこ月描画を始めてくれます。皆さんも是非試してみてください。src="https://qiita-image-store.s3.amazonaws.com/0/221435/bb6c774b-5095-a505-6d9c-bfa44f004847.png">なかなかの描画性能じゃないでしょうか。ちなみに僕のツイートは十数リツイートとそんなにバズりませんでした。charset="utf-8"></script>また、これを用いて月クイズなんてものを作ってみました。よかったら解いてみて下さい。最後まで読んでいただきありがとうございました。冒頭に書くと邪魔になるので最後にひっそりと自己紹介させてください。