【入門】非極大値抑制【数値計算】

【入門】非極大値抑制【数値計算】 数値計算
【入門】非極大値抑制【数値計算】

MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/

はじめに

の、
MATLAB,Python,Scilab,Julia比較 第3章 その36【非極大値抑制①】
MATLAB,Python,Scilab,Julia比較 第3章 その37【非極大値抑制②】
MATLAB,Python,Scilab,Julia比較 第3章 その38【非極大値抑制③】
MATLAB,Python,Scilab,Julia比較 第3章 その39【非極大値抑制④】
MATLAB,Python,Scilab,Julia比較 第3章 その40【非極大値抑制⑤】

を書き直したもの。

非極大値抑制なるものの説明を以下の流れで説明。

  • 非極大値抑制の大雑把な雰囲気
  • 2次元平面に実施する場合の考え方
  • 勾配の特定方法
  • 斜面の方向パターン

エッジ検出をもっとシビアに!

前回までの話で、Sobelフィルタを用いてエッジ検出ができるわかったと思う。

が、
エッジの白い線が、細かったり、太かったりとマチマチ。
これは微分した結果なので当然と言えば当然。
実際は純粋な一本線みたいな感じで検出できる方が理想的ではある。

では、実際にそのようなことが可能なのか?

結論としては可能。
しかも、やることとしてはそれほど難しくはない。
(若干、理屈がややこしいとかはあるかもしれないが)

どうなっていたら良いのか。

実際どうなるかを先に説明しておく。

元画像

犬と自転車

Sobelフィルタ実施

合成したSobelフィルタ

某処理実施

犬と自転車(某処理実施)

こんな感じで一本線、というかエッジが1ピクセルの幅で表現される。

何をしたのか?

これは非極大値抑制という処理を施したもの。
Non-maximum suppressionとも呼ばれる。

YOLOのような物体検出器でも同様の用語が出てくるが、それとは別物
物体検出器の方は複数のバウンディングボックス候補のうち最も正しいものだけを残す機能。
広義で同一の概念とは言えるかもしれないが。

機能も名前の通りで、
極大値じゃないものを抑制」する。
つまり、極大値だけをピンポイントで残す手法になる。

この手法については以下の順番で説明していく。

  • 非極大値抑制の大雑把な雰囲気
  • 2次元平面に実施する場合の考え方
  • 勾配の特定方法
  • 斜面の方向パターン

非極大値抑制の大雑把な雰囲気

名称からおおよそのイメージはできているかもしれないが、
一応、図解しておく。

非極大値抑制の大雑把な雰囲気、最も急勾配なところだけを検知したい、最も急勾配なところだけを検知したい、こんな画素配置があるとして、微分して、絶対値化して極大値だけを検知して、極大値以外を0値に、微分の絶対値化まではSobelフィルタで実現できている。

実は、上から3段目のところまではSobelフィルタで実現済み。
よって、最後の1段を実現すればOK。
つまり、Sobelフィルタだけでいいところまでは来てる。

2次元平面に実施する場合の考え方

と、まぁ、1次元でみるとシンプルは話ではあるのだが、
画像自体は2次元平面。
もう少し考える必要がある。

これも簡単に図解しておく。

2次元平面に実施する場合の考え方、黒線が画像上の推定境界線(極大値)、こっち(垂直方向)から見た微分で評価したい、こっち(斜め左上右下方向)から見た微分で評価したい、こっち(水平方向)から見た微分で評価したい、こっち(斜め左下右上方向)から見た微分で評価したい

つまり、いろんな方向から見た極大値を特定しないといけない。

極大値を特定して、そこだけ残すってのも複雑な処理になりそうだし、
斜めから見るべき場所の判定とかかなり面倒そうに感じる。

が、
そこは、Sobelフィルタの途中過程の情報を使うと解決できたりする。

次のページへ

コメント

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