DCT(Discrete Cosine Transform)는 신호를 코사인 함수의 합으로 표현하여 주파수 영역으로 변환하는 기법이다.
핵심 아이디어
시간/공간 영역의 데이터를 주파수 영역으로 변환하면:
- 에너지가 저주파 성분에 집중됨
- 고주파 성분(세부 정보)을 제거해도 인지적 품질 유지
- 손실 압축의 핵심 원리
DCT vs DFT(Fourier Transform)
| 구분 | DCT | DFT |
|---|---|---|
| 출력 | 실수 | 복소수 |
| 에너지 집중 | 더 좋음 | 분산됨 |
| 경계 효과 | 적음 | 있음 (불연속) |
| 용도 | 압축 (JPEG, MP3) | 분석, 필터링 |
DCT는 신호가 경계에서 미러링된다고 가정하여 불연속성 문제를 해결한다.
활용 사례
1. JPEG 이미지 압축
원본 이미지 → 8x8 블록 분할 → DCT → 양자화 → 엔트로피 코딩
- 8x8 픽셀 블록마다 2D-DCT 적용
- 좌상단(저주파) = 전체 밝기, 우하단(고주파) = 세부 디테일
- 고주파 계수를 0으로 양자화하여 압축
2. pHash (Perceptual Hash)
이미지 축소 → 그레이스케일 → DCT → 저주파 계수만 추출 → 해시 생성
- 저주파 성분만 사용하여 이미지의 "본질"을 캡처
- pHash(perceptual hash)는 같은 사진을 찾는데 유용하다.
- Hamming Distance는 두 데이터 간의 차이를 비트 단위로 측정한다.
3. MFCC (음성 인식)
음성 → FFT → Mel Filter Bank → Log → DCT → MFCC
- Mel Spectrogram에 DCT를 적용하여 Cepstral 계수 추출
- Cepstral Analysis은 배음 구조를 찾게 해준다.
4. MP3/AAC 오디오 압축
- MDCT(Modified DCT) 사용
- 인간이 듣지 못하는 고주파 제거
2D-DCT 시각화 (8x8 기준)
DC ← 저주파 → 고주파
↑ [■□□□□□□□] DC: 평균 밝기
저 [□□□□□□□□]
주 [□□□□□□□□] 저주파: 점진적 변화
파 [□□□□□□□□]
↓ [□□□□□□□□]
고 [□□□□□□□□]
주 [□□□□□□□□] 고주파: 급격한 변화, 엣지
파 [□□□□□□□□]
구현 (Python)
import numpy as np
from scipy.fftpack import dct, idct
# 1D DCT
signal = np.array([1, 2, 3, 4, 5, 6, 7, 8])
dct_coeffs = dct(signal, type=2, norm='ortho')
# 2D DCT (이미지용)
def dct2(block):
return dct(dct(block.T, norm='ortho').T, norm='ortho')
def idct2(block):
return idct(idct(block.T, norm='ortho').T, norm='ortho')
왜 압축에 효과적인가?
- 에너지 압축: 대부분의 정보가 소수의 저주파 계수에 집중
- 인지적 특성: 인간은 고주파 변화에 덜 민감
- 효율적 양자화: 중요하지 않은 계수를 0으로 만들어 엔트로피 감소