이미지 압축

편집 역사 토론
소프트웨어 컴퓨터 그래픽스 마지막 수정: 2026-08-31 04:26:41

1. 개요[편집]

이미지 압축
Image Compression
두 갈래무손실(완전 복원) / 손실(왜곡 허용)
이론적 한계무손실은 엔트로피 $H(X)$, 손실은 $R(D)$
고전 파이프라인색공간 → 서브샘플링 → 변환 → 양자화 → 엔트로피 부호화
대표 표준PNG · JPEG · JPEG2000 · WebP · AVIF · JPEG XL
과학 데이터 쪽ZFP · SZ · MGARD — 오차 한계를 보장하는 손실 압축
평가PSNR · SSIM · VMAF — 전부 사람 눈의 근사일 뿐

픽셀은 이웃과 닮았다. 닮은 만큼은 안 보내도 된다. 압축의 전부가 이 한 문장이다.

이미지 압축영상 데이터의 통계적 중복과 지각적 잉여를 제거해 저장·전송에 필요한 비트 수를 줄이는 기술이다. 줄이는 대상이 셋으로 나뉜다는 점을 먼저 잡아야 한다.

  • 공간 중복 — 이웃 화소가 서로 닮았다. 예측과 변환으로 없앤다.
  • 부호 중복 — 자주 나오는 기호에 짧은 부호를 안 주고 있다. 엔트로피 부호화로 없앤다.
  • 지각적 잉여 — 사람 눈이 어차피 못 보는 성분이 들어 있다. 버린다. 여기서부터 손실 압축이다.

앞의 둘만 건드리면 무손실(lossless), 세 번째까지 손대면 손실(lossy)이다. 이 분기가 압축 세계의 가장 근본적인 갈림길이고, 각 갈래에는 각자의 넘을 수 없는 선이 하나씩 있다 — 무손실은 원천의 엔트로피, 손실은 율-왜곡 이론R(D)R(D) 곡선이다.

2. 무손실 압축[편집]

무손실 압축기의 구조는 거의 예외 없이 예측기 + 엔트로피 부호기다. 화소값 자체는 0~255에 넓게 퍼져 있어 엔트로피가 높지만, 이웃으로부터의 예측 잔차는 0 근처에 뾰족하게 몰린 라플라스 분포에 가까워 엔트로피가 뚝 떨어진다.

  • PNG. 주사선마다 다섯 가지 필터(None/Sub/Up/Average/Paeth) 중 하나를 골라 잔차를 만들고, 그 결과를 DEFLATE(LZ77 + 허프만)로 압축한다. Paeth 예측기는 왼쪽·위·왼쪽위 세 화소로 선형 예측한 뒤 그중 가장 가까운 값을 고르는 방식으로, 에지에서 예측이 무너지는 것을 막는다. 필터 선택은 주사선 단위로 자유라, 인코더가 다섯 가지를 다 시도해 보고 잔차 절댓값 합이 최소인 것을 고르는 휴리스틱이 표준이다.
  • 무손실 JPEG / JPEG-LS. 원래 JPEG 표준에도 DCT를 쓰지 않는 순수 예측 모드가 있었지만 아무도 안 썼고, 1999년의 JPEG-LS(LOCO-I)가 사실상의 후계자다. MED(median edge detector) 예측기로 수직·수평 에지를 자동 판별하고, 국소 기울기로 문맥을 나눈 뒤 골룸-라이스 부호를 쓴다. 산술부호화 없이도 당대 최고 수준의 압축률을 냈고 계산량이 극히 가볍다.
  • 엔트로피 부호기 자체. 허프만 부호화는 기호당 정수 비트라는 원리적 손실이 있고, 그 손실을 없앤 것이 산술 부호화다. 특허 문제로 20년쯤 발이 묶였다가 만료된 뒤, 지금은 ANS(비대칭 수 체계) 계열이 Zstandard와 JPEG XL에서 “산술부호화 수준의 압축률에 허프만 수준의 속도”를 내며 표준 자리를 차지했다.

현실적인 압축률은 자연 사진 기준 PNG로 1.52배 정도다. 손실 압축이 같은 화질 인상에서 1030배를 뽑는 것과 비교하면 초라해 보이지만, 원본이 훼손되면 안 되는 곳(의료 원본, 위성 원시 데이터, 텍스처 아틀라스의 알파, 스크린샷·도면 같은 인공 영상)에서는 선택지가 없다.

3. JPEG 파이프라인[편집]

