Frequency Filter

파워·2024년 11월 5일

의학영상처리

목록 보기
3/10
post-thumbnail

Fourier Transform 의 의의


Fourier transform 을 사용하면 다른 방법으로는 불가능한 작업을 수행할 수 있습니다. 큰 필터의 경우 spatial filter 를 사용하는 것보다 Fourier transform 을 사용하는 것이 더 효율적입니다. 또한 Fourier transform 을 사용하면 특정 이미지 주파수를 분리하여 처리할 수 있습니다.



Discrete-Time Foureir Transform (DTFT)


일반적으로 디지털 환경에서 언급되는 Fourier transform 은 대부분 DTFT 입니다.

그런데 이 xx 의 DTFT 결과물인 XX 는 continuous 하며 무한대의 영역을 계산해야하기 때문에 컴퓨터가 연산할 수가 없습니다. 따라서 discrete domain 에서 쉽게 계산할 수 있는 DFT 로 바꿔서 계산해야 합니다.



Discrete Fourier Transform (DFT)


주파수의 주기가 2pi2pi 인 것을 이용하여 무한대 영역의 주파수 ww 가 아닌 2pi2pi 만큼 잘린 finite length signal wkw_{k} 에서 계산하도록 합니다. 이는 아래와 같이 표현할 수 있습니다.

이렇게 표현하면 kk 만이 변수가 되기 때문에 X[k]X[k] 로 표현할 수 있습니다.

IDFT(역변환)는 다음과 같습니다.



Convolution Theorems


Spatial domain에서의 convolution 연산은 frequency domain 에서의 곱과 같습니다. 즉, spatial domain 에서 yy 를 구했다면 그것은 frequency domain 으로 Fourier transform 한 XX, YY 의 곱을 inverse 한 값과 정확히 일치한다는 것입니다.



Fourier Transform 구현


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)
profile
개발자 준비생

0개의 댓글