そこそこな線画を目指す OpenCV

  • 51
    Like
  • 0
    Comment

概要

カラー画像から線画を取る。
線画とはモノクロ画像のことで、2値化ではない(たぶん)
OpenCVでしようと考えると、グレースケールで読み込み→adaptiveThresholdで2値化を思いつくんだけど、あんまりよくない。
ので、話題の方のコメントってどんな風にやるのか検証。

参考

コード


# -*- coding: utf-8 -*-
"""
Created on Fri Jan 27 11:30:12 2017

@author: khsk
"""

import numpy as np
import cv2 as c
import glob
import os

# 8近傍の定義
neiborhood8 = np.array([[1, 1, 1],
                            [1, 1, 1],
                            [1, 1, 1]],
                            np.uint8)

for path in glob.glob('./images/eupho/*'):
    if (os.path.basename(path) == 'Thumbs.db'):
        continue
    img = c.imread(path, 0) # 0なしでカラー
    img_dilate = c.dilate(img, neiborhood8, iterations=1)
    img_diff = c.absdiff(img, img_dilate)
    img_diff_not = c.bitwise_not(img_diff)
    #gray = c.cvtColor(img_diff_not, c.COLOR_RGB2GRAY)

    #at = c.adaptiveThreshold(img_diff_not, 255, c.ADAPTIVE_THRESH_GAUSSIAN_C, c.THRESH_BINARY, 7, 8) # intをいい感じに調整する
    c.imwrite(os.path.dirname(path) + '_clean_senga_color_gray/' + os.path.basename(path), img_diff_not)

c.imshow('test',img)
c.imshow('test2',img_dilate)
c.imshow('test3',img_diff)
c.imshow('test4',img_diff_not)
c.waitKey(10000)

c.destroyAllWindows()

基本コード。
コメントアウトしたり変数を変えたりint値をイジイジしたりする。
膨張は4近傍などもあるようだけど、くっきりさせたいなら多めの8近傍かなとなんとなく思ってした。
但し書きがない限り読み込みはグレースケールで。

元画像

still_01.jpg

機械学習の調べ物中にユーフォなどの名前を見かけた記憶があるが、仔細を忘れた。
機械学習に最適とか?使って作ってるとか?
線画には関係ない。おそらく。

2値化

adaptiveThresholdのみ

still_01.jpg

線がガタガタしているし、これはマシだがゴミのような黒点ができることがある

膨張1回

still_01.jpg

きれいすぎてビックリした。
気になる点といえば、濃淡があり、かすれかすれの線がよく出る。

hibikeyufoirasuto01002.jpg

膨張3・5回

still_01.jpg

still_01.jpg

差分が太くなれば薄い線でもはっきり出るかと膨張回数を増やしたが、
濃い線がより太くなるだけで違和感が広がる。
2回ならまだいい感じかも。

カラー差分→グレースケール

still_01.jpg

still_01.jpg

参考ツイートが最後にグレースケール化だったので、最初の読み込みをカラーで処理をしてみた。(膨張1回)
誤差程度だと思う。カラー線画に味がある。

膨張1回後、2値化

still_01.jpg

きれいな線画だけど2値ではないと思ったので最後に2値化。
2値化から情報量を減らした感じに。

2値化後膨張1回

still_01.jpg

ここまでして、どうやら膨張は2値化の画像に施すらしいと気づいたので、読み込み→2値化→膨張→差分の手順を踏む。
もはや違いは言葉で表せられない。

終わり

そこそこになったと思う。
そもそも「いい線画」が何かわかってないのでなんとも。

データセット作成のために考えていたが、機械学習のためのデータ作りを機械学習で作りたい気分に。
ラフの線画化もすでに研究されているので、曖昧な線も補完されるやも。

ということで、機械学習に片足も踏み込んでませんが、データの準備が一歩前進したかなってところで、学習済みモデルの公開どころかwebサービス化までされたので、こっちで遊んでいる方が絶対楽しい。

QFW455OLKMO3EC3E1OSRTD4T8ID75DNV_0.jpg

髪の色凄い合ってる。