プレヴィットフィルタの原理・特徴・計算式

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

Prewittフィルタとは

Prewitt filter(プレヴィットフィルタ)は、画像から輪郭を抽出する空間フィルタの1つです。
このフィルタは、前回解説した「一次微分フィルタ」に対して、平滑化処理を加えることでノイズの影響を受けにくいのが特徴です。ちなみに、プレヴィットフィルタを更に改良したものとしてソーベルフィルタ(Sobel filter)というものもあります。

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

出力画像を見ると、輪郭の部分が白くなっています。
出力画像の白い部分は、画素値が大きい、つまり一次微分を計算したときに画素値の変化が大きいところとなります。
(例:背景とヘルメットの境界など)

解説動画

Prewittフィルタのカーネル

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

$$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]$$

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

$$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]$$

これがプレヴィットフィルタのカーネルとなります。一次微分フィルタよりも広い領域に対して重み付けを行うことで、ノイズが平均化されるため、結果的にノイズの影響が軽減されます。水平方向微分では縦方向の輪郭を取り出すことができます。逆に、垂直方向微分では横方向の輪郭を取り出します。入力画像$I$とカーネル$K_x$および$K_y$を使用して、輪郭検出を行います。垂直方向および水平方向の輪郭画像$I_x(x, y)$および$I_y(x, y)$は次のように計算されます。

$$I_x(x, y) = I(x, y) \ast K_x\\ I_y(x, y) = I(x, y) \ast K_y$$

ここで、$\ast$は畳み込み演算を示します。

最後に、縦方向に検出された輪郭画像の画素値を$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], K= \left[ \begin{array}{cccc} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{array} \right]$$

解説

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

$$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$$

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

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

関連ページ

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

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

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

コメント