푸리에 이미지 변환: 스펙트럼을 읽는 세 가지 규칙

푸리에 이미지 변환은 사진을 픽셀 격자가 아니라 2차원 사인파를 얼마나 섞었는지의 성분 목록으로 바꿔 읽는 방법이다. 이 성분을 진폭과 위상으로 나눠 보면, 이미지의 구조 정보는 거의 전부 위상 쪽에 있다.

사진에도 이퀄라이저가 있다면

밝은 크림 배경에 흰색 라운드 카드 두 장이 좌우로 놓인 인포그래픽. 왼쪽 카드에는 카메라 아이콘 배지, 구름·언덕·나무가 그려진 풍경 액자, 픽셀을 뜻하는 점 격자 스트립이 위에서 아래로 놓이고 맨 아래에 '이미지' 라벨이 붙어 있다. 오른쪽 카드에는 중심이 촘촘하고 바깥으로 갈수록 성겨지는 주황 방사형 점 무리가 있는데 한가운데에 '저주파' 배지, 바깥 위쪽 두 곳에 '고주파' 라벨, 맨 아래에 '스펙트럼' 라벨이 붙어 있고, 두 카드 사이에서는 굵은 주황 화살표가 줄무늬 패치·슬라이더 아이콘과 함께 왼쪽에서 오른쪽을 가리킨다.

음악 앱에서 베이스 슬라이더를 끝까지 올리면 저음이 묵직해지고, 트레블을 내리면 쨍한 고음이 잦아든다. 곡을 다시 녹음한 것은 아니다. 소리를 시간의 흐름이 아니라 "어떤 높이의 음을 얼마나 담았는가"라는 성분으로 갈라놓고, 그중 한 칸만 올리고 내린 것이다. 이런 장치를 이퀄라이저라고 부른다.

사진에도 같은 방식을 쓸 수 있을까. 쓸 수 있고, 그 방법이 푸리에 이미지 변환이다. 다만 여기서 다루는 것은 시간당 진동 횟수가 아니라 공간 주파수(spatial frequency)다. 화면을 가로지르며 밝기가 얼마나 촘촘하게 오르내리는지를 뜻한다.

넓은 하늘이나 매끈한 벽처럼 밝기가 천천히 변하는 부분은 공간 주파수가 낮다. 머리카락 한 올, 벽돌 사이의 경계선처럼 밝기가 급하게 튀는 부분은 공간 주파수가 높다. 사진 한 장을 이 주파수들의 목록으로 펼쳐 놓으면, 어느 성분이 얼마나 들어 있는지가 숫자로 잡힌다. 그 목록이 스펙트럼이다.

이 글에서는 네 가지를 차례로 확인한다. 먼저 스펙트럼을 눈으로 읽는 세 가지 규칙을 세우고, 그다음 스펙트럼을 계산하는 식과 그 식이 강제하는 대칭을 본다. 이어서 스펙트럼이 바깥으로 갈수록 얼마나 빠르게 옅어지는지 잰다. 끝으로 스펙트럼을 진폭과 위상으로 갈랐을 때 이미지의 형태가 어느 쪽을 따라가는지 실험한다. 마지막 결과는 직관과 어긋나는데, 판정에 필요한 것은 상관계수 두 개뿐이다.

스펙트럼 읽는 법 — 이미지는 사인파의 합이다

가장 단순한 그림 한 장에서 시작하자. 화면 전체를 세로로 가로지르는 줄무늬다. 밝기가 왼쪽에서 오른쪽으로 가면서 사인파 모양으로 오르내린다. 이런 줄무늬는 두 가지만 정하면 완전히 결정된다. 줄이 늘어선 방향, 그리고 줄 사이의 간격 — 이 둘만 알면 같은 그림을 언제든 다시 그릴 수 있다. 이것을 2차원 사인파라고 부른다.

푸리에가 밝힌 사실은 이렇다. 아무리 복잡한 이미지라도 방향과 간격이 서로 다른 줄무늬들을 알맞은 세기로 겹쳐 쌓으면 원래 그림이 그대로 나온다. 뒤집어 말하면, 사진 한 장을 "어떤 줄무늬를 얼마나 섞었는가"라는 값들로 다시 적을 수 있다. 그렇게 다시 적은 성분 목록이 스펙트럼이다.

