らんだむな記憶

blogというものを体験してみようか!的なー

パワースペクトル

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
基本的にこのサンプルの通りにやっている。元データのままだと真っ黒けっけだったのでサンプルと同様に対数をとった。そんなもんらしい、という理由だが。

f:id:derwind:20160130202621p:plain