Sobelフィルタの課題
Sobelフィルタに限らずだが、そのままこのフィルタを使用すると少し問題がある。
それを一つずつ認識&解決していく。
使用する画像は恒例の、犬と自転車。
ちなみに、Sobelフィルタをする前にグレースケールにしているものとする。
そのままSobelフィルタを使用すると?
まず、単純にそのままSobelフィルタで畳み込みをしている。
以下の結果になる。
一応、エッジ検出出来ているようには見える。
が、異様に暗い。
つまり、エッジ検出出来ているところと出来ていないところがある。
これは負の勾配に差し掛かった時に演算結果がマイナスになるため。
それが0にサチって結果エッジが検出出来てない感じになる。
対策としては、abs関数でも挟めばOK。
abs関数を入れた結果
そして、その結果が以下。
だいぶいい感じになったが、
横方向のエッジが検出されていないように見える。
これは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}
\)
横方向のエッジは拾えてるけど、今度は縦方向のエッジが居なくなった。
横方向のエッジ検出カーネルなので、当然の結果ではある。
最終的なSobelフィルタ
先の結果より、縦方向、横方向のどちらかのエッジ検出しかできない状態になっている。
これは、両方のエッジ検出を合成すればOK。
合成の仕方は以下になる。
\(
G_s=\sqrt{G_{sx}^2+G_{sy}^2}
\)
\(G_{sx}\)が縦方向のエッジ検出のSobelフィルタの結果で、
\(G_{sy}\)が横方向のエッジ検出のSobelフィルタの結果になる。
それぞれをベクトルと捉えて、それらを合成したノルムをエッジというスカラ値にする感じ。
結果としては以下になる。
これで、エッジ検出出来ていると言って良いだろう。
まだ、いろいろあると言えばあるが、
現時点ではここまでだろう。
実験手順について
実験の手順について説明しておく。
以下の手順を想定している。
- 画像の読み込み
- ガウシアンフィルタ用のカーネル用意
- Sobelフィルタ用のカーネル用意
- SDTVグレースケール化実施
- ガウシアンフィルタ実施
- Sobelフィルタ実施
- 各Sobelフィルタの結果の合成
- 画像の書き出し
手順についてあれこれ。
事前にガウシアンフィルタを掛けている。
正直無くても良い処理ではあるが、割ととりあえず入れておくということは多い。
不要ならば消せば良いので、処理としては入れておく。
あとは前回までで説明したSobelフィルタ関連の処理が並んでいるだけになる。
注意点としては、縦方向のエッジ検出と横法のエッジ検出をした上で合成する。
ってところ。
というわけで、今度こそ、次回からは実際に実験開始。
まとめ
- エッジ検出について説明。
- 各種微分フィルタについて説明。
- Sobelフィルタを元にいろいろ課題認識&対策実施。
- 実験手順を説明。
MATLAB、Python、Scilab、Julia比較ページはこちら
社会のなかの数理 [新装版]──行列とベクトル入門──
なっとくする演習 行列・ベクトル なっとくする演習・行列 ベクトル (なっとくシリーズ)
ゼロからはじめるPID制御
基礎からわかる時系列分析―Rで実践するカルマンフィルタ・MCMC・粒子フィルタ― Data Science Library
観測と最小二乗法―測量・G空間データの解析
ディジタル画像処理[改訂第二版]
高校数学でわかるフーリエ変換―フーリエ級数からラプラス変換まで (ブルーバックス)
マンガでわかるフーリエ解析
入門信号処理のための数学―離散フーリエ変換・離散コサイン変換
はじめて学ぶディジタル・フィルタと高速フ-リエ変換: 基礎・原理からよく理解するための (ディジタル信号処理シリーズ)
コメント