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


コメント