1992년 표준이고 30년 넘게 왕좌를 지키고 있는 물건이다. 단계마다 왜 그런지가 분명해서 교과서로도 완벽하다.

  1. 색공간 변환. RGB를 YCbCrY'C_bC_r 로 바꾼다. 사람 눈은 휘도에 훨씬 민감하고 색차에 둔하다는 사실을 쓰기 위한 준비 단계이며, 동시에 세 채널의 상관도 크게 줄인다.
  2. 크로마 서브샘플링. Cb,CrC_b, C_r 을 절반으로 줄인다(4:2:0이면 가로·세로 각 1/2, 즉 색차 데이터가 1/4). 이 한 단계만으로 이미 절반이 날아가고, 그 대가는 대개 눈에 안 띈다. 단 빨간 글자나 채도 높은 선에서는 확 티가 나며, 그래서 스크린샷을 JPEG로 저장하면 안 되는 것이다.
  3. 8×8 이산 코사인 변환. 화소를 주파수 좌표로 옮겨 에너지를 좌상단에 몰아넣는다. 여기까지는 무손실.
  4. 양자화. X^uv=round(Xuv/Quv)\hat X_{uv} = \operatorname{round}(X_{uv}/Q_{uv}). 정보가 버려지는 곳은 오직 여기뿐이다. 양자화표는 고주파일수록 눈금이 굵고, 품질 계수는 이 표 전체에 스케일을 곱한다.
  5. 지그재그 스캔 + 런길이. 계수를 주파수 오름차순으로 훑으면 고주파 0들이 뒤로 몰리고, 연속된 0을 (런 길이, 값) 쌍으로 접은 뒤 남은 꼬리는 EOB 하나로 끝낸다.
  6. 허프만 부호화. DC는 이전 블록과의 차분을, AC는 (런, 크기) 쌍을 부호화한다.

이 구조는 이후 모든 코덱의 원형이 됐다. 동영상 코덱은 여기에 화면 간 예측(움직임 보상)을 얹은 것이고, 정지영상 코덱은 여기에 화면 내 예측(인트라 예측)을 얹은 것이다.

4. 웨이블릿과 EBCOT — JPEG2000[편집]

블록 DCT의 고질병인 블록 경계 아티팩트1를 없애려면 블록을 안 쓰면 된다. JPEG2000이 그 길을 갔다. 영상 전체에 웨이블릿 변환을 걸고(손실은 CDF 9/7, 무손실은 정수 계수 르갈 5/3), 나온 계수를 64×64 정도의 코드블록 단위로 잘라 EBCOT(embedded block coding with optimized truncation)으로 부호화한다.

EBCOT의 요점은 두 층이다.

  • Tier-1. 코드블록마다 비트평면을 위에서 아래로 세 번의 패스(유의도 전파 → 크기 정련 → 정리)로 훑으며 문맥 기반 산술부호화한다. 결과는 내장(embedded) 비트열 — 앞에서 아무 데서나 잘라도 그 지점까지의 품질로 복호가 된다.
  • Tier-2. 각 코드블록의 비트열을 어디서 자를지를 전역 율-왜곡 최적화로 정한다. 라그랑주 J=D+λRJ = D + \lambda R 를 코드블록마다 풀어 기울기가 같아지는 절단점을 고르는, 교과서적인 RDO다.

덕분에 한 번 인코딩한 파일에서 임의의 비트율·해상도·화질·관심영역을 잘라 낼 수 있다. 기술적으로는 완승에 가까웠는데 시장에서는 졌다. 계산량이 무겁고 특허 지형이 지저분했으며 결정적으로 브라우저가 받아 주지 않았다. 지금은 디지털 시네마(DCP), 의료영상(DICOM), 위성·문서 아카이브라는 성채에서 살아남아 있다.

5. 현대 코덱 — 인트라 예측의 시대[편집]

WebP·AVIF·JPEG XL이 JPEG보다 잘하는 것의 핵심은 변환이 아니라 예측이다. 블록을 변환하기 전에 이미 복호된 위·왼쪽 이웃 화소로 그 블록을 먼저 그려 보고, 틀린 만큼(잔차)만 변환·부호화한다. 평탄한 영역이나 방향성 질감에서 잔차가 거의 0이 되므로 압축률이 계단식으로 좋아진다.

코덱뿌리특징
WebPVP8 키프레임4×4/16×16 방향성 인트라, 정수 DCT + WHT. 무손실 모드는 별도 설계
AVIFAV1 키프레임수십 가지 방향성 인트라 모드, CfL(휘도로 색차 예측), 가변 블록, 필름그레인 합성
JPEG XL신규 설계가변 크기 DCT(2×2~256×256) + 모듈러 무손실 모드, XYB 색공간, 적응 양자화

JPEG XL에는 재미있는 기능이 하나 더 있다. 기존 JPEG 파일을 화소 단위로 완전히 복원 가능하게 재압축해 20% 정도를 더 줄인다. 이미 세상에 존재하는 수조 장의 JPEG를 화질 손실 없이 줄일 수 있다는 뜻이라 아카이브 쪽에서 특히 반겼다.