그림 1이 그 대응을 보여준다. 왼쪽은 세로 줄무늬로 만든 원본 이미지, 오른쪽은 그 이미지의 진폭 스펙트럼이다. 값의 범위가 워낙 넓어서 로그를 씌워 밝기 차이를 줄여 그렸다. 스펙트럼을 읽는 규칙은 세 줄이면 충분하다.

왼쪽에는 세로 줄무늬가 촘촘히 늘어선 흑백 원본 이미지, 오른쪽에는 거의 검은 배경 위에 작고 밝은 점 몇 개만 찍힌 로그 진폭 스펙트럼이 나란히 놓여 있다. 스펙트럼의 점은 중심을 지나 가로로 늘어선 것들이 지배적이고, 그 위아래 대각선 자리에 더 희미한 점이 두 개 더 보인다.
그림 1. 왼쪽 이미지의 줄무늬는 세로로 서 있고, 오른쪽 스펙트럼의 밝은 점은 가로로 뻗는다. 중심은 저주파, 바깥은 고주파다.
  • 중심은 저주파다. 한가운데는 밝기가 천천히 변하는 성분, 즉 이미지의 큰 형태와 전체 밝기를 담는다. 보통 사진은 중심이 가장 밝다.
  • 가장자리는 고주파다. 중심에서 멀어질수록 더 촘촘한 줄무늬에 해당한다. 디테일과 경계선이 여기 담긴다.
  • 방향은 직각으로 꺾인다. 이미지의 줄무늬가 세로로 서 있으면, 스펙트럼의 밝은 점은 가로로 뻗는다.

세 번째 규칙이 가장 낯설다. 줄무늬가 세로로 서 있다는 것은 밝기가 가로 방향으로 오르내린다는 뜻이다. 변화가 일어나는 축이 가로이니, 그 변화를 세는 주파수 축도 가로다. 오른쪽 그림에서 점들이 옆으로 늘어선 이유가 이것이다.

세 규칙만 알고 있으면 스펙트럼만 보고도 원본 이미지의 무늬가 어느 방향으로 얼마나 촘촘한지 짚을 수 있다. 여기까지가 눈으로 읽는 단계다. 다음은 그 값을 실제로 계산하는 식이다.

푸리에 이미지 변환을 식으로 적기 전에: 복소수를 크기와 각도로

식으로 넘어가기 전에 짧게 준비할 것이 하나 있다. 복소수를 읽는 방법이다. 어려운 내용은 아니고 금방 끝나지만, 이걸 먼저 정리해 두면 뒤에 나오는 식이 훨씬 쉽게 읽힌다.

복소수는 평면 위의 한 점이라고 보면 된다. 가로축이 실수부, 세로축이 허수부이고, 이 점을 가리키는 방법은 두 가지다. 하나는 좌표를 그대로 적는 것이고, 다른 하나는 원점에서 그 점까지의 거리와 각도를 적는 것이다. 같은 점을 두 언어로 말하는 셈인데, 거리를 크기, 각도를 위상이라고 부른다.

거리와 각도로 적을 때 쓰는 표기가 $r e^{i\phi}$다. 앞에 곱해진 실수가 크기이고, 지수 자리에 들어간 값이 각도다. 각도만 바꾸면 크기는 그대로 둔 채 점이 원 위를 돌고, 크기만 바꾸면 방향은 그대로 둔 채 점이 원점에서 멀어지거나 가까워진다. 두 값이 서로 간섭하지 않고 각자 한 가지씩만 맡는다.

이 표기가 편한 이유는 줄무늬 이야기와 곧바로 이어지기 때문이다. 줄무늬 하나를 완전히 정하려면 두 가지를 알아야 한다. 얼마나 진하게 넣을 것인가, 그리고 밝은 마루를 어느 위치에 놓을 것인가. 앞의 것이 크기, 뒤의 것이 각도에 해당한다. 복소수 하나가 줄무늬 하나의 세기와 위치를 동시에 담는다.

준비가 끝났다. 이미지의 세로·가로 크기를 $M \times N$이라 하자. 각 픽셀의 밝기는 $f(x,y)$로 적는다. 이때 2차원 이산 푸리에 변환(DFT)은 이렇게 정의된다.

(1) $$ F(u,v) = \sum_{x=0}^{M-1}\sum_{y=0}^{N-1} f(x,y)\, e^{-i 2\pi (ux/M + vy/N)} $$

