モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

OpenCVでスキャナのゴミ取りをやってみた

ふと一念発揮してスキャナのゴミ取りをOpenCVで自動化出来ないかと思い、やってみることにしました。

こんな実験にわざわざCで書くのもめんどいので、毎度ながらのPythonですw

対象は今描いているイカちゃんのイラストの線画にしました。

方法としては、findContours()で領域を摘出。その領域の面積、ここでは50pxとしておりますが、それ以下の領域をごそっと塗りつぶしてしまおう…というものです。安易ですが(^^;

さて参ります。まずはfindContours()ですべての線画領域を摘出してみました。

f:id:dothiko:20150722000008j:plain

主線以外の部分のこの赤い点。これが全てゴミです。

そして、50px以下の領域を塗りつぶした版。

f:id:dothiko:20150722000015j:plain おおっ!驚きの白さに!!

…実は主線の中の浮いてしまった部分とか、そういう部分も削除されたりしてしまっています。まずレベル調整して突っ込むべきかな?とも思いますが、まぁ、いずれにせよ、取り込んだ線画は修正するものであり、いずれにせよ十分使い物になりそうです。

っていうか、すでにそういうゴミ取りソフト、あるんじゃないかなと思いますが(;´Д`)

取り敢えず自分がOpenCVを学ぶモチベーションにはなったかなぁ、ということで。

ここからsvgを生成してしまっても面白いのかなぁ?とか思わなくもないですが、ベジェ回りはどうするのか。なんかいい資料があればいいんですけどねぇ…

とりあえずは、これでゴミを取ってpotraceに突っ込むという事で十分かもですけどね。

今回のソースコード

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import cv2
import numpy as np

def main():
    # 画像の取得
    im = cv2.imread("15071801.JPG")

    # グレースケール変換
    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    # モノクロ変換
    bimg=cv2.adaptiveThreshold(gray, 255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,2 )

   #bimg=cv2.bitwise_not(bimg) # モノクロ反転、しかしTHRESH_BINARY_INVで可能なことが判明したため備忘録として

    contours,hierarchy = cv2.findContours( bimg,  cv2.RETR_EXTERNAL | cv2.RETR_TREE  , cv2.CHAIN_APPROX_NONE)


    # ゴミ除去,面積50px以下を排除
    new_contours=[]
    FILL_COLOR=(255,255,255)
    AREA_MAX=50
    i=0

    
    for c in contours:
        s=abs(cv2.contourArea(c))
        if s <= AREA_MAX:
            new_contours.append(c)

    cv2.drawContours( im, new_contours, -1,FILL_COLOR,-1)

    cv2.imwrite("/tmp/processed.png",im)



if __name__ == '__main__':
    main()