Help us understand the problem. What is going on with this article?

写真から木の線画を抽出しよう

概要

この記事では、イラストではなくフリーの写真から線画を抽出しようとしました。
正直言うとあまりうまくいっていませんが、とりあえず途中経過ということで記事にしておきます。
先にソースコードと結果を載せておきます。
ソースコード:https://github.com/FujibayashiYuya/Image-To-Line-Drawing/blob/master/Sorce.cpp

元画像(http://gahag.net/000312-tree-landscape/)
tree2.jpg
線画result3.jpg

線画というにはちょっと薄すぎない?とか、雲が消えてるよ?とかいろいろ不備はありますが、今回は木の線画に注目したので少し多めに見ていただければと思います。

詳細

参考にしたサイトの手法の見直し

まず画像から線画を抽出するにあたり、こちらのサイトの手法を試しました。
https://www.mathgram.xyz/entry/cv/contour
このサイトにもあるようにイラストのような画像だとうまくいくのですが、写真になると必要以上に線が増えてしまい、イラストほどうまくはいきません。それは元の画像が画素値の細かい変化を含むような画像だと、差分をとった時にその細かな部分が線画として抽出されるからだと考えられます。
試しに同じ手法を今回の木の画像で行うと下のようになりました。葉っぱの部分が必要以上に線が多いですね。
median.jpg

参考にしたサイトは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画素にしたものです)
metest55.jpg

Kmeans法を試してみた

そこで画素値の変化を緩やかにするんじゃなくて、ある程度近い値なら同じにしようと思いKmeans法を試してみました。
C++,OpenCVを用いたKmeans法のコードはこのサイトがとても参考になりました。
https://tora-k.com/2019/11/28/anime_filter/

クラスの数を6にした場合の結果が下のようになりました。
kmcol.jpg
木の葉っぱの細々した感じは若干緩和されましたが、保険をかけて3*3画素でメディアンフィルタをかけてから線画をとってみましょう。
km.jpg
葉の部分に関しては、葉のチクチク感あるシルエットを残しつつ最初の線画より程よい情報量になったのではないでしょうか。ただ、空の部分に余計な線が増えたのでこれをどうにかしないと。

そこで、他のサイトを参考にした線画とKmeans法で求めた線画をbitwise_and()関数で論理積を行ってみました。
km_and_median.jpg
空の線はなくなりました。(雲もないですが...)木の葉っぱの部分もごちゃごちゃ感は少しマシになりましたが、全体的にパッとしない感じに...
そこで、試しにCanny法で得たエッジとKmeans法の論理積を行ってみました。result3.jpg
若干くっきりしたような...してないような...
写真の完全な線画化は難しいですね
うまくいく方法が見つかったらその時はまた記事を書きます。

最後にソースコード(ページ上部と同じ)載せておきます。
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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした