pyplot.imread でグレイスケールで読ませる方法を調べるのが面倒だったので、cv2 を使う。グレースケールだと、FFTとIFFT - らんだむな記憶で触れたような色相の問題も一応なさそう。
#! /usr/bin/env python # -*- coding: utf-8 -*- import sys, os import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread(sys.argv[1], 0) # FFT f = np.fft.fft2(img) f = np.fft.fftshift(f) raw_mag = np.abs(f) magnitude_spectrum = 20 * np.log(raw_mag) power_spectrum = 20 * np.log(raw_mag * raw_mag) plt.subplot(121), plt.imshow(magnitude_spectrum, cmap = 'gray') plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(power_spectrum, cmap = 'gray') plt.title('Power Spectrum'), plt.xticks([]), plt.yticks([]) plt.show()
上記のコードでさきほどの絵のパワースペクトルと呼ばれる量を描画してみる。周波数空間の原点が画像中央に来るようにシフトさせている。DC 成分をスペクトルの中心に移動 - MATLAB fftshift - MathWorks 日本に解説のあるような fftshift関数を用いているが、トーラス上で絵を移動させたと見ても良い。
Fourier Transform — OpenCV-Python Tutorials 1 documentation
基本的にこのサンプルの通りにやっている。元データのままだと真っ黒けっけだったのでサンプルと同様に対数をとった。そんなもんらしい、という理由だが。