ふと一念発揮してスキャナのゴミ取りをOpenCVで自動化出来ないかと思い、やってみることにしました。
こんな実験にわざわざCで書くのもめんどいので、毎度ながらのPythonですw
対象は今描いているイカちゃんのイラストの線画にしました。
方法としては、findContours()で領域を摘出。その領域の面積、ここでは50pxとしておりますが、それ以下の領域をごそっと塗りつぶしてしまおう…というものです。安易ですが(^^;
さて参ります。まずはfindContours()ですべての線画領域を摘出してみました。
主線以外の部分のこの赤い点。これが全てゴミです。
そして、50px以下の領域を塗りつぶした版。
おおっ!驚きの白さに!!
…実は主線の中の浮いてしまった部分とか、そういう部分も削除されたりしてしまっています。まずレベル調整して突っ込むべきかな?とも思いますが、まぁ、いずれにせよ、取り込んだ線画は修正するものであり、いずれにせよ十分使い物になりそうです。
っていうか、すでにそういうゴミ取りソフト、あるんじゃないかなと思いますが(;´Д`)
取り敢えず自分が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()