신경망 압축은 다른 계보다. 인코더-디코더 신경망이 영상을 잠재 표현으로 보내고, 학습된 엔트로피 모형(하이퍼프라이어, 문맥 모형)이 그 잠재값의 확률을 예측해 산술부호화한다. 목적함수가 대놓고 L=R+λD\mathcal{L} = R + \lambda D 라서 변분 오토인코더의 ELBO와 구조가 같다. 낮은 비트율에서 지각 품질이 인상적인데, 그 이유의 상당 부분이 “없던 디테일을 그럴듯하게 지어내기” 때문이라는 것이 율-왜곡-지각 이론이 밝힌 바다. 계측·판독 용도에서는 이게 기능이 아니라 결함이다.

6. 화질은 어떻게 재는가[편집]

PSNR은 평균제곱오차를 데시벨로 바꾼 값이다.

PSNR=10log10MAX2MSE\mathrm{PSNR} = 10\log_{10}\frac{\mathrm{MAX}^2}{\mathrm{MSE}}

계산이 싸고 미분 가능해서 코덱 내부 최적화(RDO)에는 이만한 것이 없다. 문제는 사람 눈과 상관이 별로 없다는 것이다. 영상 전체를 1만큼 밝게 해도 PSNR은 뚝 떨어지지만 눈에는 아무 차이가 없고, 반대로 에지에 링잉이 살짝만 껴도 눈에는 확 보이는데 PSNR은 멀쩡하다.

SSIM은 국소 창에서 밝기·대비·구조를 따로 비교해 곱한다. 구조 왜곡에 민감해 PSNR보다는 낫지만, 만능은 아니다 — 흐림에 관대하고, 값의 스케일이 왜곡 종류에 따라 달라 서로 다른 코덱을 한 줄로 세우기가 어렵다. 그래서 MS-SSIM, VMAF, butteraugli 같은 것들이 계속 나오지만, 이들은 대개 볼록하지도 가법적이지도 않아 코덱 내부의 라그랑주 최적화를 깨뜨린다. 실무의 타협은 늘 같다 — 최적화는 MSE로, 평가는 지각 척도로, 최종 판정은 사람 눈으로.

율-왜곡 곡선을 그려 코덱을 비교하는 표준 방법이 BD-rate(Bjøntegaard delta rate)다. 두 곡선을 로그 비트율 축에서 적분해 “같은 화질을 내는 데 비트율이 몇 % 차이 나는가”를 낸다. 한 점에서의 PSNR 비교가 얼마나 쉽게 조작되는지를 알기에 만들어진 지표다.

7. 시뮬레이션 데이터 압축[편집]

여기서부터가 이 위키의 본진이다. 압축 문제는 사진에만 있는 게 아니라 전산유체역학 체적장에 훨씬 심각하게 있다.

숫자로 감을 잡자. 409634096^3 격자의 속도 3성분을 배정밀도로 한 번 저장하면 약 1.6 TB다. 난류 통계를 뽑으려고 1000 스냅숏을 남기면 페타바이트 단위가 된다. 그런데 지난 20년간 연산 성능은 수천 배 늘었는데 I/O 대역폭은 수십 배 늘었을 뿐이다. 그래서 대규모 해석의 병목은 계산이 아니라 “결과를 디스크에 쓰는 시간”이 된 지 오래다.2

부동소수 무손실 압축은 답이 아니다. 배정밀도 실수의 가수 하위 비트는 사실상 난수라, gzip이든 Zstd든 1.11.3배가 고작이다. 유효숫자 16자리 중 물리적으로 의미 있는 것은 대개 46자리인데 나머지를 정직하게 다 보관하느라 대역폭을 버리고 있는 셈이다. 그래서 오차 한계를 보장하는 손실 압축이 등장했다.

  • ZFP(Lindstrom, LLNL). 배열을 4d4^d 블록(3차원이면 4×4×4 = 64개 값)으로 자르고, 블록 안에서 지수를 공통으로 맞춘 뒤 정수 리프팅 변환으로 탈상관하고, 계수를 비트평면 단위로 내장 부호화한다. 강점은 모드에 있다 — 고정 비트율 모드는 블록마다 비트 수가 일정해서 압축된 상태로 랜덤 접근이 되고(메모리에 올려 둔 채로 인덱싱이 가능하다는 뜻), 고정 정확도 모드는 절대오차 한계를, 가역 모드는 무손실을 보장한다.
  • SZ(Di · Cappello, Argonne). 예측 기반이다. 로렌초 예측기나 다차원 회귀로 각 격자점을 이웃에서 예측하고, 예측 잔차를 사용자가 준 오차 한계 안에서 균일 양자화한 뒤 허프만 + Zstd로 마무리한다. 예측이 심하게 빗나가는 점은 “예측 불가”로 표시하고 원값을 따로 저장해 한계를 지킨다. 절대·상대·점별상대·PSNR 기준을 골라 걸 수 있다.
  • MGARD(ORNL). 다중격자 계층 분해로 압축하되, 오차 한계를 원 데이터뿐 아니라 선형 관심량(QoI)에 대해서도 수학적으로 보장한다는 것이 차별점이다. “속도장의 오차를 10310^{-3} 로 눌렀다”가 아니라 “이 적분량의 오차를 10310^{-3} 로 눌렀다”를 약속할 수 있다.

