Ayataの

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

【Pythonでエッジ処理】空間フィルタリングの勉強

前回は横方向・縦方向それぞれのエッジを検出する簡単なプログラムを作成しました。

ayatalog.hatenablog.jp

今回は縦と横方向のエッジを検出するプログラムを作るために、画像フィルタリングを勉強していきます。


1. 空間フィルタリングの概要

空間フィルタリングは、画像の全体にフィルタをかけることによって何らかの効果を得るものです。例えば、今回実装するエッジや、そのほか平滑化や動きのフィルタリングなど様々なものがあります。
いま、3×3の大きさのフィルタ(カーネルやオペレータとも呼ばれる)を適用する場合を考えます。
空間フィルタリングでは、入力画像の注目画素とその周囲の画素とフィルタを演算し、新たな画素値を出力します。以下の例だと、入力画像I(x,y)中の注目画素(x,y)とその周囲の3×3の領域と、3×3のフィルタW(i,j)の各要素の積和を取っています。演算の結果、注目画素(x,y)は f:id:Ayata:20210217151806p:plain に置き換わります。
f:id:Ayata:20210217151917p:plain:w450

2. 空間フィルタリングの演算

上の例ではフィルタの大きさを3×3としましたが、任意の大きさNとして入力画像に空間フィルタリングをする際の数式を見ていきます。
入力画像をI(x,y)中の注目画素(x,y)に対する積和演算を数式で表現すると、以下のようになります。
f:id:Ayata:20210208205450p:plain:w450 (2N-1)×(2N-1)は近傍領域の大きさ(上の例の場合N=1で3×3になる)、W(i,j)はフィルタ、I'(x,y)は出力される画像です。
この式より、フィルタW(i,j)を変更するだけで様々な空間フィルタリングを行うことが可能であることがわかります。

3. 一次微分を用いたエッジ処理のフィルタ

次に一次微分を用いたエッジ処理のおけるフィルタがどうなるのか見ていきます。
前々回のエッジ検出の理論の勉強【【Pythonでエッジ処理】理論と実装の勉強 - Ayataの】 で、画像の位置(x,y)における輝度値f(x,y)のx,y方向の微分は以下のように求められました。
f:id:Ayata:20210217163716p:plain:w550 これをフィルタ化すると、x方向の場合はf(x,y)とf(x-1,y)の引き算、y方向の場合はf(x,y)とf(x,y-1)の引き算となっているため、以下のようになります。
f:id:Ayata:20210202231229p:plain:w450 このフィルタを用いて、積和の演算を行うことでx方向とy方向の一次微分が求められます。

まとめ

今回は空間フィルタリングの概要を学習しました。
次回は空間フィルタリングを適用した場合のフィルタ処理を実装しようと思います。