ソーベルフィルタの原理・特徴・計算式

画像処理におけるソーベルフィルタ(Sobel filter)の原理や計算式についてまとめました。

ソーベルフィルタとは

ソーベルフィルタ(Sobel filter)は、画像の輪郭検出に用いられる空間フィルタの1つです。プレヴィットフィルタ(Prewitt filter)を改良し、平滑化処理(ノイズ除去)を自然にしたものです。具体的には、平滑化処理を行う際に「注目画素との距離に応じて重み付けを変化させます

■入力画像(左)、出力画像(右)

出力画像を見ると、輪郭の部分が白くなっている、つまり画素値が大きいことがわかります。

解説動画

ソーベルフィルタのカーネル

プレウィットフィルタの改良型がソーベルフィルタです。プレウィットフィルタにおける水平方向微分のカーネル$K_x$、および垂直方向微分のカーネル$K_y$は次の通りです。(周囲1近傍の場合)

$$K_x= \left[ \begin{array}{ccc} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{array} \right], \quad K_y= \left[ \begin{array}{ccc} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{array} \right]$$

ここで、平滑化処理の重みを注目画素との距離に応じて変化させることを考えます。注目画素と上下左右に隣接する場合の重みを2、それ以外の重みを1としたとき、カーネルは次のようになります。

$$K_x= \left[ \begin{array}{ccc} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{array} \right], \quad K_y= \left[ \begin{array}{ccc} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{array} \right]$$

これがソーベルフィルタのカーネルとなります。なお、水平方向微分のカーネル$K_x$では縦方向の輪郭を取り出すことができます。反対に、垂直方向微分のカーネル$K_y$では横方向の輪郭を取り出します。

最後に、縦方向に検出された輪郭画像の画素値を$I_{x}(x, y)$、横方向に検出された輪郭画像の画素値を$I_{y}(x, y)$とすると、縦横両方向の輪郭画像の画素値$I'(x, y)$は、次式で計算できます(二乗和平方根)。

$$I'(x, y) = \sqrt{I_{x}(x, y)^2 + I_{y}(x, y)^2}$$

ソーベルフィルタの計算例

入力画像$I$とソーベルフィルタ(垂直方向微分)のカーネル$K$が次のように与えられたとき、出力画像$I’$を求めます。

$$I= \left[ \begin{array}{cccc} 0 & 0 & 0 & 0 \\ 0 & 10 & 10 & 0 \\ 0 & 0 & 10 & 0 \\ 0 & 0 & 0 & 0 \end{array} \right], \quad K= \left[ \begin{array}{ccc} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1\end{array}\right]$$

解説

入力画像$I$とカーネル$K$を畳み込み演算してやると以下のようになります。

$$ I'(1,1)=1\cdot 10=10 \\ I'(2,1)=2\cdot 10=20 \\ I'(1,2)=(-1\cdot 10)+(-2\cdot 10)=-30 \\ I'(2,2)=(-1\cdot 10)+(-2\cdot 10)=-30 $$

端の画素値は0とし、0未満の画素値は0とすれば、出力画像$I’$は次のようになります。

$$I’= \left[ \begin{array}{cccc} 0 & 0 & 0 & 0 \\ 0 & 10 & 20 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \end{array} \right]$$

関連ページ

プログラミングによる実装例について以下ページで解説しています。

【Python/OpenCV】Sobelフィルタで輪郭検出(エッジ抽出)
Python+OpenCVでソーベル(Sobel)フィルタを「NumPy」「cv2.filter2D」「cv2.Sobel」で実装し、輪郭検出する方法をソースコード付きで解説します。
【画像処理超入門】アルゴリズムの仕組みと実装方法を簡単に解説
画像処理超アルゴリズムの仕組みとプログラミングによる実装方法を簡単に解説します。
この記事を書いた人
西住技研

在学中はシステム制御理論や画像処理、機械学習を専攻分野として研究していました。就職後は、プログラミング(Python)を活用したデータ分析や作業自動化に取り組み、現在に至ります。そこで得たノウハウをブログで発信しています。
YoutubeX(旧Twitter)でも情報発信中です

西住技研をフォローする
画像処理

コメント