📁 File2. 이미지08 · 압축 이론

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, AV18×8/16×16 블록, 빠름
DWT (Discrete Wavelet Transform)JPEG 2000멀티해상도, 블록 노이즈 없음
PredictivePNG, 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 이론적 최소)
HuffmanJPEG, PNG, GZIP1 비트 정수 단위 → 약 5~10% 손해
ArithmeticJPEG-AC, JBIG분수 비트 가능 → 거의 이론치
CABACH.264, HEVCContext-Adaptive — 이전 심볼로 확률 추정
CDF / Range coderAV1, AVIFCABAC 변종, 더 빠름
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
DEFLATELZ77 + HuffmanPNG, ZIP
BrotliLZ77 + 정적 사전 + 컨텍스트 모델Web 텍스트, WOFF2
ZstdLZ77 변종 + 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 MB1.00×0.5s
PNG (oxipng -o6)무손실28 MB0.80×60s
WebP (lossless)무손실22 MB0.63×8s
JPEG XL (lossless)무손실18 MB0.51×15s
AVIF (lossless)무손실19 MB0.54×30s
JPEG (q=95)손실2.8 MB0.08×0.4s
JPEG (q=85)손실1.2 MB0.034×0.3s
WebP (q=85)손실0.85 MB0.024×0.5s
AVIF (q=63)손실0.55 MB0.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/pixel

4) 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% 더 작은 파일을 만든다.