현실적으로 CFD·기후·연소 데이터에서 상대오차 10310410^{-3}\sim10^{-4} 정도를 허용하면 10~100배가 나온다. 문제는 다음 질문이다.

화소값의 오차를 눌렀다는 것이, 내가 정말 보고 싶은 물리량의 오차도 눌렀다는 뜻인가?

대체로 아니다. 압축 오차는 고주파에 몰리는데, 와도는 속도의 미분이고 미분은 고주파를 증폭한다. 점별 오차 한계 10310^{-3} 이 와도장에서는 훨씬 커지고, 에너지 스펙트럼의 관성영역 기울기가 미묘하게 틀어지며, 위상학적 특징(임계점, 와핵 골격)이 없던 자리에 생기거나 있던 자리에서 사라지기도 한다. 그래서 압축기를 도입할 때는 반드시 자기 QoI에 대해 별도로 검증해야 하고, 이것이 MGARD 같은 QoI 보장 압축기가 나온 이유다.3

쓰이는 자리는 크게 셋이다.

  • 체크포인트·재시작. 대형 해석은 주기적으로 상태를 통째로 덤프한다. 손실 압축을 쓰면 덤프가 빨라지지만, 카오스계에서는 미세한 섭동이 지수적으로 자라 재시작 궤적이 갈라진다. 그래서 “궤적 재현이 목적인 체크포인트는 무손실, 통계·시각화가 목적인 스냅숏은 손실”로 이원화하는 것이 국룰이다.
  • 인시추 시각화·해석. 아예 디스크를 거치지 않고 해석이 도는 중에 메모리에서 바로 시각화하거나 통계를 뽑는다. 이때도 노드 간 전송과 임시 보관에 압축이 붙는다.
  • 후처리 아카이브. 논문용 데이터셋 공개, 장기 보관. 여기서는 재현성 때문에 오차 한계를 메타데이터로 함께 박아 두는 것이 예의다.

압축 말고 표현 자체를 줄이는 길도 있다는 것을 덧붙여 둔다. 적응 격자 세분화는 애초에 필요한 곳에만 셀을 두는 “격자 수준의 압축”이고, 축소차수모델특이값 분해로 뽑은 소수의 모드 계수만 남기는 “물리 수준의 압축”이다. 후자는 사실 주성분 분석 = KLT를 체적장에 그대로 적용한 것이라, 8×8 DCT가 하는 일과 원리가 똑같다. 스케일만 다를 뿐.

8. 관련 문서[편집]

9. Footnotes[편집]

  1. JPEG의 8×8 블록 경계가 눈에 보이는 이유는 블록마다 DC 계수의 양자화 오차가 독립이기 때문이다. 인접 블록의 평균 밝기가 눈금 하나만큼 어긋나도 사람 눈은 그 계단을 기가 막히게 잡아낸다. 마하 밴드 효과 덕에 실제 차이보다 더 크게 보이기까지 한다. 눈이 좋아서 서러운 순간.

  2. “그냥 원본 다 저장하면 안 되나요”라는 질문에 대한 답은 대체로 돈이다. 사진 한 장은 그렇게 해도 되지만, 엑사스케일 해석 한 번이 뱉는 데이터를 무손실로 다 남기면 스토리지 비용이 계산 비용을 넘어선다. 그 지점에서 압축은 최적화가 아니라 가능/불가능의 문제가 된다.

  3. 이 함정은 실전에서 꽤 아프게 겪는다. “압축률 50배에 상대오차 1e-4”라는 벤치마크 숫자를 믿고 난류 스냅숏을 압축해 보관했는데, 나중에 스펙트럼을 그려 보니 고파수 쪽 꼬리가 압축기의 양자화 잡음으로 덮여 있더라는 식이다. 검증 방법은 단순하다 — 원본이 아직 있을 때 압축·복원한 데이터로 최종 그림·표를 다시 만들어 원본 것과 겹쳐 본다. V&V 정신은 압축기에도 똑같이 적용된다.