Gauche-CVでSobelフィルターを使う方法です。簡単に輪郭の検出ができます。
PythonでSobelフィルター
Pythonでは、filter.sobelで簡単にフィルターをかけられます。
# -*- coding: utf-8 -*- # Sobelフィルター __author__ = 'Natsutani' from PIL import Image from numpy import * import scipy from scipy.ndimage import filters im = array(Image.open('twittan.jpg').convert('L')) imx = zeros(im.shape) filters.sobel(im,1,imx) imy = zeros(im.shape) filters.sobel(im,0,imy) magnitude = sqrt(imx**2+imy**2) scipy.misc.imsave('output/twi_sobel_x_python.png', imx) scipy.misc.imsave('output/twi_sobel_y_python.png', imy) scipy.misc.imsave('output/twi_sobel_python.png', magnitude)
Gauche-CVでSobelフィルター
Gauche-CVでは、cv-sobleを使うとSobelフィルターを使用できます。注意点は、cv-sobleの出力は、IPL_DEPTH_32F で生成された領域である必要があります。x方向のSobelフィルターと、y方向のSobelフィルターの結果から、画素の大きさを求める関数 mat-magniture-2d はこのファイルで定義しています。
cvutil.scm
(use gauche.uvector) (use cv) (load "./cvutil.scm") (define src (cv-load-image "twittan.jpg")) (define src-gray (make-image (ref src 'width) (ref src 'height) IPL_DEPTH_8U 1)) (cv-cvt-color src src-gray CV_BGR2GRAY) ; sobelの結果は IPL_DEPTH_32F の深さの画像になる。 (let* ((dst-x (make-image (slot-ref src-gray 'width) (slot-ref src 'height) IPL_DEPTH_32F 1)) (dst-y (cv-clone-image dst-x)) (dst-mag (cv-clone-image dst-x))) (cv-sobel src-gray dst-x 1 0) (cv-sobel src-gray dst-y 0 1) (cv-save-image "output/twi_sobel_gauche.png" dst-x) (cv-save-image "output/twi_sobel_gauche.png" dst-y) (mat-magniture-2d dst-x dst-y dst-mag) (cv-save-image "output/twi_sobel_gauche.png" dst-mag))
処理結果
Gauche-CVでの出力結果です。