プログラマーとして絵を描く
上手に絵が描けるようになりたい。最近人が上手な絵を描いているのを見てそう思う。
だが、私に絵は描けぬ。私はゴリゴリに理系の人生を歩んできている。中学生の時にはもう理系の道に進もうと決めていた。今考えると情景とか筆者の気持ちの理解より再現性のある計算の方が好きだったんだなと思う。おかげでセンター試験で国語が一度大爆発した。
そんな人生を歩んできたので、芸術に触れる機会が少なかった。そこで、今回は絵を描いていこうという訳である。ただし、普通に描いても一般人のしょうがない絵が出来るだけなのでプログラマー的手法で描いてみようと思う。
今回の絵の題材は最近撮影できたコイツにする。
夏にアパートに引っ付いて暑さをしのいでいた。個人的になかなか可愛いと思う。
はじめに普通に絵を描いてみた。
個人的にはいい仕上がりだと思う(当社比)。でも、骨格を意識するレベルでは描けないからまだまだ成長の余地がある気がする。
さて本題である。プログラマーとして絵を描くとは何か。
今回は画像処理を駆使して元の画像をイラストに落としこんでいく方針である。
(細かい手法は後ろに書いとくので、見たい人だけどうぞ)
ざっくり言うとモノの境界っぽいところに線を引いて、イモリが浮き上がらせる感じのプログラムを書いた。結果はこんな感じ
結構綺麗に出てきました!
と言っても補正はゴリゴリにかけてるので、綺麗に出てきたと言うより綺麗に出させたが正しい。あとは余計な部分を消して、足りない部分を加筆してあげれば
デッサンの完成である。何にも言わなかったら、ちょっと絵がうまいと偽れそうではある。
なお、色をつけようとするとこうなる。
完全にベタ塗りである。自然に色塗るプログラムが難しい。結局、芸術的センスが必要じゃねえかよ。誰か絵の塗り方教えてください。デッサンが完成図とだと言うことにします。ここまで来て、題材を何故カメにしなかったのかと考えたことは秘密である。
ちなみに風景画だと・・・
ここは岡山県の後楽園。コイツがこう。
さっきよりプロのデッサンっぽい。これから風景デッサンなら得意ですって偽っていこうかな。色塗りは絶望的だけど。。。
プログラマー的に次は絵をもっと綺麗に塗れるように頑張ります。なお、創作活動的な絵は写真がないので全く描けません。
以下、詳しい手法解説になるので興味ない人はブラウザバック推奨です。
ーーーーーーーーーーーー
使用言語:Python(3.6.10)
使用ライブラリ:opencv,numpy
ここを読むくらいの人ならなんとなくやり方に察しがつく人もいるかもしれないが軽い気持ちで見てください。
手順は
①メディアンフィルタ によるエッジ鮮鋭化
②cannyのエッジ検出
③エッジ検出行列とメディアン行列の乗算による背景削除
①メディアンフィルタ によるエッジ鮮鋭化
今回使用した画像はエッジ検出を行うにして、背景部分に模様が入り込んでいるので、そのままではうまくいかない。
まあまあゴマシオノイズがのっている。そこで今回は周囲の背景が比較的に白いことを利用して鮮鋭化ではベーシックなメディアンフィルタ で対処した。カーネルサイズはcannyのエッジ検出との相性を見ながら、今回は大きめに21に設定している。
②cannyのエッジ検出
cannyのエッジ検出のアルゴリズムは
1.ガウシアンフィルタ による平滑化
2.ソーベルフィルタによる勾配ベクトル検出
3.勾配ベクトルの大きさによる細線化
4.閾値によるエッジ検出である
①でガウシアンフィルタ を採用しないのはcannyに含まれているのも一つの理由ではある。まあ今回の手法はほぼほぼここの紹介に等しい。画像処理に触れたことある人なら鉄板ですよね。
③エッジ検出行列とメディアン行列の乗算による背景削除
まあどんなに調節しても背景の細かい部分は消えず、ゴマシオノイズ処理に有名なクロージング処理も使えないので、今回はメディアンの行列の画素値で閾値以上の部分を抽出させる形にした。妥協的ではあるが、まあまあ効果があった。
色塗りの方は、ラスタスキャンラベリングに近い処理を行って、ベタ塗りしている。この部分で色の付け方を工夫すればもっと見栄えがよくなるかな?
*技術解説の方はあとで追記するかもしれない
この記事が気に入ったらサポートをしてみませんか?