Pythonで2Dフーリエ変換!画像フィルタリングをする方法

  • このエントリーをはてなブックマークに追加

フーリエ変換は1次元(1D)の信号に対してかけるのが一般的ですが、2次元(2D)信号にかけることで画像のフィルタリングに応用可能です。ここではPython/Numpyを使った2Dフーリエ変換の方法を紹介します。

こんにちは。wat(@watlablog)です。今回は画像のフィルタリングが可能な2Dフーリエ変換コードを学びます

フーリエ変換で出来る事の概要

1D信号の場合

2D信号のフーリエ変換を説明する前に、まずは基本の1D信号のフーリエ変換をおさらいしておきましょう。

1D信号とはある1つの軸に対し値がただ1つ決まる信号の事であり、例えば横軸に時間をとって加速度を計測したデータ等は1D信号に当たります。

実際にそのようなデータを計測すると、多くの場合が複雑な振動現象となっているため、人間が理解できるように時間領域を周波数領域に変換する計算を行います。この変換の事をフーリエ変換と呼びます。

離散データの場合は離散フーリエ変換(DFTDiscrete Fourier Transform)を使い、特にデータ数を\(2^{n}\)にした場合に高速に処理する高速フーリエ変換(FFT:Fast Fourier Transform)というものもあります。

下図のようにフーリエ変換を行うことで、複雑な時間波形にいくつの周波数成分がどれだけ入っているかを分析することができ、現象の理解やノイズ除去といった使い方が可能です。

FFTの概要

1D信号の場合のフーリエ変換については、当ブログ「信号処理カテゴリ」の以下の記事が関連しています。Pythonコードも記載していますので、ご興味のある方は是非ご覧下さい。

PythonでFFT!SciPyのFFTまとめ
PythonでFFTとIFFT!逆フーリエ変換で時間波形を作る

2D信号におけるフーリエ変換とは?

2D信号の場合のフーリエ変換も1D信号の場合と全く同じ考え方をします。

以下に元画像と元画像を2D離散フーリエ変換(2D-DFT)した図を示します。このように画像をフーリエ変換することで、画像の周波数領域輝度値を見ることができます。

この画像の周波数領域は、中心が直流(DC)成分、中心に近い部分は低周波成分、外側にいくほど高周波成分であることを意味します。

2D-DFTの説明図

2Dフーリエ変換で画像のフィルタリングが出来る

2Dフーリエ変換後の振幅画像は、ただ見てるだけではよく分からない画像に過ぎません。この周波数領域の画像を使ってよく行われる処理は、画像のフィルタリングです。

以下の図は2Dフーリエ変換を利用したフィルタリングの例です。

(a)の元画像(ここではグレースケール画像)に対し、(b)で2Dフーリエ変換を行っています。ここで(c)として直流成分付近を黒く(0にする)してから(d)と2D逆フーリエ変換を行うと、画像に対してハイパスフィルタをかけたことと同じになります。

2Dフーリエ変換で画像フィルタリングをする方法の図解

今回はこの画像フィルタリングコードをPythonで書いてみます。

2Dフーリエ変換により画像フィルタリングをするPythonコード

以下に2Dフーリエ変換をして画像フィルタリングをするPythonコードを示します。詳細は以下のコード内コメントに記載しました。

以下にプログラムで使用するサンプル画像を準備しました。コードの検証にダウンロードしてお使いください。

サンプル画像

※ちなみにこの画像は筆者お気に入りの関数\(z = \sin x + \cos y\)をmatplotlibで3Dプロットし、cmap='jet'でコンター表示させ上から見た図です。

以下が実行結果です。左が元画像、真ん中が2Dフーリエ変換後の周波数領域振幅画像、右がフィルタリング後の画像です。

2D フーリエ変換によるフィルタリングコードの実行結果

まとめ

本記事では1Dフーリエ変換をおさらいし、画像に対する2Dフーリエ変換によるハイパスフィルタリングの方法を説明しました。

また、実際に画像フィルタリングを行うPythonコードをNumpyで書いてみました。

2Dフーリエ変換もPythonであれば簡単に計算できることがわかりました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

SNSでもご購読できます。

コメント

  1. tkoyama010 より:

    元画像”sample.png”のリンクを示していただけるとありがたいです。

    1. wat より:

      ご要望ありがとうございます。
      コード部分の上にダウンロードボタンを用意してみました。
      是非ご活用ください。

      1. tkoyama010 より:

        ありがとうございます。助かります。

wat へ返信する コメントをキャンセル

*