Python OpenCV3でLaplacianメソッドを使ってエッジ(輪郭)抽出

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

(1次)微分オペレータだと指定した直線の傾きの方向から得られるエッジしか取得できない。
そこで、2次微分オペレータでエッジを取得してみる。

 

前提

ディレクトリ構成などはこことかこことか。

&nbsp

元画像

微分オペレータのときと比較するために、同じ蔵の画像(kura.jpg)を使う。

kura

 

大体の仕組み

以下の画像の通り。
わかりづらいけど、実際に計算してみるとわかる。

スクリーンショット 2015-07-05 1.52.47

 

Laplacianメソッドの使い方

Laplacianメソッドの使い方は次の通り。

cv2.Laplacian(img_src, 出力画像のbit深度, オペレータのサイズ)

出力画像のbit深度は以下の中から選択できる。

cv2.CV_16S    cv2.CV_16UC2  cv2.CV_32FC4  cv2.CV_64FC1  cv2.CV_8SC3
cv2.CV_16SC1  cv2.CV_16UC3  cv2.CV_32S    cv2.CV_64FC2  cv2.CV_8SC4
cv2.CV_16SC2  cv2.CV_16UC4  cv2.CV_32SC1  cv2.CV_64FC3  cv2.CV_8U
cv2.CV_16SC3  cv2.CV_32F    cv2.CV_32SC2  cv2.CV_64FC4  cv2.CV_8UC1
cv2.CV_16SC4  cv2.CV_32FC1  cv2.CV_32SC3  cv2.CV_8S     cv2.CV_8UC2
cv2.CV_16U    cv2.CV_32FC2  cv2.CV_32SC4  cv2.CV_8SC1   cv2.CV_8UC3
cv2.CV_16UC1  cv2.CV_32FC3  cv2.CV_64F    cv2.CV_8SC2   cv2.CV_8UC4

オペレータのサイズは、大体の仕組みのところのオペレータの縦横の大きさを指定する。
5にすれば5×5のオペレータになる。

 

2次微分のよるエッジ検出

2次微分でエッジ検出をしてみる。
sourceディレクトリにlaplacian.pyを作成する。

# -*- coding: utf-8 -*-

import cv2
import numpy as np

if __name__ == '__main__':
    
    # 画像の読み込み
    img_src = cv2.imread("./image/karasu.jpg", 1)

    # 2次微分オペレータを使って画像のエッジを検出
    img_tmp = cv2.Laplacian(img_src, cv2.CV_32F, 8)
    img_lap = cv2.convertScaleAbs(img_tmp)

    # 表示
    cv2.imshow("Show LAPLACIAN Image", img_lap)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

実行してみる。

(opencv_python)$ python laplacian.py

スクリーンショット 2015-07-05 1.58.04

 

1次微分オペレータの時には縦横のどちらかしか取得できなかったが、すべてのエッジを取得できていることがわかる。ちなみにkarasu.jpg

スクリーンショット 2015-07-04 1.06.18

 

で試すと、

スクリーンショット 2015-07-05 1.57.29

 

のようにちょっとかっこいい画像ができた。