【入門】微分フィルタ【数値計算】

【入門】微分フィルタ【数値計算】 数値計算
【入門】微分フィルタ【数値計算】

Sobelフィルタの課題

Sobelフィルタに限らずだが、そのままこのフィルタを使用すると少し問題がある。
それを一つずつ認識&解決していく。

使用する画像は恒例の、犬と自転車。
ちなみに、Sobelフィルタをする前にグレースケールにしているものとする。

犬と自転車

そのままSobelフィルタを使用すると?

まず、単純にそのままSobelフィルタで畳み込みをしている。
以下の結果になる。

そのままSobelフィルタ

一応、エッジ検出出来ているようには見える。
が、異様に暗い。
つまり、エッジ検出出来ているところと出来ていないところがある。

これは負の勾配に差し掛かった時に演算結果がマイナスになるため。
それが0にサチって結果エッジが検出出来てない感じになる。

対策としては、abs関数でも挟めばOK。

abs関数を入れた結果

そして、その結果が以下。

absを入れたSobelフィルタ

だいぶいい感じになったが、
横方向のエッジが検出されていないように見える。

これはSobelフィルタの向きが起因しているな。
転置したもので再度試してみよう。

\(
K_{sbl}^T=
\begin{bmatrix}
-1 & 0 & 1 \\
-2 & 0 & 2 \\
-1 & 0 & 1 \\
\end{bmatrix}^T=
\begin{bmatrix}
-1 & -2 & -1 \\
0 & 0 & 0 \\
1 & 2 & 1 \\
\end{bmatrix}
\)

absを入れて転置したSobelフィルタ

横方向のエッジは拾えてるけど、今度は縦方向のエッジが居なくなった。
横方向のエッジ検出カーネルなので、当然の結果ではある。

最終的なSobelフィルタ

先の結果より、縦方向、横方向のどちらかのエッジ検出しかできない状態になっている。
これは、両方のエッジ検出を合成すればOK。

合成の仕方は以下になる。

\(
G_s=\sqrt{G_{sx}^2+G_{sy}^2}
\)

\(G_{sx}\)が縦方向のエッジ検出のSobelフィルタの結果で、
\(G_{sy}\)が横方向のエッジ検出のSobelフィルタの結果になる。

それぞれをベクトルと捉えて、それらを合成したノルムをエッジというスカラ値にする感じ。
結果としては以下になる。

合成したSobelフィルタ

これで、エッジ検出出来ていると言って良いだろう。
まだ、いろいろあると言えばあるが、
現時点ではここまでだろう。

実験手順について

実験の手順について説明しておく。
以下の手順を想定している。

  • 画像の読み込み
  • ガウシアンフィルタ用のカーネル用意
  • Sobelフィルタ用のカーネル用意
  • SDTVグレースケール化実施
  • ガウシアンフィルタ実施
  • Sobelフィルタ実施
  • 各Sobelフィルタの結果の合成
  • 画像の書き出し

手順についてあれこれ。

事前にガウシアンフィルタを掛けている。
正直無くても良い処理ではあるが、割ととりあえず入れておくということは多い。
不要ならば消せば良いので、処理としては入れておく。

あとは前回までで説明したSobelフィルタ関連の処理が並んでいるだけになる。
注意点としては、縦方向のエッジ検出と横法のエッジ検出をした上で合成する。
ってところ。

というわけで、今度こそ、次回からは実際に実験開始。

まとめ

  • エッジ検出について説明。
  • 各種微分フィルタについて説明。
  • Sobelフィルタを元にいろいろ課題認識&対策実施。
  • 実験手順を説明。

MATLAB、Python、Scilab、Julia比較ページはこちら

コメント

タイトルとURLをコピーしました