20171230

Pythonで、「二次元フーリエ変換した後、象限を取り換える」関数を作った。

二次元フーリエ変換

二次元のフーリエ変換の、象限を取り換える関数を作った。画像の2行目と4行目のsubplot内のインセットは、象限を取り換えている。2行目は、何をやっているのかわかりやすくするために、あえてやった。

figure_4.png

# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import tkFileDialog as tk

name = tk.askopenfilename()

##############################
#### 象限を取換える関数。#####

##############################
def quadrant(img):
n = len(img[0])
m = len(img)
list1 = range(n)[n/2:] + range(n/2)
list2 = range(m)[m/2:] + range(m/2)
a = [[img[j][i] for i in list1] for j in list2]
return a

######################################
##### ここだけ書くつもりだったが #####
##### ながくなってしまった。 #########
######################################


img1 = mpimg.imread(name)
img1 = np.mean(img1, -1)# グレイにした


img2 = quadrant(img1)# 二次元フーリエ変換

dft1 = np.fft.fft2(img1)# 実部、虚部と絶対値の取り出し。
dft2 = dft1.real
dft3 = dft1.imag
dft4 = np.abs(dft1)

# 象限の取換え(必要ないと思った)
quad2 = quadrant(dft2)
quad3 = quadrant(dft3)
quad4 = quadrant(dft4)


f,((ax11,ax12,ax13),(ax1,ax2,ax3),(ax4,ax5,ax6),(ax7,ax8,ax9)) = plt.subplots(4,3)


ax11.imshow(img1,cmap="gray")

ax1.imshow(img2,cmap="gray")
ax2.set_axis_off()
ax3.set_axis_off()

ax4.imshow(dft2,vmin=-3000,vmax=3000,cmap="gray")
ax5.imshow(dft3,vmin=-3000,vmax=3000,cmap="gray")
ax6.imshow(dft4,vmin=-3000,vmax=3000,cmap="gray")

ax7.imshow(quad2,vmin=-3000,vmax=3000,cmap="gray")
ax8.imshow(quad3,vmin=-3000,vmax=3000,cmap="gray")
ax9.imshow(quad4,vmin=-3000,vmax=3000,cmap="gray")

ax11.set_title("image")
ax1.set_title("arrange quadrant")
ax4.set_title("2dfft real part")
ax5.set_title("2dfft imaginary part")
ax6.set_title("2dfft absolute value")

ax12.set_axis_off()
ax13.set_axis_off()

plt.show()

tkFileDialogを使ったので、ほかの画像でも試せる。
必要なpythonモジュール:matplotlibやnumpy

一番難しかったところ。

二次元フーリエ変換の結果を表示でてこずった。

エラーが起きて、表示できない。

dft結果は複素数だから。

画像の配列の各要素に入っている値を、実数、虚数、絶対値別に変換してから再表示。

表示された画像が、単一色(単色で真っ青だったり真っ赤だったりした。)
値をprintしても、かなりバリエーションあるのに何で…

max,min値だけが、(他の画像行列の要素と比べ)異常に高いため他の(絶対値が)小さい値はフラットに見える。

img配列の値を参考に、imshowの引数vmin,vmaxに適切な値を入れる。(どんな値が適切かは画像サイズ等による。)

表示された!

象限を取り換える操作は、「不必要なんじゃないか?」と思っているので、この記事のタイトルは、ただの「pythoonで二次元フーリエ変換」でいい気がする。面倒くさいのでそのままにする。


posted by yuchan at 07:00 | Comment(0) | python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: