Ayataの

社会人カジュアルゲーマーのゲームブログです

【Pythonでエッジ処理】理論と実装の勉強

前回はPythonOpenCVの環境構築と画像の読み込みまで行いました。
ayatalog.hatenablog.jp

今回からPythonでエッジ処理の理論と実装について勉強していきたいと思います。
初心者が勉強したまとめ記事なので間違い等あると思いますがご容赦ください。
間違いや改善すべき箇所を見つけたらコメントしていただけると幸いです。

目次


1. エッジ処理の分類

エッジ検出には一次微分を用いる勾配法と二次微分を用いるラプラシアン法の大きく分けて2種類あります。
下図は一次元とした場合のステップエッジとその微分です。左から、ステップエッジ、ステップエッジの一次微分、ステップエッジの二次微分になっています。下図では、入力画像の位置xにおける輝度値をI(x)としています。
f:id:Ayata:20210212135218p:plain

2. ステップエッジ

物体のふちを捉えることがエッジ検出ですが、ここでは上図にあるように、輝度値の急激な変化をエッジとして扱っていきます。

3. 一次微分

I(x)が連続していると考えると、I(x)の一次微分I'(x)は以下の式で表せます。
f:id:Ayata:20210212135823p:plain:w300 しかし入力画像は離散系であるため、まず一次元の離散系でΔx→-1として考えます。すると微分を単なる差分として計算できます。エッジがある点では、I(x)-I(x-1)あるいはI-I(x+1)が大きくなりしきい値を超えたときにエッジとして判定可能です。

二次元に拡張すると輝度値はI(x,y)と表され、x,y方向それぞれに以下のように微分値が求められます。
f:id:Ayata:20210217163716p:plain:w550 x,y方向のエッジを評価するために、エッジの強度を導入します。 f:id:Ayata:20210212140835p:plain:w250 これにより、ある点(x,y)でのエッジの判断は、|G(x,y)|が設定したしきい値を超えるかどうかで判別できます。
これだけだと単純にエッジかどうかの情報しかないため、エッジの方向を導入します。エッジの方向は以下の式で計算でき、これはI'yかI'xの大きいほうに傾きます。例えばI'y=1, I'x=1ならθ=45, I'y=0,I'x=1なら0になります。
f:id:Ayata:20210212162545p:plain:w150

4. 二次微分

二次微分では、各方向(x,y)の二次微分を求めて、ゼロクロッシングをエッジとして検出します。各方向の二次微分は以下の式で表されます。
f:id:Ayata:20210212162246p:plain:w500 二次微分値が0となる点を探し、それらのうちマイナスからプラスへ、あるいはプラスからマイナスへ変化しているものを探します。

まとめ

今回は数式だけみてエッジ検出の一次微分と2次微分の概要を追いました。
これらの実装では行列を用いて演算を行っていたり、ノイズ耐性を上げるためにフィルタ処理をしています(ブリューウィット法、ソーベル法、キャニー法、ラプラシアン・ガウシアン法など)。それらについては実装する段階で勉強していきたいと思います。