【画像処理】Go言語で空間フィルタリングいろいろやってみた【サンプルコード付】

golang

こんにちは!zhackです。

今日は、いろんな空間フィルタリングをやっていきます。

先日のプログラムの大半を変えることなく、変数の値を変えるだけでいろんな画像処理ができます!

ちなみに、空間フィルタリングに関する解説記事もございますので、そちらもよろしければご参考ください。

【画像処理】空間フィルタリングとは?
こんにちは!zhackです。 今回は画像処理でよく使われる空間フィルタリングについて、紹介します! 空間フィルタリングとは? 画像中の注目しているある画像に対して、注目している画素とその周囲の画素から、注目している画素を変換する処...

前提

実行環境

今回の実行環境は以下の通りです。

  • Debian GNU/Linux8
    ※Dockerコンテナで環境構築
    プログラム名称:smoothing.go
  • 実行コマンド
    $ go run filtering.go < 入力画像のパス > 出力画像のパス
  • Gitにも掲載しています。ご参考まで。

Dockerのインストール方法やGo言語の環境構築については、以下の記事を参考ください。

画像付き:Dockerのインストール手順(Windows OS)
zhack(私)が実際に行ったDockerのWindowsOSへのインストール手順です。インストールなしで試してみたい方向けにPlay with Dockerの利用方法も簡単に説明します。
DockerでGo言語開発環境構築
Dockerを使ったGo言語の開発環境構築手順を紹介します!簡単に仮想環境を構築できる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近傍の画素の平均をとる処理ですね。

【画像処理】Go言語で平滑化処理【サンプルコード付】
こんにちは!zhackです。 これまで、さまざまな画像処理をGo言語で行ってきましたが、 今回は空間フィルタリングを行っていきます! 先日、X方向Y方向微分の記事を掲載しましたが、本日は空間フィルタリングの一つ、平滑化...

フィルタ

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}

入力画像と出力画像

ガウシアンフィルタ結果

入力画像の防止の紫色のもじゃもじゃ(?)部分を比較すると、毛の細かさが失われていますね。

スポンサーリンク

輪郭抽出(エッジ検出)出

微分処理

こちらは、以下の記事で紹介しましたね。

【画像処理】Go言語で輪郭抽出!X方向Y方向微分【サンプルコード付き】
こんにちは!zhackです。 Go言語で画像処理シリーズ第3弾! 今回は、エッジ検出について説明していきます。 先日、フィルタ処理に関する記事を掲載しました。 その中の輪郭抽出である、X方向及びY方向の微分に...

フィルタだけ、書くとこんな感じです。

// 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}

入力画像と出力画像

 

おまけ

平滑化処理の重要性を示すために、ガウシアンフィルタをかけた後、輪郭抽出としてラプラシアンフィルタをかけてみました。

ノイズを除去したことで、抽出されている輪郭が少なくなっていますよね。

平滑化処理を行わなかった場合と比較するとこんな感じ。

さいごに

空間フィルタリング処理はいかがでしょうか。
画像として結果が目に見えると楽しいですね~~

今回は、空間フィルタリング処理をざぁーっとまとめてみました。

この表現がわかりにくかった!等がございましたら、コメントください。

また、空間フィルタリング以外の画像処理についても記事にしていますので、よろしければご参考ください。

【画像付き】初歩的な画像処理一覧【解説】
先日、画像がプログラムの中でどのように表現されており、 画像の特徴がどのように表現されているか、について記載しました。 今回は、画像に対しどのような処理が存在するのか、ご紹介したいと思います! 画像処理手法一覧 グレースケール ...

ではでは!

 

 

 

 

 

コメント

  1. […] […]

タイトルとURLをコピーしました