Fourier transform 을 사용하면 다른 방법으로는 불가능한 작업을 수행할 수 있습니다. 큰 필터의 경우 spatial filter 를 사용하는 것보다 Fourier transform 을 사용하는 것이 더 효율적입니다. 또한 Fourier transform 을 사용하면 특정 이미지 주파수를 분리하여 처리할 수 있습니다.
일반적으로 디지털 환경에서 언급되는 Fourier transform 은 대부분 DTFT 입니다.
그런데 이 의 DTFT 결과물인 는 continuous 하며 무한대의 영역을 계산해야하기 때문에 컴퓨터가 연산할 수가 없습니다. 따라서 discrete domain 에서 쉽게 계산할 수 있는 DFT 로 바꿔서 계산해야 합니다.
주파수의 주기가 인 것을 이용하여 무한대 영역의 주파수 가 아닌 만큼 잘린 finite length signal 에서 계산하도록 합니다. 이는 아래와 같이 표현할 수 있습니다.
이렇게 표현하면 만이 변수가 되기 때문에 로 표현할 수 있습니다.
IDFT(역변환)는 다음과 같습니다.
Spatial domain에서의 convolution 연산은 frequency domain 에서의 곱과 같습니다. 즉, spatial domain 에서 를 구했다면 그것은 frequency domain 으로 Fourier transform 한 , 의 곱을 inverse 한 값과 정확히 일치한다는 것입니다.
import numpy as np
from numpy.fft import fft, ifft
# 실수부와 허수부를 예쁘게 출력하는 함수
def print_cnums(comparr):
for c in comparr: print(f'{c.real} + {c.imag}j')
print()
# [ 1 2 3 4]를 Fourier transform
f = np.array([1, 2, 3, 4])
F = fft(f)
print_cnums(F)
# Fourier transform 결과물을 inverse
ff = ifft(F)
print_cnums(ff)
import matplotlib.pyplot as plt
# 그래프를 만드는 함수. 특별히 공부할 필요는 없다.
def show_stems(plist):
xx = np.array(range(len(plist[0])))
plt.figure()
for pp in plist:
plt.stem(xx, pp, basefmt=' ')
plt.tick_params(axis='both', which='major', labelsize=16)
plt.show()
npoints = 4
f1 = np.ones(npoints); F1 = fft(f1)
print_cnums([F1])
mags = [np.abs(F1)]; show_stems(mags)
phases = [np.angle(F1)]; show_stems(phases)