식 1은 겁먹을 식이 아니다. 지수 부분이 방금 본 크기와 각도 표기이고, 여기서는 크기가 1로 고정된 채 각도만 픽셀 위치에 따라 돈다. 그 자체가 하나의 줄무늬다. 거기에 픽셀 밝기를 곱해 이미지 전체에 걸쳐 더한다. 풀어 쓰면 "모든 픽셀을 훑으면서 이 줄무늬와 얼마나 닮았는지 점수를 매겨 합산하라"는 지시다.

닮은 정도가 크면 그 줄무늬가 이미지에 많이 들어 있다는 뜻이고, 0에 가까우면 거의 없다는 뜻이다. 결과값은 복소수이므로 크기와 각도를 함께 담는다. 크기가 그 줄무늬의 세기, 각도가 그 줄무늬의 위치다. 계산 자체는 넘파이 한 줄이면 되니, 줄무늬 두 개만 섞은 8×8 이미지로 확인해 보자.

import numpy as np

# 8x8 합성 이미지: 가로 방향 주파수 2 줄무늬 + 세로 방향 주파수 1 줄무늬
x = np.arange(8)
f = np.sin(2*np.pi*2*x/8)[None, :] + 0.5*np.cos(2*np.pi*1*x/8)[:, None]

F = np.fft.fft2(f)                 # 2D DFT — 딱 한 줄
amp = np.abs(F)
print("amplitude[:3, :3] =")
print(np.round(amp[:3, :3], 1))
amplitude[:3, :3] =
[[ 0.  0. 32.]
 [16.  0.  0.]
 [ 0.  0.  0.]]

섞은 줄무늬가 둘뿐이라 결과도 몇 칸에만 값이 뭉친다. 가로 방향으로 두 번 오르내리는 성분은 [0, 2] 칸에, 세로 방향으로 한 번 오르내리는 성분은 [1, 0] 칸에 나타난다. 출력에 보인 범위의 나머지는 전부 0이다.

두 값의 비도 원본과 맞아떨어진다. 세로 방향으로 오르내리는 성분은 세기 0.5로 섞었으니 가로 방향 성분의 절반이어야 하는데, 32와 16이 정확히 그 비율이다. 이미지를 줄무늬 성분으로 다시 적는다는 말이 무슨 뜻인지, 배열 하나로 눈에 잡힌다. 그런데 이 배열에는 아직 짚지 않은 규칙이 하나 더 들어 있다.

켤레 대칭 — 스펙트럼이 거울처럼 보이는 이유

앞 절의 그림 1을 다시 보면 밝은 점들이 중심을 기준으로 짝을 이루고 있다. 하나가 오른쪽에 찍히면 반대편 왼쪽에도 같은 밝기의 점이 찍힌다. 우연이 아니라 식 1에서 곧바로 따라 나오는 성질이다.

밝기 값만 있는 흑백 이미지는 모든 픽셀 값이 실수다. 허수부가 0인 값만 식에 들어가면 결과에 규칙이 하나 생긴다. 어떤 성분의 켤레 복소수가 원점 반대편 성분과 정확히 같아진다.

(2) $$ F(-u,-v) = F(u,v)^{*} $$

식 2의 별표가 켤레 복소수를 뜻한다. 켤레란 크기는 그대로 두고 각도의 부호만 뒤집은 값이다. 그러니 원점을 사이에 둔 두 성분은 크기가 완전히 같고 각도만 반대다. 스펙트럼 그림이 보여주는 것은 크기 쪽이라, 그림은 중심을 축으로 점대칭이 된다.

확인은 어렵지 않다. 인덱스를 음수 방향으로 뒤집은 배열을 만들어, 원래 배열의 켤레와 통째로 비교하면 된다. 모든 칸에서 한꺼번에 성립하는지 묻는 것이다.

import numpy as np

x = np.arange(8)
f = np.sin(2*np.pi*2*x/8)[None, :] + 0.5*np.cos(2*np.pi*1*x/8)[:, None]
F = np.fft.fft2(f)

# 켤레 대칭 확인: F(-u,-v) == conj(F(u,v))
idx = (-np.arange(8)) % 8
F_flip = np.conj(F[np.ix_(idx, idx)])
print("conjugate symmetric:", np.allclose(F, F_flip))
conjugate symmetric: True

