Python OpenCV 空間フィルタ #3

株式会社リュディアです。Python を使った画像処理として OpenCV を使った方法をまとめていきます。

前回までの Python OpenCV 空間フィルタ のまとめへのリンクは以下を参考にしてください。

エッジ抽出を行う微分フィルタ、Prewitt(プレヴィット)フィルタに続き、今回もエッジ抽出を行う Sobel(ソベル)フィルタについてまとめてみます。

前回の Prewitt(プレヴィット)フィルタが微分フィルタに平滑化処理を追加してノイズの影響を受けにくくしたものという説明はしました。今回の Sobelフィルタは Prewitt フィルタの平滑化処理において注目画素との距離に応じてカーネルに重みづけをしたものと言えます。つまり Prewitt フィルタをさらに改良したものと考えてください。

では Sobel フィルタでどのようなカーネルを使うのか見てみましょう。以下の例を見てください。

画像1

Prewitt フィルタとの違いは中心画素の隣接ピクセルが +/-1 ではなく +/-2 になっていることです。注目画素に近い縦横の隣接部分は +/- 2 、斜めの隣接部分は +/- 1 になっています。つまり注目画素との距離に応じてカーネルに重みづけをしたフィルタになります。

では以下のコードを一緒に見ていきましょう。原画像は Lena です。

import cv2
import numpy as np

filebase = 'lena'
path = filebase + '.tiff'
image = cv2.imread(path, 1)
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

sobel_x = cv2.Sobel(gray_image, cv2.CV_32F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(gray_image, cv2.CV_32F, 0, 1, ksize=3)

cv2.imshow('sobel_x', sobel_x)
cv2.imshow('sobel_y', sobel_y)

cv2.waitKey(0)
cv2.destroyAllWindows()

読み込んだ画像をグレイスケールに変換し、OpenCV標準の Sobel() を使います。第3 引数は x に関する微分の次数です。第 4 引数は y に関する微分の次数です。 x 方向についての Sobel フィルタを実施したい場合はそれぞれ 1, 0 、y方向について Sobel フィルタを実施したい場合はそれぞれ 0, 1 とします。x, y それぞれ処理した Sobel フィルタ結果が別ウィンドウで表示されます。以下、X方向、Y方向の順です。

画像2

画像3

今回はエッジ抽出フィルタの 1 つである Sobel フィルタについてまとめました。

OpenCV 空間フィルタに関するまとめの続きは以下からどうぞ。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?