画像処理における空間フィルタリングと畳み込み演算の計算方法についてまとめました。
空間フィルタリングとは
本ページの内容は以下動画で解説しています。
空間フィルタリング (Spatial filtering) とは、入力画像の注目する画素値だけでなく、その近傍(周囲)にある画素値も利用し、出力画像の画素値を計算する処理です。
この計算のことを畳み込み演算、もしくはマスク演算といいます。
空間フィルタリングを利用することで、例えば、以下のように画像から輪郭だけを取り出すことができます。
■入力画像(左)と出力画像(右)
畳み込み演算の計算方法
空間フィルタリングでは、畳み込み演算により出力画像を求めます。
例えば、入力画像とカーネルが次のように与えられたします。
(1)
このとき、出力画像の端以外の画素値は次のように計算します。
(2)
■注目画素について
(3)
■注目画素について
(4)
■注目画素について
(5)
■注目画素について
(6)
- カーネルのサイズ
- 近傍の画素数(なら8近傍)
- カーネルの要素
- 近傍にある画素の重み(目的や用途に応じて変える)
端の画素の処理
入力画像の端の画素を注目画素とした時は、近傍の画素数が不足します。
例えば、に隣接する画素は, , の3つしかありません。
その場合の処理方法は特に定義されていないため、自分で定義します。
色々なやり方が考えられますが、簡単化のため今回は次のように処理します。
- 輪郭抽出に使う場合
- 出力画像の端の画素値は全て0にする
- 平滑化処理に使う場合
- 出入力画像の画素値をそのまま出力画像の画素値にする
畳み込み演算の計算式
カーネルサイズがの場合、畳み込み演算の計算を定式化すると次のようになります。
(7)
畳み込み演算の計算例
入力画像とカーネルが次のように与えられたとき、出力画像を求めよ。
(8)
解説
入力画像とカーネルを畳み込み演算してやると
(9)
(10)
(11)
(12)
となります。今回、端の画素値は全て0にすることにします。
(13)
すると、出力画像は次のようになります。
(14)
関連ページ
PythonとOpenCVを用いて空間フィルタリングを実装する方法について以下ページで解説しています。
PythonとOpenCVを用いた画像処理全般については以下ページで解説しています。
他の画像処理アルゴリズムについては、以下ページでまとめています。
コメント