64칸 전부에서 성립한다. 한쪽 절반을 알면 반대쪽 절반은 계산 없이 정해진다는 뜻이다. 흑백 이미지의 스펙트럼이 실제로 담은 정보는 그림의 절반뿐이고, 나머지 절반은 그 거울상이다. 스펙트럼이 늘 대칭으로 보이는 이유가 이것이다. 실제 구현에서 저장 공간과 계산량을 절반으로 줄이는 근거이기도 하다 — 넘파이의 np.fft.rfft2는 아예 절반만 계산해 돌려준다.

1/f² 감쇠 — 자연 이미지는 에너지가 저주파에 쏠려 있다

지금까지 넣은 이미지는 줄무늬 두 개만 섞은 8×8 격자였다. 합성 줄무늬 대신 실제 사진을 넣으면 스펙트럼의 모양이 달라진다. 몇 개의 점이 아니라 뿌연 원이 된다. 자연 이미지에는 온갖 방향과 간격의 줄무늬가 조금씩 다 들어 있기 때문이다. 중심이 가장 밝고 바깥으로 갈수록 어두워지는데, 그 옅어지는 속도에도 규칙이 있다.

먼저 용어를 하나 정하자. 각 성분의 크기를 제곱한 값을 파워라고 부르고, 파워를 주파수별로 모아 놓은 것을 파워 스펙트럼이라고 부른다. 세기를 제곱해서 보는 이유는 에너지가 진폭의 제곱에 비례하기 때문이다.

자연 이미지의 파워는 저주파 쪽에 압도적으로 쏠린다. 하늘·벽·피부처럼 넓고 매끈한 면은 화면에서 큰 넓이를 차지하면서 저주파 성분을 크게 만든다. 반면 가는 경계선이나 잔털처럼 고주파에 해당하는 것들은 차지하는 넓이가 작다.

얼마나 급하게 옅어지는지는 숫자로 잴 수 있다. 중심에서 같은 거리에 있는 값들을 고리 모양으로 평균 내면 주파수 하나당 파워 하나가 나온다. 이 곡선을 로그-로그 축에 그리면 거의 직선이 되고, 그 직선의 기울기가 곧 감쇠 속도다. 기울기 -2는 파워가 주파수 $f$의 제곱에 반비례한다는 뜻이다. 이 관계를 흔히 $1/f^2$ 감쇠라고 부른다. 512×512 표준 사진 한 장으로 그 기울기를 재 보자.

import numpy as np
from skimage import data

img = data.camera().astype(float)          # 512x512 표준 이미지 (scikit-image 내장)
F = np.fft.fftshift(np.fft.fft2(img))
power = np.abs(F)**2

cy, cx = np.array(power.shape) // 2
y, x = np.indices(power.shape)
r = np.hypot(y - cy, x - cx).astype(int)
radial = np.bincount(r.ravel(), power.ravel()) / np.bincount(r.ravel())

freqs = np.arange(len(radial))
mask = (freqs >= 3) & (freqs <= 200)       # DC와 나이퀴스트 꼬리 제외
slope = np.polyfit(np.log(freqs[mask]), np.log(radial[mask]), 1)[0]
print(f"radial power-spectrum slope = {slope:.2f}")
radial power-spectrum slope = -2.61

이 사진의 실측 기울기는 -2.61이다. 주파수가 10배 커지면 파워는 400배 넘게 줄어든다는 뜻이다. 사진마다 값은 조금씩 다르다. 다만 자연 이미지 전반이 기울기 -2 근처로 감쇠한다는 것은 Field(1987)의 관찰이다. 이 사진도 그 계열에 든다. 그림 2이 그 곡선이다.

방사 평균 파워 스펙트럼을 로그-로그 축에 그린 다크 배경 그래프. 청록색 데이터 곡선이 회색 점선 적합선을 따라 거의 직선으로 내려가고, 곡선 중간에 '실측 기울기 ~ -2.6' 주석이 달려 있다. 가로축은 방사 주파수, 세로축은 방사 평균 파워다.
그림 2. 자연 이미지의 방사 평균 파워 스펙트럼. 로그-로그 축에서 거의 직선(실측 기울기 약 -2.6)으로 내려간다 — 에너지가 저주파에 쏠려 있다는 증거다.

이 기울기가 뒤에 나올 압축·필터링 이야기의 출발점이다. 에너지가 저주파에 쏠려 있다는 것은 고주파를 웬만큼 버려도 그림이 크게 상하지 않는다는 뜻이다. JPEG가 사진 용량을 10분의 1로 줄이고도 멀쩡한 이유가 여기에 있다. 다만 여기까지 잰 것은 성분의 세기뿐이다. 세기만으로는 이미지의 형태를 설명할 수 없고, 그 사실이 다음 절에서 숫자로 드러난다.

