6.3 2次元DFT (1)2次元DFTとは
280 likes | 496 Views
6.3 2次元DFT (1)2次元DFTとは. 画像のような2次元信号をサンプリングしたデータを. 2次元DFTを. とすると,以下のように定義される。. (2)方式. 定義式は次のように変形できる. 方向により1次元 DFT のあと,. 方向による1次元. すなわち,. DFTを行えばよい。. …. …. …. (3)周波数の並べ方. 1次元の場合,直流分を左に配置するが, 2次元の場合,直流分を中央に配置するのが便利. 画像の場合,通常 直流分を中央に 配置. 通常のDFTにおける周波数配置. …. …. …. ….
6.3 2次元DFT (1)2次元DFTとは
E N D
Presentation Transcript
6.3 2次元DFT(1)2次元DFTとは6.3 2次元DFT(1)2次元DFTとは 画像のような2次元信号をサンプリングしたデータを 2次元DFTを とすると,以下のように定義される。
(2)方式 定義式は次のように変形できる 方向により1次元DFTのあと, 方向による1次元 すなわち, DFTを行えばよい。 … … …
(3)周波数の並べ方 1次元の場合,直流分を左に配置するが, 2次元の場合,直流分を中央に配置するのが便利 画像の場合,通常 直流分を中央に 配置 通常のDFTにおける周波数配置 … … … … 負の周波数に対応させる
中央にシフトする方法 に を乗ずる。 として, したがって,次のような式として処理する。
VBAでの記述 準備 Xの値を保存する「X」,「Y」,「Z」シートを用意する。
VBAでの記述 ②データ宣言 Private Const Max = 100 Private X(Max, Max) As Complex Private Y1(Max, Max) As Complex Private Y2(Max, Max) As Complex Private Z1(Max, Max) As Complex Private Z2(Max, Max) As Complex
VBAでの記述 ③データの設定(色々な関数を設定して確かめてみよう)VBAでの記述 ③データの設定(色々な関数を設定して確かめてみよう) Private Sub 関数0() DX = 0.3 For j = 0 To Max XX = (j - Max / 2) * DX For k = 0 To Max YY = (k - Max / 2) * DX R = Sqr(XX * XX + YY * YY) If R < 0.00001 Then V = 1 Else VV = Sin(R) V = Sin(R) / R End If X(j, k) = SetC(V, 0) Next Next End Sub
VBAでの記述 ④結果設定(1) Sub 結果設定() With Worksheets("X") For k = 0 To Max .Cells(1, k + 2) = k Next For j = 0 To Max .Cells(j + 2, 1) = j For k = 0 To Max .Cells(j + 2, k + 2) = X(j, k).実部 Next Next End With
VBAでの記述 ⑤結果設定(2) With Worksheets("Y") For k = 0 To Max .Cells(1, k + 2) = k Next For j = 0 To Max .Cells(j + 2, 1) = j For k = 0 To Max .Cells(j + 2, k + 2) = Y2(j, k).実部 Next Next End With
VBAでの記述 ⑥結果設定(3)とClickイベントハンドラVBAでの記述 ⑥結果設定(3)とClickイベントハンドラ With Worksheets("Z") For k = 0 To Max .Cells(1, k + 2) = k Next For j = 0 To Max .Cells(j + 2, 1) = j For k = 0 To Max .Cells(j + 2, k + 2) = Z2(j, k).実部 Next Next End With End Sub Sub ボタン1_Click() 関数0 DFT IDFT 結果設定 End Sub
VBAでの記述 ⑦2次元DFT(1) Private Sub DFT() '2次元DFT m = Max: ARG= -6.28318530717959 / m For k = 0 To m For N = 0 To m DD = (-1) ^ (k + N) Y2(k, N).実部 = X(k, N).実部 * DD Y2(k, N).虚部 = X(k, N).虚部 * DD Next Next For I = 0 To m - 1 For k = 0 To m - 1 Y1(I, k) = SetC(0, 0) For N = 0 To m - 1 Y1(I, k) = AddC(Y1(I, k), MultC(Y2(I, N), ExpJ(ARG * N * k))) Next Next Y1(I, Max) = Y1(I, 0) Next
VBAでの記述 ⑧2次元DFT(2) For I = 0 To m - 1 For k = 0 To m - 1 Y2(k, I) = SetC(0, 0) For N = 0 To m - 1 Y2(k, I) = AddC(Y2(k, I), MultC(Y1(N, I), ExpJ(ARG * N * k))) Next Next Y2(Max, I) = Y2(0, I) Next End Sub
VBAでの記述 ⑨2次元IDFT(1) Private Sub IDFT() ' 逆2次元DFT m = Max: ARG = 6.28318530717959 / m For I = 0 To m - 1 For k = 0 To m - 1 Z2(I, k) = SetC(0, 0) For N = 0 To m - 1 Z2(I, k) = AddC(Z2(I, k), MultC(Y2(I, N), ExpJ(ARG * N * k ))) Next Next Z2(I, Max) = Z2(I, 0) Next For I = 0 To m For k = 0 To m Z2(I, k) = DivR(Z2(I, k), m) Next Next
VBAでの記述 ⑩2次元IDFT(2) For I = 0 To m - 1 For k = 0 To m - 1 Z1(k, I) = SetC(0, 0) For N = 0 To m - 1 Z1(k, I) = AddC(Z1(k, I), MultC(Z2(N, I), ExpJ(ARG * N * k))) Next Next Z1(Max, I) = Z1(0, I) Next For I = 0 To m For k = 0 To m Z1(I, k) = DivR(Z1(I, k), m) Next Next
VBAでの記述 ⑪2次元IDFT(3) For k = 0 To m For N = 0 To m DD = (-1) ^ (k + N) Z2(k, N).実部 = Z1(k, N).実部 * DD Z2(k, N).虚部 = Z1(k, N).虚部 * DD Next Next End Sub
実行して等高線グラフにすると... FFTの結果を逆FFTすると元に戻っていることが分かる
(4)画像データのフーリエ変換まず,写真データをDFT用のデータに…(4)画像データのフーリエ変換まず,写真データをDFT用のデータに… VB6,VB.Net等を使えば写真を読み込んで白黒写真にしDFT用のデータにすることができる
以下は,VB6でピクチャボックスに読み込まれた画像を白黒写真に変換し,DFT用のデータに変換するプログラムである。以下は,VB6でピクチャボックスに読み込まれた画像を白黒写真に変換し,DFT用のデータに変換するプログラムである。 Public 画像DT(100, 100) As Double Public Sub window(P As PictureBox, X1, Y1, X2, Y2) With P .ScaleLeft = X1 .ScaleTop = Y1 .ScaleWidth = X2 - X1 .ScaleHeight = Y2 - Y1 End With End Sub Private Sub 白黒変換() Dim X1 As Double Dim C As Double Dim C1 As Double Dim C2 As Double Dim C3 As Double window Picture2, 0, 0, 100, 100 W = Picture1.ScaleWidth H = Picture1.ScaleHeight DW = W / 100: DH = H / 100 For I = 0 To 100 For J = 0 To 100 X = DW * J: Y = DH * I C = Picture1.Point(X, Y) Picture2.Line (J, I)-(J + 1, I + 1), C, BF If C < 0 Then X = 255 Else C1 = (C \ 256) \ 256 C2 = (C \ 256) Mod 256 C3 = C Mod 256 X = (C1 + C2 + C3) / 3 End If Picture2.Line (J, I)-(J + 1, I + 1), RGB(X, X, X), BF 画像DT(I, J) = X Next Next End Sub
画像のフーリエ変換 画像データのフーリエ変換と逆フーリエ変換結果