【画像処理】ソーベルフィルタの原理・特徴・計算式

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

【はじめに】ソーベルフィルタとは

ソーベルフィルタ(Sobel filter)は、輪郭検出に用いられる空間フィルタです。
ソーベルフィルタは、プレウィットフィルタ(Prewitt filter)を改良したものです。

プレウィットフィルタは「平滑化フィルタ」と「微分フィルタ」を組み合わせることで、ノイズの影響を抑えながら輪郭を抽出します。
その平滑化フィルタをかける際に「注目画素との距離に応じて重み付けを変化させた」ものがソーベルフィルタです。
これにより自然に平滑化を行うことが出来ます。

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

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

【カーネル】ソーベルフィルタ

ソーベルフィルタにおける、水平方向の輪郭検出に用いるカーネルK_x、および垂直方向の輪郭検出に用いるカーネルK_yは次の通りです。
(周囲1近傍の場合)

(1)   \begin{eqnarray*} K_x= \left[ \begin{array}{ccc} -1& 0 & 1 \\ -2& 0 & 2 \\ -1& 0 & 1 \\ \end{array} \right], K_y= \left[ \begin{array}{ccc} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \\ \end{array} \right] \end{eqnarray*}

カーネルの原理

なぜソーベルフィルタのカーネルが(1)式になるのか簡単に紹介します。
冒頭でも述べましたが、プレウィットフィルタの改良型がソーベルフィルタです。

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

(2)   \begin{eqnarray*} K_x= \left[ \begin{array}{ccc} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \\ \end{array} \right], K_y= \left[ \begin{array}{ccc} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \\ \end{array} \right] \end{eqnarray*}

ここで、平滑化処理の重みを注目画素との距離に応じて変化させます。
ソーベルフィルタでは、注目画素と上下に隣接する場合は2、そうでない場合は1の重みを与えます。
重みを与えられたカーネルは次のようになります。

(3)   \begin{eqnarray*} K_x= \left[ \begin{array}{ccc} -1& 0 & 1 \\ -2& 0 & 2 \\ -1& 0 & 1 \\ \end{array} \right], K_y= \left[ \begin{array}{ccc} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \\ \end{array} \right] \end{eqnarray*}

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

【計算例】例題

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

(4)   \begin{eqnarray*} I= \left[ \begin{array}{ccccc} 0 & 0 & 0 &  0\\ 0& 10 & 10 &  0\\ 0&   0 & 10 &  0\\ 0 & 0 & 0 &  0\\ \end{array} \right], K= \left[ \begin{array}{ccccc} -1 & -2 & -1\\ 0 & 0  & 0\\ 1 & 2  & 1\\ \end{array} \right] \end{eqnarray*}

解説

入力画像IとカーネルK畳み込み演算してやると

(5)   \begin{eqnarray*} 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\\ \end{eqnarray*}

となります。今回、入力画像の端の画素値は0とします。
また、0未満の画素値は0とします。

すると、出力画像I'は次のようになります。

(6)   \begin{eqnarray*} I'= \left[ \begin{array}{ccccc} 0 & 0 & 0 &  0\\ 0& 10 & 20 &  0\\ 0& 0 & 0 &  0\\ 0 & 0 & 0 &  0\\ \end{array} \right] \end{eqnarray*}

プログラミングで実装

プログラミングによる実装例について下記に整理しました。

言語 解説記事
Python 【Python/OpenCV】ソーベルフィルタでぼかし・平滑化
C# 【C#】ソーベルフィルタで画像のぼかし(ノイズ除去)
まとめ 【画像処理入門】アルゴリズム&プログラミング

コメント