【画像処理】プレヴィットフィルタの原理・特徴・計算式

画像処理におけるPrewitt(プレヴィット)フィルタの原理や特徴、計算式についてまとめました。

【はじめに】Prewitt(プレヴィット)フィルタとは

Prewitt(プレヴィット)は、画像から輪郭を抽出する空間フィルタの1つです。
このフィルタは、同様に輪郭検出を行う一次微分フィルタをノイズの影響を受けにくいように、平滑化処理を加えて改良したものです。
※プレヴィットフィルタを更に改良したものとしてソーベルフィルタ(Sobel filter)というものもあります。

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

出力画像(フィルタを掛けた後)を見ると、輪郭の部分が白くなっている、つまり画素値が大きいことがわかります。

【カーネル】プレヴィットフィルタ

前回の記事「【画像処理】一次微分フィルタの原理・特徴・計算式」では、一次微分フィルタについて紹介しました。
一次微分フィルタにおける、水平方向微分のカーネルK_x、および垂直方向微分のカーネルK_yは次の通りです(8近傍の場合)。

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

一次微分フィルタのカーネルに単純な平滑化処理(ぼかし)を加えると、次のようになります。

(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*}

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

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

(3)   \begin{eqnarray*} I'(x, y) = \sqrt{I_{x}(x, y)^2 + I_{y}(x, y)^2} \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 & -1 & -1\\ 0 & 0  & 0\\ 1 & 1  & 1\\ \end{array} \right] \end{eqnarray*}

解説

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

(5)   \begin{eqnarray*} I'(1,1)&=&1\cdot 10=10\\ I'(2,1)&=&1\cdot 10=10\\ I'(1,2)&=&(-1\cdot 10)+(-1\cdot 10)=-20\\ I'(2,2)&=&(-1\cdot 10)+(-1\cdot 10)=-20\\ \end{eqnarray*}

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

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

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

言語 解説記事
Python 【Python/OpenCV】プレヴィットフィルタで輪郭検出
C# 【C#】プレヴィットフィルタで輪郭検出
まとめ 【画像処理入門】アルゴリズム&プログラミング

コメント