プログラマーとして絵を描く
上手に絵が描けるようになりたい。最近人が上手な絵を描いているのを見てそう思う。
だが、私に絵は描けぬ。私はゴリゴリに理系の人生を歩んできている。中学生の時にはもう理系の道に進もうと決めていた。今考えると情景とか筆者の気持ちの理解より再現性のある計算の方が好きだったんだなと思う。おかげでセンター試験で国語が一度大爆発した。
そんな人生を歩んできたので、芸術に触れる機会が少なかった。そこで、今回は絵を描いていこうという訳である。ただし、普通に描いても一般人のしょうがない絵が出来るだけなのでプログラマー的手法で描いてみようと思う。
今回の絵の題材は最近撮影できたコイツにする。
夏にアパートに引っ付いて暑さをしのいでいた。個人的になかなか可愛いと思う。
はじめに普通に絵を描いてみた。
個人的にはいい仕上がりだと思う(当社比)。でも、骨格を意識するレベルでは描けないからまだまだ成長の余地がある気がする。
さて本題である。プログラマーとして絵を描くとは何か。
今回は画像処理を駆使して元の画像をイラストに落としこんでいく方針である。
(細かい手法は後ろに書いとくので、見たい人だけどうぞ)
ざっくり言うとモノの境界っぽいところに線を引いて、イモリが浮き上がらせる感じのプログラムを書いた。結果はこんな感じ
結構綺麗に出てきました!
と言っても補正はゴリゴリにかけてるので、綺麗に出てきたと言うより綺麗に出させたが正しい。あとは余計な部分を消して、足りない部分を加筆してあげれば
デッサンの完成である。何にも言わなかったら、ちょっと絵がうまいと偽れそうではある。
なお、色をつけようとするとこうなる。
完全にベタ塗りである。自然に色塗るプログラムが難しい。結局、芸術的センスが必要じゃねえかよ。誰か絵の塗り方教えてください。デッサンが完成図とだと言うことにします。ここまで来て、題材を何故カメにしなかったのかと考えたことは秘密である。
ちなみに風景画だと・・・
ここは岡山県の後楽園。コイツがこう。
さっきよりプロのデッサンっぽい。これから風景デッサンなら得意ですって偽っていこうかな。色塗りは絶望的だけど。。。
プログラマー的に次は絵をもっと綺麗に塗れるように頑張ります。なお、創作活動的な絵は写真がないので全く描けません。
以下、詳しい手法解説になるので興味ない人はブラウザバック推奨です。
ーーーーーーーーーーーー
使用言語:Python(3.6.10)
使用ライブラリ:opencv,numpy
ここを読むくらいの人ならなんとなくやり方に察しがつく人もいるかもしれないが軽い気持ちで見てください。
手順は
①メディアンフィルタ によるエッジ鮮鋭化
②cannyのエッジ検出
③エッジ検出行列とメディアン行列の乗算による背景削除
①メディアンフィルタ によるエッジ鮮鋭化
今回使用した画像はエッジ検出を行うにして、背景部分に模様が入り込んでいるので、そのままではうまくいかない。
まあまあゴマシオノイズがのっている。そこで今回は周囲の背景が比較的に白いことを利用して鮮鋭化ではベーシックなメディアンフィルタ で対処した。カーネルサイズはcannyのエッジ検出との相性を見ながら、今回は大きめに21に設定している。
②cannyのエッジ検出
cannyのエッジ検出のアルゴリズムは
1.ガウシアンフィルタ による平滑化
2.ソーベルフィルタによる勾配ベクトル検出
3.勾配ベクトルの大きさによる細線化
4.閾値によるエッジ検出である
①でガウシアンフィルタ を採用しないのはcannyに含まれているのも一つの理由ではある。まあ今回の手法はほぼほぼここの紹介に等しい。画像処理に触れたことある人なら鉄板ですよね。
③エッジ検出行列とメディアン行列の乗算による背景削除
まあどんなに調節しても背景の細かい部分は消えず、ゴマシオノイズ処理に有名なクロージング処理も使えないので、今回はメディアンの行列の画素値で閾値以上の部分を抽出させる形にした。妥協的ではあるが、まあまあ効果があった。
色塗りの方は、ラスタスキャンラベリングに近い処理を行って、ベタ塗りしている。この部分で色の付け方を工夫すればもっと見栄えがよくなるかな?
*技術解説の方はあとで追記するかもしれない
蜘蛛の巣
1ヶ月くらい前に家のベランダの隅に小さな蜘蛛の巣ができていることに気づいた。
蜘蛛は益虫ってよく聞くし、サイズ感も小さくて可愛かったのでしばらく放っておいた。
2週間前、洗濯物を取り込む時に迂闊にも一部を壊してしまった。ごめんよ、この時はわざとじゃなかったんだ。けれど、次の日にもう一度見ると巣は綺麗に直って被害者は呑気に平和な日向ぼっこをしていた。
この時、自分の中の悪魔が囁く。「じゃあ、全壊させたらどうするのさ」。普段から実験を繰り返す毎日にいると考えると自然な考えだったとは思うが、我ながら残酷である。という訳で今度は巣を全壊させた。ごめんよ、この時はわざとだよ。次の日、蜘蛛はいなくなっていた。そこから数日、遠出とかでベランダを開けなかった。
1週間前、久しぶりの外干し。ベランダを見ると少しだけ見えづらい位置に蜘蛛の巣ができていた。どうもあの小さな被害者に見える。同一の個体だとすれば、こいつはより安全だと思った場所に作り直したのか、だとしたら蜘蛛って実は賢いのではと思って調べた。どうやら蜘蛛の体は身体サイズに対して脳がとても大きく、モノによっては脚の内部まで中枢神経系がはみ出しているらしい。
蜘蛛が賢いことはわかったが、ならば何故巣をほぼ同じ場所でより安全(自分目線だけど)な場所に作ったのか。いや、作れたのか。まあテキトーに同じ場所でいいっしょって考える能天気の可能性もあるが、それだと失礼な気もするのでちゃんと考えたって程で考察する。
蜘蛛は全壊の次の日には姿を見せなかった。建設途中でもなかったことが確認されている。つまり、1日以上建設までにタイムラグがある。この期間に自分の縄張りにより相応しい場所を探したのではないか。さらにその結果、今までの場所がベストだと判断して微妙に手の届きにくい場所に再建している。つまり、蜘蛛も住処に必要な要素について定量的な判断ができ、実際に有効性が加害者によって証明されている。
蜘蛛は習性として同じ場所に巣を作ろうとするらしい。これは、巣を作る行為を考えれば自然な気はする。問題は微妙に手が届きにくい場所に変化したところである。もう一度、場所をよく見るとはじめに半壊させた側より奥に移動している。なるほど、敵の攻撃範囲を学習したのか。一度の結果からちゃんと学習するなんて下手すると人間もできてないぞ。見習いたいところである。
AIを専攻している者としては考えるのは一度の学習から学ぶというのは非常に難しいことである。AIってなんでもできるように語られがちではあるが、その実この蜘蛛のした思考の再現は難しい。一度の学習ではデータが不足しているからである。AIもまだまだ虫以下なのかもしれない。(本能というモノが種として生きるための膨大な学習の結果なのかもしれないが。)
この蜘蛛であるが、実はもういない。調子に乗って洗濯物にまで巣を広げようとしたので、制裁を下した。汝、住居水流しの刑である。生きていたら他の場所でほとんど脳のその体で頑張れよ。
ブログを始めてみる
はじめに自己紹介をしておこうと思う。
- ブログネーム:kame
- 年齢 :24
- 職業 :大学院生
- 専門 :情報学(プログラミング的な)
ブログを投稿してみたいと前々から思っていた。(するする詐欺はしてた)
何故かと言えば、月並みではあるが自分の成果物をアウトプットする場が欲しいからだ。
私はモノを作ることが好きだ。
記憶を辿れば、小学生の時には図工が一番好きで居残りしてまで作る時もあったし、自由研究は毎回何か作っていた。
通っている大学でも元々は工学系でロボットとかを作ろうと志していた。(一度もロボットらしいモノを作ってはいないけど。。。)
今はほぼ情報系でAIの研究的なことを気楽にしている。
モノを作る人にとって一番大切なことはなんだろうか。
私はプライドだと思う。
仕事で人の作ったプログラムを見たり、採点したりなんかをしたことがあるが、気持ちの入ってないモノは見ればすぐに分かるし、綺麗に構築された物からは熱い感情を感じることもある。
このブログは後々には人に自分の作品をあげる場として活用することで、周囲の目に晒すことでそんな感情を感じ取ってもらえるように頑張りたい。(なお、作品がすぐにできるとは言ってない)
あ、雑記もします。