二次元フーリエ変換
二次元のフーリエ変換の、象限を取り換える関数を作った。画像の2行目と4行目のsubplot内のインセットは、象限を取り換えている。2行目は、何をやっているのかわかりやすくするために、あえてやった。
# 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で二次元フーリエ変換」でいい気がする。面倒くさいのでそのままにする。
【pythonの最新記事】
- 中速フーリエ変換 ~離散フーリエ変換より..
- 断面二次モーメントを、座標点の配列から計..
- 断面二次モーメントを、座標点の配列から計..
- fontファイルの文字データ(グリフ)を..
- matplotlibのpyplot.pl..
- 計算力学技術者試験の問題集 自炊(裁断→..
- pythonで、ホワイトノイズやピンクノ..
- 脳ドッグに行ってきた。→MRIの画像デー..
- matplotlibのimshowで円を..
- matplotlibの、cmapを、徐々..
- matplotlibのmake_axes..
- matplotlib floatinga..
- matplotlib plotの色を、値..
- matplotlibのlinestyle..
- どちらが正しいRGBか。(matplot..
- matplotlibのannotateの..
- matplotlibで、x軸とy軸の数字..
- VBAで、pythonのrangeとか、..
- matplotlibのaxes3Dで、a..
- matplotlibのlatexで、行列..