1

画像用のPythonで1D配列で正常に機能するfftコードを拡張しようとしています。実際、私は問題が拡張のロジックにあることを知っています。FFT についてはよくわからないので、画像処理の課題を提出しなければなりません。ヒントや解決策に感謝します

これがコードです。実際、PythonでFFT用のモジュールを作成しようとしています.rosetta Codeのサイトの助けを借りて、すでに1Dでうまく機能しています.

from cmath import exp, pi
from math import log, ceil

def fft(f):
    N = len(f)
    if N <= 1: return f
    even = fft(f[0::2])
    odd =  fft(f[1::2])
    return [even[k] + exp(-2j*pi*k/N)*odd[k] for k in xrange(N/2)] + \
           [even[k] - exp(-2j*pi*k/N)*odd[k] for k in xrange(N/2)]

def pad(f):
    n = len(f)
    N = 2 ** int(ceil(log(n, 2)))
    F = f + [0] * (N - n)
    return F, n 

def unpad(F, n):
    return F[0 : n]

def pad2(f):
    m, n = len(f), len(f[0])
    M, N = 2 ** int(ceil(log(m, 2))), 2 ** int(ceil(log(n, 2)))
    F = [ [0]*N for _ in xrange(M) ]
    for i in range(0, m):
        for j in range(0, n):
            F[i][j] = f[i][j]
    return F, m, n

def fft1D(f):
    Fu, n = pad(f)
    return fft(Fu), n

def fft2D(f):
    F, m, n = pad2(f)
    M, N = len(F), len(F[0])
    Fuv = [ [0]*N for _ in xrange(M) ]
    for i in range(0, M):
        Fxv = fft(F[i])
        for j in range(0, N):
            Fuv[i][j] = (fft(Fxv))[j]
    return Fuv, [m, n]

このモジュールを tis コードで呼び出しました。

from FFT import *
f= [0, 2, 3, 4]
F = fft1D(f)
print f, F
X, s = fft2D([[1,2,1,1],[2,1,2,2],[0,1,1,0], [0,1,1,1]])
for i in range(0, len(X)):
    print X[i]

出力は次のとおりです。

[0, 2, 3, 4] ([(9+0j), (-3+2j), (-3+0j), (-3-2j)], 4)
[(4+0j), (4-2.4492935982947064e-16j), (4+0j), (8+2.4492935982947064e-16j)]
[(8+0j), (8+2.4492935982947064e-16j), (8+0j), (4-2.4492935982947064e-16j)]
[0j, -2.33486982377251e-16j, (4+0j), (4+2.33486982377251e-16j)]
[0j, (4+0j), (4+0j), (4+0j)]

Matlabの出力で結果を検証したので、1dの最初のものは問題ありませんが、2番目のMatlabの出力は次のとおりです。

>> fft([1,2,1,1;2,1,2,2;0,1,1,0;0,1,1,1])

ans =

   3.0000             5.0000             5.0000             4.0000          
   1.0000 - 2.0000i   1.0000                  0 - 1.0000i   1.0000 - 1.0000i
  -1.0000             1.0000            -1.0000            -2.0000          
   1.0000 + 2.0000i   1.0000                  0 + 1.0000i   1.0000 + 1.0000i

出力が異なります。これは、コードのロジックで何か間違ったことをしていることを意味します。私は今まで FFT を正式に勉強したことがないので、気にせずに助けてください。数学を完全に理解することはできません。問題が解るかもしれません。

4

2 に答える 2

3

コードを理解するのは少し難しいですが、どちらも同じ方向に FFT を実行しているようです。FT の積分を調べると、xとのy積分が独立していることがわかります。つまり、(申し訳ありませんが、この表記法はひどい'ものです。フーリエ空間の関数を示しています)

FT(f(x, y), x) -> f'(k, y)
FT(f'(k, y), y) -> f''(k, w)

したがって、やりたいことは、各行の FFT を取得し(N 1D FFT を実行するよりも)、結果を新しい配列に押し込むことです (これにより から取得されますf(x, y) -> f'(k, y))。次に、その結​​果配列の各の FFT を取得し(M 1D FFT を実行)、それらの結果を別の新しい配列に押し込みます ( f'(k, y) -> f''(k, w).

于 2013-03-03T16:04:05.587 に答える
1

numpyを使用する必要があるというisedevに同意します。それはすでにn次元で変換を行うことができる素晴らしいfftパッケージを持っています。

http://docs.scipy.org/doc/numpy/reference/routines.fft.html

http://docs.scipy.org/doc/numpy-1.4.x/reference/generated/numpy.fft.fft.html

于 2013-03-03T16:25:31.220 に答える