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