概要
この記事では、イラストではなくフリーの写真から線画を抽出しようとしました。
正直言うとあまりうまくいっていませんが、とりあえず途中経過ということで記事にしておきます。
先にソースコードと結果を載せておきます。
ソースコード:https://github.com/FujibayashiYuya/Image-To-Line-Drawing/blob/master/Sorce.cpp
元画像(http://gahag.net/000312-tree-landscape/)
線画
線画というにはちょっと薄すぎない?とか、雲が消えてるよ?とかいろいろ不備はありますが、今回は木の線画に注目したので少し多めに見ていただければと思います。
詳細
参考にしたサイトの手法の見直し
まず画像から線画を抽出するにあたり、こちらのサイトの手法を試しました。
https://www.mathgram.xyz/entry/cv/contour
このサイトにもあるようにイラストのような画像だとうまくいくのですが、写真になると必要以上に線が増えてしまい、イラストほどうまくはいきません。それは元の画像が画素値の細かい変化を含むような画像だと、差分をとった時にその細かな部分が線画として抽出されるからだと考えられます。
試しに同じ手法を今回の木の画像で行うと下のようになりました。葉っぱの部分が必要以上に線が多いですね。
参考にしたサイトはPythonなので、C++で書いたものを下に載せておきます。
Mat Median1(Mat img) {
Mat gray, blur, dila, diff, edge;
//メディアンフィルタをかけると画素値の変化が緩やかになるので若干線画の数を調節できる
medianBlur(img, blur, 3);
//画像をグレースケール化
cvtColor(blur, gray, COLOR_BGR2GRAY, 1);
//黒い箇所を狭める
dilate(gray, dila, Mat(), Point(-1, -1), 1);
//差分をとる
absdiff(gray, dila, diff);
//白黒反転
bitwise_not(diff, edge);
return edge;
}
上のコードでメディアンフィルタの範囲を広くすると線画になる箇所が大まかになっていくのですが、薄っすらと線が入っていたりしてちょっと汚い感じになりました。(下は範囲を5*5画素にしたものです)
Kmeans法を試してみた
そこで画素値の変化を緩やかにするんじゃなくて、ある程度近い値なら同じにしようと思いKmeans法を試してみました。
C++,OpenCVを用いたKmeans法のコードはこのサイトがとても参考になりました。
https://tora-k.com/2019/11/28/anime_filter/
クラスの数を6にした場合の結果が下のようになりました。
木の葉っぱの細々した感じは若干緩和されましたが、保険をかけて3*3画素でメディアンフィルタをかけてから線画をとってみましょう。
葉の部分に関しては、葉のチクチク感あるシルエットを残しつつ最初の線画より程よい情報量になったのではないでしょうか。ただ、空の部分に余計な線が増えたのでこれをどうにかしないと。
そこで、他のサイトを参考にした線画とKmeans法で求めた線画をbitwise_and()関数で論理積を行ってみました。
空の線はなくなりました。(雲もないですが...)木の葉っぱの部分もごちゃごちゃ感は少しマシになりましたが、全体的にパッとしない感じに...
そこで、試しにCanny法で得たエッジとKmeans法の論理積を行ってみました。
若干くっきりしたような...してないような...
写真の完全な線画化は難しいですね
うまくいく方法が見つかったらその時はまた記事を書きます。
最後にソースコード(ページ上部と同じ)載せておきます。
https://github.com/FujibayashiYuya/Image-To-Line-Drawing/blob/master/Sorce.cpp
参考文献
線画の抽出手法について
①https://tadaoyamaoka.hatenablog.com/entry/2017/02/19/172744
②https://www.mathgram.xyz/entry/cv/contour
③http://azp2.sakuraweb.com/photo/rinkaku/index.html
その他プログラムなど
・Kmeans法. . . https://tora-k.com/2019/11/28/anime_filter/
・Canny法. . . https://algorithm.joho.info/image-processing/canny-edge-detecter/