Python OpenCV3で画素の膨張処理(dilation)と収縮処理(erosion) (ちょっと解説も)


膨張処理(dilation)、収縮処理(erosion)は画像のノイズ除去に使われる処理。

 

膨張処理・縮小処理とは

膨張処理は図形を1画素分広げる処理のこと。
縮小処理は図形の1画素分狭める処理のこと。

膨張するにも縮小するにも近傍を使う。
よく使われる近傍は、以下の4近傍と8近傍。
(以降の部分では、注目する部分を1、注目しない部分を0で表す。)

スクリーンショット 2015-07-06 3.03.19

 

膨張処理は、画像の各画素に近傍の黄色の部分を当てて、近傍のいずれかの1が元画像でも1の場合、その画素の部分を1にしていく。
図に表すと次のようになる。

スクリーンショット 2015-07-06 3.22.28

 

収縮処理は、画像の各画素に近傍の黄色の部分を当てて、近傍のいずれかの1が元画像でも0の場合、その画素の部分を0にしていく。
図に表すと次のようになる。

スクリーンショット 2015-07-06 3.04.29

 

前提

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

 

元画像

テレビの砂嵐画像(sunaarashi.jpg)を使う。
source/image ディレクトリにsunaarashi.jpgを配置する。

sunaarashi

 

膨張処理

まず膨張処理を実装してみる。
sourceディレクトリにdilation.pyを作成する。

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

import cv2
import numpy as np

if __name__ == '__main__':

    # 画像の読み込み
    img_src = cv2.imread("./image/sunaarashi.jpg", 1)

    # 4近傍の定義
    neiborhood4 = np.array([[0, 1, 0],
                            [1, 1, 1],
                            [0, 1, 0]],
                            np.uint8)

    # 8近傍の定義
    neiborhood8 = np.array([[1, 1, 1],
                            [1, 1, 1],
                            [1, 1, 1]],
                            np.uint8)

    # 8近傍で膨張処理
    img_dilation = cv2.dilate(img_src,
                              neiborhood8,
                              iterations=1)

    # 表示
    cv2.imshow("Show DILATION Image", img_dilation)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

実行してみる。

(opencv_python)$ python dilation.py

スクリーンショット 2015-07-06 3.45.36

 

元画像とよく比較すると、白い部分がより強調されていることがわかる。

 

縮小処理

次に縮小処理を実装してみる。
sourceディレクトリにerosion.pyを作成する。

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

import cv2
import numpy as np

if __name__ == '__main__':

    # 画像の読み込み
    img_src = cv2.imread("./image/sunaarashi.jpg", 1)

    # 4近傍の定義
    neiborhood4 = np.array([[0, 1, 0],
                            [1, 1, 1],
                            [0, 1, 0]],
                            np.uint8)

    # 8近傍の定義
    neiborhood8 = np.array([[1, 1, 1],
                            [1, 1, 1],
                            [1, 1, 1]],
                            np.uint8)

    # 8近傍で縮小処理
    img_erosion = cv2.erode(img_src,
                              neiborhood8,
                              iterations=1)

    # 表示
    cv2.imshow("Show EROSION Image", img_erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

(opencv_python)$ python erosion.py

実行してみる。

スクリーンショット 2015-07-06 3.53.51

 

元画像とよく比較すると、黒い部分がより強調されていることがわかる。

 

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です