진폭과 위상을 갈라보다 — 스왑 실험

앞에서 복소수를 크기와 각도로 적는 법을 봤다. 스펙트럼의 각 점도 복소수이니 똑같이 두 조각으로 가를 수 있다. 크기 쪽을 진폭(amplitude), 각도 쪽을 위상(phase)이라고 부른다.

(3) $$ F(u,v) = |F(u,v)|\, e^{i\phi(u,v)} $$

식 3의 절댓값 기호가 진폭이다. 그 줄무늬를 얼마나 세게 섞었는지를 뜻한다. 지수 자리의 값이 위상이고, 그 줄무늬의 밝은 마루를 어느 위치에 놓을지 정한다. 진폭이 "얼마나"라면 위상은 "어디에"다.

둘 중 어느 쪽이 이미지의 형태를 결정할까. 가장 직접적인 실험은 두 사진의 위상을 서로 맞바꾸는 것이다. 사진 A의 진폭에 사진 B의 위상을 붙여 역변환하면, 결과가 A를 닮는지 B를 닮는지 눈으로도 숫자로도 확인할 수 있다.

닮은 정도는 눈대중 대신 상관계수로 잰다. 두 이미지의 픽셀 값을 나란히 세워 상관계수를 구하면 1에 가까울수록 닮았고, 0에 가까울수록 서로 무관하다. 재구성 결과를 A와 B 각각에 견주면 어느 쪽을 따라갔는지 숫자로 나온다.

import numpy as np
from skimage import data, color

A = data.camera().astype(float)                    # 512x512
B = color.rgb2gray(data.astronaut()).astype(float) * 255

FA, FB = np.fft.fft2(A), np.fft.fft2(B)
ampA, phB = np.abs(FA), np.angle(FB)

# A의 진폭 + B의 위상 → 역변환
recon = np.real(np.fft.ifft2(ampA * np.exp(1j * phB)))

def corr(p, q):
    return np.corrcoef(p.ravel(), q.ravel())[0, 1]

print(f"위상 준 쪽(B)과의 상관: {corr(recon, B):.2f}")
print(f"진폭 준 쪽(A)과의 상관: {corr(recon, A):.2f}")
위상 준 쪽(B)과의 상관: 0.73
진폭 준 쪽(A)과의 상관: 0.11

결과가 명확히 갈렸다. 진폭을 준 A와의 상관은 0.11로 거의 무관한 수준이고, 위상을 준 B와는 0.73이다. A의 진폭을 그대로 썼는데도 재구성 이미지는 A가 아니라 B를 훨씬 더 닮았다.

흑백 이미지 네 장을 한 줄로 배치한 비교. 왼쪽부터 원본 A(카메라를 든 사진가), 원본 B(우주복을 입은 우주비행사), A의 진폭에 B의 위상을 붙여 재구성한 이미지, B의 진폭에 A의 위상을 붙여 재구성한 이미지다. 재구성한 두 장은 질감이 거칠어졌지만 위상을 준 쪽의 형체가 그대로 알아보인다.
그림 3. 왼쪽 두 패널은 원본 A·B, 오른쪽 두 패널은 진폭과 위상을 맞바꿔 재구성한 결과. 알아볼 수 있는 형체는 언제나 위상을 준 쪽을 따라간다.

그림 3의 세 번째와 네 번째 패널을 보면 상관계수가 가리킨 차이가 그림에서도 그대로 보인다. 표면의 질감과 대비는 거칠어졌지만, 무엇이 찍힌 사진인지는 위상을 준 쪽으로 읽힌다. 진폭이 어디서 왔는지는 거의 티가 나지 않는다.

이미지의 구조 정보는 진폭이 아니라 위상에 담겨 있다. 어떤 줄무늬를 얼마나 섞었느냐보다, 그 줄무늬들을 어디에 정렬했느냐가 형태를 결정한다.

이 결과는 스펙트럼을 보는 방식을 바꾼다. 우리가 스펙트럼이라고 부르며 들여다보는 그림은 대부분 진폭 쪽이다. 정작 형태를 결정하는 위상은 그림으로 그려도 잡음처럼 보여서 잘 읽히지 않는다. 눈에 잘 보이는 쪽과 정보를 많이 담은 쪽이 서로 다르다.

