6.3 2次元DFT (1)2次元DFTとは 画像のような2次元信号をサンプリングしたデータを 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での記述 ③データの設定 (色々な関数を設定して確かめてみよう) 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 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 .Cells(j + 2, k + 2) = X(j, k).実部 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 .Cells(j + 2, k + 2) = Y2(j, k).実部 End With
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 .Cells(j + 2, k + 2) = Z2(j, k).実部 End With End Sub Sub ボタン1_Click() 関数0 DFT IDFT 結果設定
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 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))) Y1(I, Max) = Y1(I, 0)
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 Y2(Max, I) = Y2(0, I) 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 Z2(I, Max) = Z2(I, 0) For I = 0 To m For k = 0 To m Z2(I, k) = DivR(Z2(I, k), m)
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 Z1(Max, I) = Z1(0, I) For I = 0 To m For k = 0 To m Z1(I, k) = DivR(Z1(I, k), m)
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 End Sub
実行して等高線グラフにすると... FFTの結果を逆FFTすると元に戻っていることが分かる
(4)画像データのフーリエ変換 まず,写真データをDFT用のデータに… VB6,VB.Net等を使えば 写真を読み込んで白黒写真にし 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 End Sub
画像のフーリエ変換 画像データのフーリエ変換と逆フーリエ変換結果
色々な2次元フーリエ変換(1)
色々な2次元フーリエ変換(2)
色々な2次元フーリエ変換(3)
色々な2次元フーリエ変換(4)
色々な2次元フーリエ変換(5)