ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Gauche-CVでSobelフィルター

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での出力結果です。