補間法 - ビジネス

6.3 2次元DFT
(1)2次元DFTとは
画像のような2次元信号をサンプリングしたデータを x(n1 , n2 )
2次元DFTを X (k1 , k2 ) とすると,以下のように定義される。
N1 1 N 2 1
X [k1 , k2 ]  
 2n1k1 / N1
 2n2 k 2 / N 2
x
[
n
,
n
]

e

e
 1 2
n1 0 n2 0
(k1  0,1,, N1  1, k2  0,1,, N 2  1)
(2)方式
定義式は次のように変形できる

 2n2 k2 / N 2
 2n1k1 / N1
X [k1 , k 2 ]     x[n1 , n2 ]  e
e
n2  0  n1  0

N 2 1 N1 1
すなわち, n1 方向により1次元DFTのあと, n2 方向による1次元
DFTを行えばよい。
…
…
…
(3)周波数の並べ方
1次元の場合,直流分を左に配置するが,
2次元の場合,直流分を中央に配置するのが便利
通常のDFTにおける周波数配置
…
0
…
N 2
画像の場合,通常
直流分を中央に
配置
…
N 1
負の周波数に対応させる
 ( N 2 1)
…
0
N 2
中央にシフトする方法
l  N / 2 として, x[n] に exp(2 nl j / N ) を乗ずる。
exp(2 nl j / N )  exp(j n)  (1)n
したがって,次のような式として処理する。

  2n2 k2 / N 2
n1  n2
 2n1k1 / N1
X [k1 , k 2 ]     x[n1 , n2 ]  (1)
e
e
n2  0  n1  0

N 2 1 N1 1
VBAでの記述 準備
Xの値を保存する「X」,「Y」,「Z」シートを用意する。
VBAでの記述 ②データ宣言
Private
Private
Private
Private
Private
Private
Const Max = 100
X(Max, Max) As Complex
Y1(Max, Max) As Complex
Y2(Max, Max) As Complex
Z1(Max, Max) As Complex
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
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イベントハンドラ
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用のデータに…
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,
If C < 0 Then
X = 255
Else
C1 = (C \ 256)
C2 = (C \ 256)
C3 = C Mod 256
X = (C1 + C2 +
End If
Picture2.Line (J,
画像DT(I, J) = X
Next
Next
End Sub
I)-(J + 1, I + 1), C, BF
\ 256
Mod 256
C3) / 3
I)-(J + 1, I + 1), RGB(X, X, X), BF
画像のフーリエ変換
画像データのフーリエ変換と逆フーリエ変換結果
色々な2次元フーリエ変換(1)
色々な2次元フーリエ変換(2)
色々な2次元フーリエ変換(3)
色々な2次元フーリエ変換(4)
色々な2次元フーリエ変換(5)