08 · 압축 이론
이 문서가 답하는 질문: 손실 vs 무손실 압축은 무엇이 다르며, 엔트로피 코딩 / 변환 코딩 / 인지적 압축은 어떻게 결합되어 JPEG·WebP·AVIF가 되는가?
한 줄 답 (Pyramid Top)
모든 이미지 코덱은 (1) 변환으로 픽셀 간 상관 제거 → (2) 양자화로 인지적으로 덜 중요한 정보 버림 → (3) 엔트로피 코딩으로 통계적 중복 제거의 3단 파이프라인이고, 무손실은 (2)를 건너뛴다. “왜 압축이 되는가”의 근본은 사람 눈의 둔감성 + 데이터의 통계적 편향.
Why — 왜 압축이 가능한가
이미지 데이터에는 두 종류의 중복이 있다:
| 중복의 종류 | 예 | 활용 코덱 |
|---|---|---|
| 공간적 중복 | 인접 픽셀이 비슷한 값 | DCT, predictive coding |
| 통계적 중복 | 자주 나오는 값과 드문 값의 빈도 차이 | Huffman, Arithmetic |
| 인지적 중복 | 사람 눈이 못 보는 디테일 (고주파, 색차) | 양자화, 4:2:0 |
무손실 압축은 (1)+(3)만 사용 → 원본 비트와 100% 동일하게 복원. 손실 압축은 (1)+(2)+(3) → 사람 눈이 못 알아채는 정보를 버려 더 작은 파일.
How — 압축의 3단 파이프라인
1) 전체 흐름
2) 변환 코딩 (Transform Coding)
목적: 공간 도메인의 픽셀 값을 주파수 도메인으로 옮겨 대부분의 에너지를 소수의 계수에 모음.
| 변환 | 사용 코덱 | 특징 |
|---|---|---|
| DCT (Discrete Cosine Transform) | JPEG, MPEG, H.264, HEVC, AV1 | 8×8/16×16 블록, 빠름 |
| DWT (Discrete Wavelet Transform) | JPEG 2000 | 멀티해상도, 블록 노이즈 없음 |
| Predictive | PNG, WebP-LL | 이전 픽셀로 예측 → 차이만 코딩 |
| ADST (Asymmetric DST) | AV1 | 가장자리 블록에 적합 |
DCT의 핵심 효과
8×8 자연사진 블록의 DCT 후 계수:
[ 580, -45, 8, -2, 1, 0, 0, 0 ] <- DC + 저주파
[ -38, 12, -3, 1, 0, 0, 0, 0 ]
[ 5, -2, 1, 0, 0, 0, 0, 0 ]
[ -1, 0, 0, 0, 0, 0, 0, 0 ]
[ 0, 0, 0, 0, 0, 0, 0, 0 ]
[ 0, 0, 0, 0, 0, 0, 0, 0 ]
[ 0, 0, 0, 0, 0, 0, 0, 0 ]
[ 0, 0, 0, 0, 0, 0, 0, 0 ]→ 64개 값 중 대부분이 0 → 엔트로피 코딩이 매우 잘 동작.
3) 양자화 (Quantization) — 손실의 본질
원리: 작은 계수를 더 큰 단위로 반올림해서 0으로 만듦.
원본: 580 -45 8 -2 1
÷ Q: /16 /22 /16 /29 /51 (양자화 테이블)
양자화: 36 -2 0 0 0 (정수 반올림)
× Q: 576 -44 0 0 0 (역양자화)
오차: 4 1 8 2 1 (= 손실)핵심: 양자화 테이블이 각 주파수에 다른 Q를 적용 → 사람이 둔감한 고주파에 큰 Q.
4) 엔트로피 코딩 — 무손실 통계 압축
샤논의 정보 이론: 빈도 p인 심볼의 정보량 = -log₂(p) 비트.
| 알고리즘 | 사용 | 효율 (vs 이론적 최소) |
|---|---|---|
| Huffman | JPEG, PNG, GZIP | 1 비트 정수 단위 → 약 5~10% 손해 |
| Arithmetic | JPEG-AC, JBIG | 분수 비트 가능 → 거의 이론치 |
| CABAC | H.264, HEVC | Context-Adaptive — 이전 심볼로 확률 추정 |
| CDF / Range coder | AV1, AVIF | CABAC 변종, 더 빠름 |
| rANS (Asymmetric Numeral Systems) | JPEG XL, Zstd | 산술과 같은 효율, 더 빠름 |
Huffman 예시
심볼 빈도: A=50%, B=25%, C=12.5%, D=12.5%
A: 0 (1 비트)
B: 10 (2 비트)
C: 110 (3 비트)
D: 111 (3 비트)
평균: 0.5*1 + 0.25*2 + 0.125*3 + 0.125*3 = 1.75 비트/심볼
샤논 이론치: H = 1.75 비트 ← 정확히 일치 (이상적인 경우)5) 무손실 압축의 알고리즘
| 알고리즘 | 원리 | 사용 |
|---|---|---|
| LZ77 | 슬라이딩 윈도우 + 후방 참조 | DEFLATE, GZIP, PNG |
| LZ78 / LZW | 사전 구축 | GIF, TIFF |
| DEFLATE | LZ77 + Huffman | PNG, ZIP |
| Brotli | LZ77 + 정적 사전 + 컨텍스트 모델 | Web 텍스트, WOFF2 |
| Zstd | LZ77 변종 + FSE/rANS | 최신 무손실 |
PNG의 DEFLATE + Filter
PNG는 픽셀을 직접 DEFLATE하지 않고 5가지 필터 중 하나를 줄마다 적용:
Filter type:
0 = None
1 = Sub (왼쪽 픽셀과의 차이)
2 = Up (위 픽셀과의 차이)
3 = Average (왼쪽 + 위 평균과의 차이)
4 = Paeth (Paeth 예측자)→ 인접 픽셀의 차이는 0 근처에 몰려있어 DEFLATE가 잘 압축.
6) 인지적 압축 (Perceptual Compression)
사람 눈의 비선형성을 활용:
| 기법 | 활용 |
|---|---|
| YCbCr 변환 | 사람 눈은 색차에 둔감 |
| 4:2:0 서브샘플링 | 색 해상도 1/4로 |
| 양자화 테이블 가중치 | 고주파에 큰 Q |
| CSF (Contrast Sensitivity Function) | Guetzli, Butteraugli가 활용 |
| JND (Just Noticeable Difference) | 인지 임계점 이하 정보 제거 |
Butteraugli (Google, 2017): 두 이미지의 지각적 차이 점수.
- PSNR/SSIM은 픽셀 차이의 통계
- Butteraugli는 사람 눈 모델 시뮬레이션 → 더 정확한 품질 지표
- Guetzli, JPEG XL 인코더가 RD 최적화에 사용
What — 구체 비교
1) 같은 사진의 다양한 압축 결과
테스트: 4032×3024 사진, 무손실 PNG = 35 MB 기준.
| 코덱 | 모드 | 파일 크기 | 비율 | 시간 |
|---|---|---|---|---|
| PNG (libpng default) | 무손실 | 35 MB | 1.00× | 0.5s |
| PNG (oxipng -o6) | 무손실 | 28 MB | 0.80× | 60s |
| WebP (lossless) | 무손실 | 22 MB | 0.63× | 8s |
| JPEG XL (lossless) | 무손실 | 18 MB | 0.51× | 15s |
| AVIF (lossless) | 무손실 | 19 MB | 0.54× | 30s |
| JPEG (q=95) | 손실 | 2.8 MB | 0.08× | 0.4s |
| JPEG (q=85) | 손실 | 1.2 MB | 0.034× | 0.3s |
| WebP (q=85) | 손실 | 0.85 MB | 0.024× | 0.5s |
| AVIF (q=63) | 손실 | 0.55 MB | 0.016× | 4.5s |
→ 무손실은 약 1.5~2× 압축, 손실은 30~60× 압축 가능.
2) 압축률 vs 인코딩 비용 (Pareto Frontier)
파일 크기 (작을수록)
▲
1.0 ┤ ● JPEG (q=95, 0.4s)
│
0.5 ┤ ● JPEG (q=85)
│ ● WebP (q=85, 0.5s)
0.3 ┤
│ ● AVIF (q=63, cpu=8, 0.4s)
0.2 ┤
│ ● AVIF (q=63, cpu=6, 1.5s)
0.15 ┤
│ ● AVIF (q=63, cpu=4, 4.5s)
│ ● AVIF (cpu=0, 60s+)
└───────────────────────────────────► 인코딩 시간3) 무손실 압축 한계 — 샤논 엔트로피
랜덤 노이즈 이미지는 압축 불가능 — 샤논 엔트로피가 최대치. 실제 사진의 엔트로피는 픽셀 비트의 약 30~50% → 무손실 압축의 이론적 한계.
8bit RGB 픽셀: 24 bits/pixel
이론적 최소(무손실 사진): ~10 bits/pixel
실제 PNG: 12~16 bits/pixel
실제 WebP-LL: 8~12 bits/pixel4) Block-based vs Wavelet 비교
| 특성 | DCT (8×8 블록) | Wavelet (JPEG 2000) |
|---|---|---|
| 압축률 (높은 품질) | 비슷 | 비슷 |
| 압축률 (낮은 품질) | 블록 노이즈 강함 | 블러 (자연스러움) |
| 점진적 디코딩 | 제한적 | 자연스러움 (해상도 단계) |
| 구현 복잡도 | 단순 | 복잡 |
| 보급률 | 표준 | 거의 안 씀 |
→ Wavelet이 기술적으로 우월하지만 DCT가 빠르고 단순해서 표준화 승리.
What-if — 압축 이론을 잘못 적용하면
함정 1) 무손실에 양자화 적용
증상: WebP quality 100이 무손실이 아님.
원인: WebP의 lossy 모드는 quality 100이어도 양자화 통과 → 미세 손실.
대응: 명시적으로 lossless 모드 사용 (cwebp -lossless 또는 image/webp lossless).
함정 2) JPEG 무손실 가능?
JPEG 표준에는 *lossless mode (SOF3)*이 있지만 거의 미지원. 실제로 JPEG = 항상 손실.
무손실이 필요하면 JPEG XL 무손실 변환:
cjxl input.jpg output.jxl --lossless_jpeg=1 # JPEG → JXL 무손실
djxl output.jxl decoded.jpg # JXL → JPEG 비트 동일 복원함정 3) 그라디언트에 무손실 압축 → 큰 파일
증상: 단순 그라디언트 PNG가 1MB.
원인: PNG의 DEFLATE는 반복 패턴에 강하지만 그라디언트의 연속 변화는 잘 압축 못함.
대응: 그라디언트는 SVG로 (벡터) 또는 작은 JPEG.
함정 4) 압축 알고리즘을 직렬로 적용
증상: PNG를 ZIP으로 압축 → 거의 안 줄어듦.
원인: PNG는 이미 DEFLATE로 압축됨. 같은 알고리즘 두 번 적용은 의미 없음.
→ 이미 압축된 데이터는 더 압축되지 않음 (엔트로피가 이미 높음).
함정 5) Q-table을 임의로 변경 → 디코더가 못 읽음
증상: 양자화 테이블 커스텀하니 일부 디코더가 깨짐.
원인: 일부 임베디드 디코더가 표준 Q-table만 가정.
대응: 표준 Q-table에 factor만 곱한 변형 사용 (mozjpeg가 이렇게 함).
Insight — 압축 이론의 짧은 역사
“샤논의 1948년이 모든 것의 시작”
Claude Shannon의 A Mathematical Theory of Communication (1948)이 엔트로피 = 정보량의 한계를 증명. 이전에는 “얼마나 압축할 수 있는지”의 한계조차 없었다. 모든 후속 압축 알고리즘은 샤논 한계에 얼마나 가까이 가느냐의 경쟁.
“DCT의 역설 — 1972년 발견되었지만 1992년에야 표준화”
Discrete Cosine Transform은 Ahmed·Natarajan·Rao (1974)가 발견. 그러나 1992년 JPEG이 표준화될 때까지 20년이 걸린 이유: 계산량. 8×8 DCT 한 번에 곱셈 64회 + 덧셈 — 1980년대 PC로는 1초에 몇 블록뿐. 1990년대 초 PC가 충분히 빨라지자 비로소 실용화.
“Huffman은 1952년 학생 과제에서 나왔다”
David Huffman이 MIT 박사과정 시절 “학기말 과제 vs 시험” 중 과제를 선택. 정보 이론 수업의 과제: “가변길이 부호의 평균 길이를 최소화하는 방법”. 일주일 만에 해법을 찾음 → 그것이 Huffman 코딩. 70년 후에도 모든 ZIP, PNG, JPEG 안에서 작동 중.
“AV1의 CDF는 산술 코딩의 진화”
1979년 Witten et al.이 산술 코딩 발표 → 이론적으로 최적이지만 특허에 묶임. 2010년대 특허 만료 → AV1이 CDF (Cumulative Distribution Function) 기반 entropy coder 자유롭게 사용. 결과: AV1이 H.265보다 ~5% 더 압축되는 결정적 요인.
“무손실 압축의 한계는 데이터의 통계가 아니라 사람의 패턴 인식이다”
진정한 무손실 한계는 콜모고로프 복잡도 — “이 데이터를 만드는 가장 짧은 프로그램”. 현실의 무손실 알고리즘은 통계적 중복만 활용 → 항상 한계가 있음. 그래서 같은 사진을 BMP/PNG/JPEG XL로 저장하면 점점 작아지는 것.
한 단락 요약
압축 = (1) 변환으로 데이터의 상관을 제거 → (2) 양자화로 인지적 잉여를 버림 → (3) 엔트로피 코딩으로 통계적 잉여를 제거의 3단 파이프라인이고, 무손실은 (1)+(3), 손실은 (1)+(2)+(3)이다. 모든 이미지 코덱(JPEG/WebP/AVIF/JPEG XL)은 이 세 단계 각각에서 얼마나 똑똑한 알고리즘을 쓰느냐의 경쟁이다. 더 큰 변환 블록, 더 정교한 양자화 모델, 더 효율적인 엔트로피 코더가 5% 더 작은 파일을 만든다.