こんにちは!zhackです。
今日は、いろんな空間フィルタリングをやっていきます。
先日のプログラムの大半を変えることなく、変数の値を変えるだけでいろんな画像処理ができます!
ちなみに、空間フィルタリングに関する解説記事もございますので、そちらもよろしければご参考ください。
前提
実行環境
今回の実行環境は以下の通りです。
- Debian GNU/Linux8
※Dockerコンテナで環境構築
プログラム名称:smoothing.go
- 実行コマンド
$ go run filtering.go < 入力画像のパス > 出力画像のパス
- Gitにも掲載しています。ご参考まで。
Dockerのインストール方法やGo言語の環境構築については、以下の記事を参考ください。
プログラムの説明
プログラムは基本的に、【画像処理】Go言語で平滑化処理【サンプルコード付】で紹介した、filter変数の中身を入れ替えたものを利用します。
どのように入れ替えるかは、各処理ごとに異なるので、各処理の説明のところで紹介します。
ちなみに、先ほどの平滑化処理の記事の中で定義しているfilter変数は以下のように定義していましたね。
filter := []float64{1/9.0,1/9.0,1/9.0,1/9.0,1/9.0,1/9.0,1/9.0,1/9.0,1/9.0}
ちなみに、余談ですが、このfloat64で定義した変数について。
1/9.0としていますよね。
1/9にすると、せっかくfloatで定義した変数を整数同士の計算で初期化してしまうと、整数の値が入ってしまいます。
つまり、 1/9 = 0.11111…と入ってほしい値が、0になってしまいます。
ご注意を,,(私はここで1時間ほど詰まりました、、、つらみ。)
平滑化処理
平均化フィルタ
これは、以下の記事でもご紹介しました、注目画素と8近傍の画素の平均をとる処理ですね。
フィルタ
filter := []float64{1/9.0, 1/9.0 ,1/9.0, 1/9.0, 1/9.0, 1/9.0, 1/9.0, 1/9.0, 1/9.0}
入力画像と出力画像
ガウシアンフィルタ
注目画素や付近の画素の重みを大きく、遠くの画素の重みを小さく設定したフィルタです。
一般的に隣の画素等近い画素は、値として近い画素値をとることを考慮され設計されています。
フィルタ
filter := []float64{1/16.0, 2/16.0, 1/16.0, 2/16.0, 4/16.0, 2/16.0, 1/16.0, 2/16.0, 1/9.0}
入力画像と出力画像
入力画像の防止の紫色のもじゃもじゃ(?)部分を比較すると、毛の細かさが失われていますね。
輪郭抽出(エッジ検出)出
微分処理
こちらは、以下の記事で紹介しましたね。
フィルタだけ、書くとこんな感じです。
// X方向 filter := []float64{0.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0, 0.0, 0.0} // Y方向 filter := []float64{0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}
プリューウィット(Prewitt)フィルタ
微分フィルタに、ノイズ除去のために平均化機能も加えたフィルタです。
フィルタ
// X方向 filter := []float64{-1.0, 0.0 ,1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0} // Y方向 filter := []float64{-1.0, -1.0 ,-1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0}
入力画像と出力画像
ソーベル(Sobel)フィルタ
プリューウィットとは異なり、ノイズ除去のためにガウシアンフィルタを適用したフィルタです。
フィルタ
// X方向 filter := []float64{-1.0, 0.0 ,1.0, -2.0, 0.0, 2.0, -1.0, 0.0, 1.0} // Y方向 filter := []float64{-1.0, -2.0 ,-1.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0}
入力画像と出力画像
ラプラシアンフィルタ
さいごに、ラプラシアンフィルタについて紹介します。
これは、二次微分を行うことで、輪郭を抽出する処理ですね。
数式を書くと難しくなってしまいますが、フィルタはいたってシンプルです。
フィルタ
・輪郭だけ抽出する場合
filter := []float64{1/16.0, 2/16.0, 1/16.0, 2/16.0, 4/16.0, 2/16.0, 1/16.0, 2/16.0, 1/9.0}
入力画像と出力画像
おまけ
平滑化処理の重要性を示すために、ガウシアンフィルタをかけた後、輪郭抽出としてラプラシアンフィルタをかけてみました。
ノイズを除去したことで、抽出されている輪郭が少なくなっていますよね。
平滑化処理を行わなかった場合と比較するとこんな感じ。
さいごに
空間フィルタリング処理はいかがでしょうか。
画像として結果が目に見えると楽しいですね~~
今回は、空間フィルタリング処理をざぁーっとまとめてみました。
この表現がわかりにくかった!等がございましたら、コメントください。
また、空間フィルタリング以外の画像処理についても記事にしていますので、よろしければご参考ください。
ではでは!
コメント
[…] […]