この記事では、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 | 【画像処理入門】アルゴリズム&プログラミング |
コメント
すみません。いつも記事拝見させていただいています。
DFT変換をカラー画像で行いIDFで元のカラー画像に戻したいのですが
どのように実装すれば良いか分かりません。
可能でしたらアドバイス頂けますでしょうか。
※OWA様
コメントありがとうございます。
3ch画像(RGBカラー)の場合、一般的に
3ch画像をR, G, Bの1chずつに分解し、1ch画像を3つ作成
↓
作成した1ch画像をそれぞれDFT・IDF変換
↓
1ch画像3つを再結合して3ch画像に戻す
という流れになりますね。