MATLAB,Python,Scilab,Julia比較 第3章 その30【微分フィルタ⑥】

MATLAB,Python,Scilab,Julia比較 第3章 その30【微分フィルタ⑥】 数値計算
MATLAB,Python,Scilab,Julia比較 第3章 その30【微分フィルタ⑥】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/

はじめに

畳み込み演算の微分フィルタの話。
Sobelフィルタについて解説。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

Sobelフィルタ【再掲】

太郎くん
太郎くん

Sobelフィルタと使うんだけど、なんか課題があるんだっけ?

フクさん
フクさん

そうそう。
そこをまずは確認って感じだ。

フクさん
フクさん

まず、Sobelフィルタを再掲しておこう。

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

フクさん
フクさん

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

犬と自転車

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

フクさん
フクさん

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

そのままSobelフィルタ
太郎くん
太郎くん

お!なんかエッジ検出できてる?!

太郎くん
太郎くん

でも、なんか異様に暗いな。
エッジも検出出来てるところと出来てないところがあるような気がする。

フクさん
フクさん

正解。

フクさん
フクさん

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

太郎くん
太郎くん

どうするの?!

フクさん
フクさん

まぁ普通にabs関数でも挟めば解決だ。

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フィルタ

フクさん
フクさん

縦方向のエッジ検出、横方向のエッジ検出、
これらを合成すれば解決だ。

太郎くん
太郎くん

どうやって合成するの?

フクさん
フクさん

以下な感じで合成する。

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

太郎くん
太郎くん

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

フクさん
フクさん

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

合成したSobelフィルタ
太郎くん
太郎くん

おーー!!
完璧にエッジ検出できたんじゃん!?

フクさん
フクさん

うむ。
現時点ではここまでだろうな。

太郎くん
太郎くん

(現時点では?ここまで?まだなんかあるんか?)

今後の予定

フクさん
フクさん

というわけで、これを各ツール、各言語で試していく。

太郎くん
太郎くん

まぁ、エッジ検出できそうな方式は定まったしね。

まとめ

フクさん
フクさん

まとめだよ。

  • 単純にSobelフィルタのカーネルで畳み込みをしても期待する結果にならない。
    • マイナス値がでるので、絶対値なり二乗なりで対処する必要あり。
    • 横方向、縦方向のエッジしか検知できないので、合成する。

バックナンバーはこちら。

コメント

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