画像処理におけるソーベルフィルタ(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]$$
関連ページ
プログラミングによる実装例について以下ページで解説しています。


コメント