【Python/OpenCV】高速フーリエ変換でパワースペクトルの算出

この記事では、Python版OpenCVとNumPyを用いて、高速フーリエ変換によりパワースペクトルを算出する方法をソースコード付きで解説します。

高速フーリエ変換でスペクトル強度算出

NumPyには、2次元配列の高速フーリエ変換をおこなうメソッド「numpy.fft.fft2(img)」があります。
今回はこれらを用いて、OpenCVで読み込んだ画像を高速フーリエ変換し、スペクトル強度を算出してグラフ表示してみました。

ソースコード(Python3+OpenCV3)

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import numpy as np
import cv2
import matplotlib.pyplot as plt

def main():
    # 入力画像をグレースケールで読み込み
    img = cv2.imread("input.png")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 高速フーリエ変換(2次元)
    fimg = np.fft.fft2(gray)

    # 第1象限と第3象限, 第2象限と第4象限を入れ替え
    fimg =  np.fft.fftshift(fimg)

    # パワースペクトルの計算
    mag = 20*np.log(np.abs(fimg))

    # 入力画像とスペクトル画像をグラフ描画
    plt.subplot(121)
    plt.imshow(gray, cmap = 'gray')
    plt.subplot(122)
    plt.imshow(mag, cmap = 'gray')
    plt.show()


if __name__ == "__main__":
    main()

実行結果

サンプルプログラムの実行結果です。
■入力画像(左)と出力画像(右)

関連記事
1 PythonでOpenCV入門 サンプル集
2 【画像処理】画像のフーリエ変換(DFT、FFT)
3 【Python】画像処理プログラミング入門
4 【画像処理入門】アルゴリズム&プログラミング

コメント

  1. OWA より:

    すみません。いつも記事拝見させていただいています。
    DFT変換をカラー画像で行いIDFで元のカラー画像に戻したいのですが
    どのように実装すれば良いか分かりません。
    可能でしたらアドバイス頂けますでしょうか。

    • 管理人 より:

      ※OWA様
      コメントありがとうございます。
      3ch画像(RGBカラー)の場合、一般的に

      3ch画像をR, G, Bの1chずつに分解し、1ch画像を3つ作成

      作成した1ch画像をそれぞれDFT・IDF変換

      1ch画像3つを再結合して3ch画像に戻す

      という流れになりますね。