twitter facebook

Pythonで画像のパワースペクトル

numpy に FFTの関数があったので・・・c++のfftwとか勉強して使ってた時代がなついw
import numpy as np
import cv2
import matplotlib.pyplot as plt

# 画像読込→グレースケール
img = cv2.imread("test.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2次元FFT
img_fft = np.fft.fft2(img_gray)

# 象限の入れ替え。
img_fft =  np.fft.fftshift(img_fft)

# パワースペクトル
img_power = 20*np.log(np.abs(img_fft))

# 描画
plt.imshow(img_gray, cmap = 'gray')
plt.show()
plt.imshow(img_power , cmap = 'gray')
plt.show()
元画像
画像の中央が低周波

補足

img_fft =  np.fft.fftshift(img_fft)
この関数の機能は
2次元FFT→直流成分が配列の左上に→直流成分を中心に移動。
ようは、見やすくするために 、第1象限(右上)と第3象限(左下)、第2象限(左上)と第4象限(右下)を入れ替えます。というものです。これしないと、こうなります。
fftshiftしない場合
AUTHOR
@hiropon
最終更新日 2018/09/18
FAVORITE good stock
LINK TAG
記法を見る