end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

画像処理 - エッジ抽出フィルタ(sobel, prewitt)と、平滑化フィルタ(gaussian)

先日のHarrisコーナー検出から、SIFT特徴量へ移りたかったのですが、 画像の微分ガウス関数を理解できていないようなので、寄り道。

参考URL

前処理フィルタについて | 画像処理.com | キーエンス

【画像処理】ガウシアンフィルタの原理・特徴・計算式

フィルタの種類

名称 目的 備考
ソーベル(sobel) エッジ抽出 ※1
プレヴィット(prewitt) エッジ抽出
ガウシアン(gaussian) 平滑化

※1 中央画素に2がかかる為、 コントラストの少ないエッジを強調できるがノイズも拾う

エッジ抽出における微分(離散近似)

グレースケール画像 I の明度変化は、x, y方向の微分係数 Ix,Iy で表し、 画像勾配は次のようになります。

 \Large
\nabla I = \left( \begin{array}{c} I_x \\\ I_y  \end{array} \right)
= ( I_x I_y )^T

 \nabla はナブラ、Tは転置 です

画像の微分には、次のような離散近似を行うようです。

 \Large
I_x = I * D_x  I_y = I * D_y  

上記「Dx」「Dy」の代表的なフィルタが、sobel と prewitt で、 「*」は畳込みを表します。

ソーベルとプレヴィットのフィルタ

ソーベルフィルタ(Dx, Dy)


D_x =
\left[ \begin{array}{ccc}
Dx_{11} &  Dx_{21} &  Dx_{31} \\\
Dx_{12} &  Dx_{22} &  Dx_{32} \\\
Dx_{13} &  Dx_{23} &  Dx_{33} 
\end{array} \right]
=
\left[ \begin{array}{ccc}
-1 & 0 & 1 \\\
-2 & 0 & 2 \\\
-1 & 0 & 1
\end{array} \right]

D_y =
\left[ \begin{array}{ccc}
Dy_{11} &  Dy_{21} &  Dy_{31} \\\
Dy_{12} &  Dy_{22} &  Dy_{32} \\\
Dy_{13} &  Dy_{23} &  Dy_{33} 
\end{array} \right]
=
\left[ \begin{array}{ccc}
-1 & -2 & -1 \\\
 0 &  0 &  0 \\\
 1 &  2 &  1
\end{array} \right]

プレヴィット(Dx, Dy)


D_x =
\left[ \begin{array}{ccc}
Dx_{11} &  Dx_{21} &  Dx_{31} \\\
Dx_{12} &  Dx_{22} &  Dx_{32} \\\
Dx_{13} &  Dx_{23} &  Dx_{33} 
\end{array} \right]
=
\left[ \begin{array}{ccc}
-1 & 0 & 1 \\\
-1 & 0 & 1 \\\
-1 & 0 & 1
\end{array} \right]

D_y =
\left[ \begin{array}{ccc}
Dy_{11} &  Dy_{21} &  Dy_{31} \\\
Dy_{12} &  Dy_{22} &  Dy_{32} \\\
Dy_{13} &  Dy_{23} &  Dy_{33} 
\end{array} \right]
=
\left[ \begin{array}{ccc}
-1 & -1 & -1 \\\
 0 &  0 &  0 \\\
 1 &  1 &  1
\end{array} \right]

ソーベルによる畳込み演算の例

「畳込み」とは、 9画素それぞれに上記Dx, Dyなの係数をかけ、合算 した濃度値に置き換えることです。


I =
\left[ \begin{array}{cccc}
I_{11} &  I_{21} &  I_{31} & I_{41} \\\
I_{12} &  I_{22} &  I_{32} & I_{42} \\\
I_{13} &  I_{23} &  I_{33} & I_{43} \\\
I_{14} &  I_{24} &  I_{34} & I_{44}
\end{array} \right]
=
\left[ \begin{array}{cccc}
0 &  0 &  0 & 0 \\\
0 & 10 & 10 & 0 \\\
0 &  0 & 10 & 0 \\\
0 &  0 &  0 & 0
\end{array} \right]

例えば、上記画像Iのある画素に対するIxをソーベルフィルタで算出します。


Ix_{22} \\\
= (I_{11} Dx_{11}) + (I_{21} Dx_{21}) + (I_{31} Dx_{31})\\\
+ (I_{12} Dx_{12}) + (I_{22} Dx_{22}) + (I_{32} Dx_{32})\\\
+ (I_{13} Dx_{13}) + (I_{23} Dx_{23}) + (I_{33} Dx_{33}) \\\
= (0 \cdot -1) + (0 \cdot  0) + ( 0 \cdot 1) \\\
+ (0 \cdot -2) + (10 \cdot 0) + (10 \cdot 2) \\\
+ (0 \cdot -1) + (0 \cdot  0) + (10 \cdot 1) \\\
= 30

平滑化を行うガウシアン(gaussian)フィルタ

ガウシアンフィルタでは、以下のガウス分布を使用しますが、 畳込み?を使用する面では、先程のソーベル等と同様です。

 \Large
g(x,y,\sigma) =
\frac{1}{ \sqrt{2 \pi} \sigma }
exp ( \frac{x^2+y^2}{2 \sigma^2})

例えば、 g(x,y,\sigma) 標準偏差σ=1.3の場合、


K =
\Large{ \frac{1}{16} }
\left[ \begin{array}{ccc}
 1 & 2 & 1 \\\
 2 & 4 & 2 \\\
 1 & 2 & 1
\end{array} \right]

となりますし、更に大きな標準偏差の場合


K =
\Large{ \frac{1}{256} }
\left[ \begin{array}{ccccc}
1 &  4 &  6 &  4 & 1 \\\
4 & 16 & 24 & 16 & 4 \\\
6 & 24 & 36 & 24 & 6 \\\
4 & 16 & 24 & 16 & 4 \\\
1 &  4 &  6 &  4 & 1
\end{array} \right]

となり、平滑化の効果が大きくなります。