스펙트럼 문해력이 닿는 곳: 필터링부터 MRI까지

스펙트럼을 읽고 쓸 줄 알면 사진 편집이 달리 보이기 시작한다. 이미지를 손보는 작업이 곧 스펙트럼의 특정 자리를 지우거나 살리는 조작으로 바뀐다. 중심 근처의 원만 남기고 바깥을 0으로 지우면 촘촘한 성분이 사라져 그림이 흐려진다. 저역 통과 필터다. 반대로 중심을 지우고 바깥만 남기면 매끈한 면이 사라지고 경계선만 남는다. 고역 통과 필터이자 흔히 말하는 엣지 검출이다.

흑백 이미지 세 장을 나란히 놓은 비교. 왼쪽은 카메라를 든 사진가를 찍은 원본, 가운데는 저역 통과 마스크를 씌워 전체가 흐릿해진 결과, 오른쪽은 고역 통과 마스크를 씌워 사람과 삼각대의 윤곽선만 밝게 남은 결과다.
그림 4. 같은 이미지에 저역 통과(가운데)·고역 통과(오른쪽) 마스크를 씌운 결과. 스펙트럼의 어디를 지우느냐가 필터의 성격을 정한다.

그림 4가 그 둘이다. 흐림과 엣지 검출은 전혀 다른 기능처럼 보이지만, 스펙트럼에서는 지우는 자리만 반대인 같은 동작이다. 사진 앱의 흐림 정도 조절은 이 원의 반지름을 키우고 줄이는 일에 해당한다.

압축도 같은 틀로 설명할 수 있다. JPEG는 이미지를 8×8 조각으로 나눠 이산 코사인 변환(DCT)으로 성분을 구한 뒤, 앞에서 확인한 감쇠를 믿고 고주파 계수를 크게 버린다. 계수를 버린다는 것은 그 줄무늬를 빼고 나머지만 다시 합친다는 뜻이다.

JPEG가 고주파를 크게 버려도 사진이 멀쩡해 보이는 것은 두 가지가 겹친 덕이다. 하나는 앞에서 확인한 감쇠 — 애초에 고주파에는 에너지가 적다. 다른 하나는 사람 눈이 밝기의 미세한 고주파 변화에 둔감하다는 시각 특성이다. 버려도 티가 안 나는 것부터 버리는 것이 압축의 핵심이다.

잡음 제거도 마찬가지다. 스캔한 인쇄물의 무아레 무늬나 규칙적인 줄 잡음은 스펙트럼에서 몇 개의 튀는 점으로 뭉친다. 그 점만 골라 0으로 만들면 나머지는 그대로 둔 채 무늬만 걷어낼 수 있다. 어디를 지울지 고르는 일이 곧 필터를 설계하는 일이다.

가장 멀리 닿는 곳은 촬영 그 자체다. 자기공명영상(MRI)은 이미지를 먼저 찍고 스펙트럼을 계산하는 방식이 아니다. 처음부터 주파수 공간(k-space)에서 데이터를 한 점씩 측정하고, 그 값을 다 채운 뒤 역변환을 돌려 비로소 단면 영상을 만든다. 천문 간섭계도 순서가 같다. 여러 망원경이 받은 신호를 합쳐 하늘의 스펙트럼을 채우고, 역변환해서 영상을 얻는다.

스펙트럼은 이미지를 분석할 때 곁들이는 보조 도구가 아니다. 이미지를 적는 또 하나의 좌표계다. 병원의 MRI와 천문대의 간섭계는 그 좌표계에서 먼저 측정하고, 사람이 볼 영상은 나중에 만든다. 중심과 가장자리와 방향, 이 세 규칙만 알면 그 기계들이 무엇을 모으고 있는지도 같이 읽힌다.

더 읽기

  • A. V. Oppenheim, J. S. Lim, "The Importance of Phase in Signals," Proceedings of the IEEE, 69(5), 1981. — 위상이 이미지 구조를 결정한다는 스왑 실험의 원전.
  • D. J. Field, "Relations between the statistics of natural images and the response properties of cortical cells," Journal of the Optical Society of America A, 4(12), 1987. — 자연 이미지의 $1/f^2$ 통계.
  • R. C. Gonzalez, R. E. Woods, Digital Image Processing (4th ed.), 2018. — 2D DFT·주파수 영역 필터링의 표준 교과서.