watershedによる領域分割

少し前の記事でGmicのcolorizeが便利そうでしたので、Gmic内のスクリプトを読みながらopencvで似たようなことをやってみました。

Gmicはsourceに含まれているgmic_def.gmicに処理手順が書かれているため、同じことができるんじゃないか…と思ったのですが、なかなか難しいかも。

pyopencv2を使ってwatershedを中途半端に実装してみた例

gmic_def.gmic内のスクリプトによると、__x_colorize内でpotential mapというのを生成し、それを領域分割時に参照しているようなので、まずはここの処理と同等のものを作ってみることにしました。

# Compute potential function.
__x_colorize :
  -if $1 # Potential for lineart.
    -b[-1] 0.05% -n[-1] 0,1 --b[-1] 0.5% -pow[-2] 10 -n[-2] 0,1 -n[-1] 0.3,1 -min[-2,-1]
  -else  # Potential for generic grayscale image.
    -gradient_norm[-1] -n[-1] 0,255 -normalize_local[-1] 3,3 -*[-1] -1 -n[-1] 0,255
    -b[-1] 0.05% -n[-1] 0,1 -sqr[-1] --b[-1] 0.5% -n[-2,-1] 0,1 -min[-2,-1]
  -endif
  -nm[-1] potential

ラインアート処理部なので、

  1. [Layer1] blur 0.05%
  2. [Layer1] normalize 0.0 〜 1.0
  3. [Layer1] Layer1に対して blur 0.5% したものを[Layer2]に出力
  4. [Layer1] pow(べき乗計算) 10
  5. [Layer1] normalize 0.0 〜 1.0
  6. [Layer2] normalize 0.3 〜 1.0
  7. [Layer1] と [Layer2] を min 合成

といった処理をこんな感じに読みかえ。

oCImage = cv2.imread(strFilename)

nH, nW = oCImage.shape[0:2]

oCImageGray = cv2.cvtColor(oCImage, cv2.COLOR_BGR2GRAY) / 256.0

# oCImageBlur1 = cv2.GaussianBlur(oCImageGray, self.make_gaussian_param(oCImage, 0.0005), 0)
oCImageBlur1 = cv2.GaussianBlur(oCImageGray, (0, 0), 0.5, 0.5)
oCImageNormal1 = cv2.normalize(oCImageBlur1, None, 0.0, 1.0, cv2.cv.CV_MINMAX)
cv2.imshow("oCImageNormal1", oCImageNormal1)

# oCImageBlur2 = cv2.GaussianBlur(oCImageNormal1, self.make_gaussian_param(oCImage, 0.005), 0)
oCImageBlur2 = cv2.GaussianBlur(oCImageGray, (0, 0), 5, 5)
oCImageNormal2 = cv2.normalize(oCImageBlur2, None, 0.0, 1.0, cv2.cv.CV_MINMAX)
cv2.imshow("oCImageNormal2", oCImageNormal2)

oCImagePow = cv2.pow(oCImageNormal1, 10)
oCImageNormal1 = cv2.normalize(oCImagePow, None, 0.0, 1.0, cv2.cv.CV_MINMAX)
oCImageNormal2 = cv2.normalize(oCImageNormal2, None, 0.3, 1.0, cv2.cv.CV_MINMAX)

oCImagePotential = cv2.min(oCImageNormal1, oCImageNormal2)

ガウシアンフィルタのパラメータを理解していないため、数値は適当です。

 plotしてみる。

 watershed…だめかも。

 potential map

 

塗り分け処理を行っている部分も移植しないとあんまり意味がなかったり。

OpenCVを直接使用するのは初めてだったけど、Python用のライブラリも含まれているのでありがたかった。

MacOSX用のMakefileの生成にはCMakeが必要なのですが、以下のオプションのチェックを外しておきました。

  • BUILD_SHARED_LIBS
  • BUILD_TESTS
  • WITH_1394
  • WITH_FFMPEG

参考:http://blogs.wcode.org/2014/10/howto-install-build-and-use-opencv-macosx-10-10/

Render color map, Manage replace color mode, Render base image, Render viewの部分が理解できないと絶望的かも。