.JPG 포맷은 어떻게 작동하는가 *인간 인지를 통한 이미지 압축 이해*
Source: Dev.to
JPG 포맷은 어떻게 작동할까? 인간 인지를 통한 이미지 압축 이해
JPEG(또는 JPG)는 오늘날 가장 널리 사용되는 이미지 압축 포맷 중 하나이며, 사진을 웹에 올리거나 디지털 카메라에서 저장할 때 흔히 마주하게 됩니다. 이 글에서는 JPEG가 왜 그리고 어떻게 작동하는지, 특히 인간 시각 시스템에 기반한 압축 기법을 중심으로 살펴보겠습니다.
1. 인간 시각 시스템과 압축
1.1 인간 눈은 색상을 어떻게 인식할까?
- 삼원색(레드, 그린, 블루): 인간의 망막에는 L(긴 파장), M(중간 파장), S(짧은 파장) 라는 세 종류의 원추세포가 있어 색을 감지합니다.
- 채도와 명도: 인간은 색상의 **채도(채도)**와 **명도(밝기)**를 색상 자체보다 더 민감하게 구분합니다.
1.2 인간 눈은 세부 정보를 어떻게 처리할까?
- 주변 시야 vs 중심 시야: 시야 중심(황반)에서는 고해상도 정보를 처리하지만, 주변부에서는 저해상도 정보를 주로 사용합니다.
- 주파수 감도: 인간은 저주파(큰 구조) 정보를 고주파(미세 디테일)보다 더 잘 인식합니다.
핵심 포인트: JPEG는 이러한 인간 시각 특성을 활용해 눈에 덜 띄는 정보를 과감히 버립니다.
2. JPEG 압축 파이프라인
아래는 JPEG 압축 과정의 전형적인 흐름도입니다.
flowchart TD
A[입력 이미지 (RGB)] --> B[색 공간 변환 (YCbCr)]
B --> C[블록 분할 (8x8 픽셀)]
C --> D[이산 코사인 변환 (DCT)]
D --> E[양자화 (Quantization)]
E --> F[엔트로피 코딩 (Huffman / RLE)]
F --> G[압축된 JPEG 파일]
2.1 색 공간 변환 (RGB → YCbCr)
- Y(휘도): 밝기 정보를 담고, 인간이 가장 민감하게 인식합니다.
- Cb, Cr(색차): 색 차 정보를 담으며, 인간은 휘도보다 색 차에 덜 민감합니다.
- 채도 다운샘플링: 일반적으로 4:2:0, 4:2:2 같은 비율로 Cb와 Cr을 샘플링해 데이터 양을 줄입니다.
2.2 8×8 블록으로 나누기
이미지는 8×8 픽셀 블록으로 나뉘며, 각 블록은 독립적으로 처리됩니다. 이는 DCT가 효율적으로 작동하도록 하기 위함입니다.
2.3 이산 코사인 변환 (DCT)
- 공간 도메인(픽셀 값)을 주파수 도메인으로 변환합니다.
- 블록의 좌측 상단에 위치한 DC 계수는 평균 밝기를 나타내고, 나머지 AC 계수는 변화량(고주파)을 나타냅니다.
2.4 양자화 (Quantization)
Quantized = round(DCT_coeff / Quantization_Table)
- 인간이 덜 민감한 고주파 AC 계수는 큰 양자화 스텝을 사용해 더 많이 버립니다.
- 양자화 테이블은 품질 설정에 따라 달라지며, 품질이 높을수록 작은 스텝을 사용합니다.
2.5 엔트로피 코딩
- 런-길이 인코딩(RLE): 연속된 0을 압축합니다.
- 허프만 코딩: 빈도가 높은 심볼에 짧은 비트를 할당해 전체 비트 수를 최소화합니다.
3. JPEG 디코딩 (복원) 과정
디코딩은 위 과정을 역순으로 수행합니다.
- 허프만 디코딩 → RLE 복원
- 양자화 역변환 (양자화 테이블을 사용해 원래 DCT 계수 근사값을 복원)
- 역 DCT (주파수 → 공간)
- 블록 결합 → 색 공간 역변환 (YCbCr → RGB)
디코딩 과정에서도 손실이 발생합니다. 특히 양자화 단계가 비가역적이기 때문에 원본 이미지와 완전히 동일하게 복원되지 않습니다.
4. 실용적인 팁
| 상황 | 권장 JPEG 품질 설정 | 이유 |
|---|---|---|
| 웹 페이지 썸네일 | 60~70 | 파일 크기를 크게 줄이면서 눈에 띄는 품질 저하 없음 |
| 인쇄용 고해상도 사진 | 90~100 | 디테일 보존 필요 |
| 모바일 앱에서 실시간 전송 | 50~60 | 네트워크 대역폭 절감 |
- 프로그레시브 JPEG: 여러 스캔을 통해 저해상도부터 점진적으로 품질을 높여 보여줍니다. 느린 네트워크 환경에서 유용합니다.
- Exif 메타데이터: JPEG 파일에 사진 촬영 정보가 포함될 수 있으니, 개인정보 보호가 필요할 경우 메타데이터를 제거하세요.
5. JPEG와 다른 포맷 비교
| 포맷 | 손실/무손실 | 주요 사용 사례 | 장점 | 단점 |
|---|---|---|---|---|
| JPEG | 손실 | 사진, 웹 이미지 | 높은 압축률, 널리 지원 | 품질 저하, 색상 변형 |
| PNG | 무손실 | 아이콘, 로고, 투명 이미지 | 품질 유지, 알파 채널 | 파일 크기 큼 |
| WebP | 손실/무손실 | 웹 최적화 | JPEG보다 25~35% 작은 파일 | 구형 브라우저 호환성 이슈 |
| HEIF/HEIC | 손실/무손실 | 최신 스마트폰 사진 | 뛰어난 압축 효율 | 지원 범위 제한 |
6. 결론
JPEG는 인간 시각 시스템을 모델링한 양자화와 주파수 기반 변환을 결합해 효율적인 이미지 압축을 구현합니다. 이해를 돕기 위해 핵심 단계들을 살펴보았으며, 실제 작업에 적용할 수 있는 팁도 제공했습니다.
요약: JPEG는 인간이 눈치채기 어려운 정보를 과감히 버리는 방식으로, 높은 압축률과 적당한 품질을 동시에 달성합니다. 이 원리를 알면 이미지 품질을 조절하거나, 다른 포맷과 비교할 때 더 현명한 선택을 할 수 있습니다.
JPG가 이렇게 잘 작동하는 이유
Joint Photographic Experts Group (JPG) 형식은 1992년에 도입되었으며, 다음과 같은 간단한 통찰에 기반합니다:
인간의 눈은 색상의 변화보다 밝기 변화에 훨씬 더 민감하다.
현대 카메라 센서는 우리 눈이 인식할 수 있는 것보다 훨씬 많은 정보를 포착합니다. JPG 압축은 이 차이를 이용해 파일 크기를 크게 줄이면서도 인지되는 이미지 품질을 유지합니다.
JPG 압축의 핵심 단계
-
색 공간 변환
- 이미지는 일반적으로 RGB(Red, Green, Blue) 형태로 저장됩니다.
- JPG는 RGB를 YCbCr 로 변환하여 밝기와 색상을 분리합니다:
- Y → 휘도(밝기)
- Cb → 파란색 크로마
- Cr → 빨간색 크로마
이 분리를 통해 알고리즘은 인간이 가장 눈에 띄는 밝기를 보존하면서 색상 데이터를 더 공격적으로 압축할 수 있습니다.
-
블록 분할
- 이미지는 보통 8 × 8 픽셀 크기의 작은 블록으로 나뉩니다.
- 각 블록은 독립적으로, 그리고 지역적인 디테일에 따라 서로 다른 수준으로 압축될 수 있습니다.
- 과도한 압축은 눈에 보이는 블록 아티팩트를 생성할 수 있습니다.
-
이산 코사인 변환 (DCT)
- 각 블록은 코사인 기반 변환을 거쳐 주파수 성분으로 변환됩니다.
- 저주파 → 부드러운 영역(매우 중요)
- 고주파 → 세밀한 디테일(덜 눈에 띔)
이는 데이터를 효율적으로 감소시킬 준비를 합니다.
-
양자화 (손실 단계)
- 특히 고주파 색상 데이터의 정밀도를 낮춥니다.
- 눈에 잘 띄지 않을 정보를 버립니다.
- 중요한 값을 우선시하기 위해 지그재그 패턴으로 계수를 순회합니다.
- 이것이 JPG 압축의 유일한 실제 손실 단계이며, JPG를 반복 저장하면 시간이 지날수록 품질이 저하되는 이유입니다.
-
엔트로피 인코딩 및 재구성
- 압축된 데이터는 엔트로피 인코딩되어
.jpg파일에 담깁니다. - 디코딩 시 데이터는 다시 RGB로 변환됩니다.
- 결과 이미지가 우리에게는 “같아 보이지만” 실제 데이터 양은 크게 감소합니다.
- 압축된 데이터는 엔트로피 인코딩되어
블록 크기와 양자화의 영향
| 효과 | 작은 블록 | 큰 블록 |
|---|---|---|
| 디테일 | 디테일이 높고 파일이 커짐 | 압축률이 높아지지만 눈에 띄는 아티팩트 발생 |
| 일반적인 결과 | 섬세한 질감 보존에 유리 | 높은 압축 시 눈에 띄는 블록 현상 |
실제로 JPG는 ≈ 75 %의 색상 디테일을 버리는 동시에 휘도는 거의 손상되지 않도록 유지합니다—사진에 매우 적합한 트레이드‑오프입니다.
JPG vs. PNG – 빠른 비교
| Feature | JPG | PNG |
|---|---|---|
| Compression | Lossy (손실 압축) | Lossless (무손실 압축) |
| Transparency | ❌ 없음 | ✅ 있음 |
| Best for | 사진 | UI, 로고, 텍스트 |
| Typical file size | 더 작음 | 더 큼 |
PNG Variants
| Variant | Colour depth | Transparency | Typical use |
|---|---|---|---|
| PNG‑8 | 제한된 팔레트 (256색) | 단색 투명도 | 간단한 그래픽, 아이콘 |
| PNG‑32 | 수백만 색 | 진정한 알파 (전체 범위) | UI 요소, 고품질 그래픽 |
Colour Models: Light‑Based vs. Ink‑Based
| Model | Components | Interpretation |
|---|---|---|
| RGB (빛 기반) | 빨강, 초록, 파랑 | 검정 = 빛 없음, 흰색 = 전체 강도 |
| CMYK (잉크 기반) | 시안, 마젠타, 노랑, 검정 | 인쇄에 사용됨; RGB에서 색상 변환 필요 |
JPG/PNG는 화면‑중심 포맷이기 때문에 인쇄 전용이 아닙니다. 전문적인 출력물을 위해서는 인쇄‑준비 색상 공간(예: CMYK)으로 변환해야 합니다.
올바른 포맷 선택
| 사용 사례 | 권장 포맷 |
|---|---|
| 📸 사진 촬영 | JPG |
| 🎨 UI / 로고 / 투명도 | PNG |
| 🌐 대역폭에 민감한 앱 | JPG |
| 🖨️ 전문 인쇄 | 인쇄 전용 포맷으로 변환 (예: TIFF, PDF, 또는 CMYK 인코딩 PNG) |
JPG가 어떻게 작동하는지 이해하면 품질, 성능 및 저장 공간을 실제로 제어할 수 있습니다—단순히 내보내기 대화상자의 슬라이더가 아니라.
토론
프로젝트에서 JPG와 PNG 사이의 품질 차이를 눈치채신 적 있나요? 어떤 포맷을 주로 사용하시며—그 이유는 무엇인가요?