PythonとOpenCVで画像をアスキーアート化してみる(トレースAAへの道)

スポンサーリンク

大学時代の専門学科は今でいう人工知能系だった。

しかし入学当時の1999年、人工知能の限界が囁かされ「冬の時代」と呼ばれていた。

 

「教師付き学習」などを用いた手法を採用した論文は査読で落とされる時代。

数学的計算アプローチに基づいた手法や研究のみが正しいとされ、学生も頑なにそれを信じて生きてきた。

 
 

それが、たった10年で180度変わった。

今では人工知能学会以外ですら機械学習を使った研究のオンパレード。

むしろ機械学習を使わなければ査読に受からない状況だ。

将来の事は誰にも分からないのは仕方ないが、頭ごなしに否定する教授は何だかなぁ……。

そんな冬の時代に私は「コンピュータビジョン(CV)/コンピュータグラフィックス(CG)」の研究室を選択した。

 
 

一番人気の研究室だったのでオープンキャンパスでも多くの人が訪れた。

CGチームは楽しそうな出し物をしていたが、私は地味なCVチーム(画像認識)

それでも「何か出し物を出せないかな?」と考えて、提供したのが

 

写真からアスキーアート

 

研究室に見学に来た人の写真を撮り名前を聞き、見学が終わるタイミングで自分の名前で書かれたアスキーアートの印刷用紙を記念に持ち帰る仕組みだ。

即興で考えた割には、それなりに喜んで貰えた。

実はこれはとても簡単で、256色の解像度を文字数に合わせて落とし込むだけ。

 
 

どうして こんな話をしたかというと、自宅に帰ると子供が興奮気味に話をしてきた。

 

 

学校で写真を撮ったんだよ。それで、また大きな写真を作ってロケットで飛ばすんだよ!!

 
 

もう何言ってるか分かんねーよww
 
 

調べて納得。

第9回 国際総合企画「こども宇宙プロジェクト」

撮影した写真でつくったモザイクアートを、NASAのロケットに搭載し、国際宇宙ステーション(ISS)に送る

第9回こども宇宙プロジェクト|モザイクアート

因みに第八回は次のような感じだ。

これ、ちっとも技術的には難しくない。

でも大量の写真が必要だから一般人が必要とするユースケースが想定できない。

子供に説明するためにスクリプトを書いたので、画像からのアスキーアートを簡単に紹介しておく。

スポンサーリンク

画像から自動的にアスキーアートを作る

仕組みとしては、次のようになる。

  • 画像をグレースケールに変換する
  • 各ピクセルの色の濃さを取得し、それに応じて文字を決定する
  • 列ごとに改行する

当時はC言語で作ったが、PythonとOpenCVを使えばこれらの処理を超簡単に行える。

ASCII文字を決定する

各ピクセルの濃度(0~255)ごとにASCII文字を決定する必要があるが、文字を置き換えるだけじゃ面白くない。

そこで、当時は名前を聞いてアスキーアートを作ることを試みた。

 
 

こうすることによって、

 
 

研究室に尋ねてきた顧客の個人情報をさり気なく聞くことができ、写真と名前も管理できて超お得!

 
 

という裏の目的があった。今ではぼんくらオヤジだが、当時はアイデア豊富だったなぁ。

 
 

その際に「漢字」「ひらがな」両方聞く。

そして主観で文字が複雑(濃度が高い)な順に並び替え、最後に「$?|・¥=~;。、 」など濃度が低そうな文字列を追加する。

順番は見た目で決めただけなので超適当だけど、ここを瞬時に判断しないと、多くの人を処理しきれない。

ソースコード

当時はC言語で書いていたけど、今回はPythonでサクッと書いてしまう。

画像サイズをリサイズしているので、そこは各自調整が必要。

解像度が高ければキレイに見えるが文字が小さくて読めない。

今回はOpenCVで簡単にグレースケールに変換したが、学生時代の当時は様々なアルゴリズムでグレースケール変換を行い、もっともアスキーアートが綺麗に見える方法を模索した記憶がある。

輪郭トレースによる抽出

これで日記が終わると20年間で何の成長もしてない事になるので、ここから本題。

 

2ちゃんねるを見てると、アスキーアートは輪郭を表現している。

なので、今まで説明したのがアスキーアートではない感は学生時代より ずっと感じていた。

これは線画を文字を作って再現した「トレースAA」と呼ばれるタイプのAA(アスキーアート)だ。

 

輪郭検出は線画抽出の最もポピュラーな方法だ。

2階調化で情報量をコントロールできるので、使い勝手も良い。

 
 

Photoshopでは次のように行う。

フィルター > 表現手法 > 輪郭トレース

イメージ > 色調補正 > 2階調化

 

そして、再度スクリプトを適用してみる。

 

いや……これじゃ無い感。

ディープラーニングでアスキーアート(DeepAA)

ディープラーニングでアスキーアートの自動生成を扱った研究として、2017年のDeepAAがある。

ディープラーニングでアスキーアートを作る - Qiita
はじめまして。 本業はアスキーアート (以下AA) 職人のOsciiArtといいます (本業ではない)。 AlphaGo対イ・セドルの対局を見て、「僕もディープラーニングで神AA職人を倒したい!」と思い、pythonをインストールして...

これはテキストとその描画結果である画像のデータを用意したうえで、逆向きの変換を一文字ずつ教師あり学習させるというもの。

 
 

Webサービス「DeepAA on The Web : Version 2.1」も存在する。

画像はローカルにのみ保持されるらしい。こんな時代が来たんだなー。

で、結果。

結局、AA職人ってトレースではなく自分でデフォルメして作ってるんだよなー。

AA職人を超えるには、もう一つ何か必要だ。

まとめ

トレース・アスキーアートは難しい。

でもディープラーニングを使った取り組みも進んでいるようだ。

アスキーアート自動生成とディープラーニングをつなぐ微分可能レンダラーを実装した - Qiita
はじめに 微分可能レンダラーという研究があります。これは画像の描画過程を微分可能に近似することで、レンダラーへの入力(3次元モデルやカメラ姿勢など)とその出力(画像)の関係をディープラーニングで扱うことが出来るようになるというも...

深堀りはしないが、今後に期待。

コメント

タイトルとURLをコピーしました