ロバーツフィルタの原理・特徴・計算式

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

ロバーツフィルタとは

ロバーツフィルタ(Roberts filter)は、画像の輪郭検出に用いられる空間フィルタの1つです。一次微分フィルタの1種ですが、斜め方向の微分を求めますのが特徴的です。つまり、斜めの輪郭を検出することができます。

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

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

ロバーツフィルタのカーネルと計算式

注目画素$I(x, y)$と周囲の画素値について考えます。

$$ I=\begin{bmatrix}I(x-1, y-1) & I(x, y-1) & I(x+1, y-1) \\ I(x-1, y) & I(x, y) & I(x+1, y) \\ I(x-1, y+1) & I(x, y+1) & I(x+1, y+1)\end{bmatrix} \quad $$

注目画素$I(x, y)$の水平方向微分$I_{x}(x, y)$を計算する際、「注目画素」から「注目画素の右下にある画素」を引きます(正確には、「右斜下方向微分」となります)。

$$ I_{x}(x, y)=I(x,y)-I(x+1, y+1) $$

また、垂直方向微分$I_{y}(x, y)$は「注目画素の1つ右の画素」から「注目画素の1つ下にある画素」を引きます(正確には、「左斜下方向微分」となります)。

$$ I_{x}(x, y)=I(x+1,y)-I(x, y+1) $$

よって、ロバーツフィルタの水平方向微分のカーネル$K_x$、および垂直方向微分のカーネル$K_y$は次の通りです。

$$K_x = \left[ \begin{array}{ccc} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{array} \right], \quad K_y = \left[ \begin{array}{ccc} 0 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & -1 & 0\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$は畳み込み演算を示します。なお、カーネル$K_x$は左斜方向の輪郭を取り出すことができます。反対に、垂直方向微分のカーネル$K_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}{ccc} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{array} \right]$$

解説

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

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

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

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

関連ページ

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

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

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

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

コメント