03 · 비트심도와 HDR
이 문서가 답하는 질문: 8 vs 10 vs 12bit는 무엇이 다르고, 밴딩과 dithering은 어떻게 관련되며, HDR 이미지(HEIF의 HLG/PQ)는 SDR과 무엇이 다른가?
한 줄 답 (Pyramid Top)
비트심도는 한 채널이 가질 수 있는 단계 수이고, 이 수가 부족하면 그라디언트에 줄(밴딩)이 생긴다. HDR은 단순히 “밝다”가 아니라 더 넓은 다이내믹 레인지를 표현하기 위해 10bit + Rec.2020 + PQ/HLG의 3종 세트가 필요한 시스템이다.
Why — 왜 8bit로는 부족한가
8bit/채널(0~255) = 16.7M 색상이면 충분히 많아 보이지만, 두 가지 한계가 있다:
- 그라디언트 밴딩: 256단계는 부드러운 하늘·노을·그라디언트에 줄무늬를 만든다.
- HDR 표현 불가: 사람 눈은 약 14 stops(약 16,000:1)의 밝기 차이를 동시에 본다. 8bit sRGB는 약 8 stops(256:1) 정도.
How — 비트심도가 어떻게 작동하는가
1) 비트심도 비교
| 비트심도 | 채널당 단계 | RGB 색상 수 | 사용처 |
|---|---|---|---|
| 1bit | 2 | 8 (RGB) / 1 (mono) | 흑백 팩스, 1bit dither 아트 |
| 8bit | 256 | 16.7M (24bit color) | sRGB 표준, 일반 JPEG/PNG |
| 10bit | 1024 | 1.07B (30bit) | HDR10, Dolby Vision, Rec.2020 |
| 12bit | 4096 | 68.7B (36bit) | Dolby Vision 마스터, ProRes |
| 16bit | 65536 | 281T (48bit) | 사진 RAW, TIFF, PSB |
| 32bit float | -∞~+∞ | 사실상 무한 | OpenEXR, HDR 합성 |
2) 밴딩 (Banding) — 단계 부족이 만드는 줄
8bit sRGB로 0% → 5% 그라디언트를 그리면 약 13단계(0~12)밖에 못 쓴다. 화면 너비 1920px에 13단계를 펼치면 단계 하나가 ~150px → 명확한 줄.
선형 빛 0.00 → 0.05 : sRGB 8bit 값으로는 0 → 12 (13단계)
선형 빛 0.95 → 1.00 : sRGB 8bit 값으로는 248 → 255 (8단계)→ 어두운 영역은 단계가 풍부하지만, 선형 빛 기준으로 보면 어두운 영역도 밴딩이 보임.
3) Dithering — 의도적 노이즈로 밴딩 가리기
원리: 인접 픽셀에 랜덤 노이즈를 더해서 단계 경계를 흐림.
| 알고리즘 | 특징 | 사용처 |
|---|---|---|
| Random noise | 가장 단순, 지글거림 | 빠른 dither |
| Ordered (Bayer) | 4×4 / 8×8 매트릭스, 패턴 보임 | 레트로 게임 |
| Floyd-Steinberg | 오차를 인접 픽셀로 전파 | GIF 양자화 |
| Blue noise | 고주파 노이즈, 시각적으로 균일 | HDR → SDR 변환 |
코드 예 (간단한 8bit → 1bit threshold dither):
for (y = 0; y < h; y++)
for (x = 0; x < w; x++) {
old = pixel[y][x];
new = old > 127 ? 255 : 0;
pixel[y][x] = new;
err = old - new;
pixel[y][x+1] += err * 7/16;
pixel[y+1][x-1] += err * 3/16;
pixel[y+1][x] += err * 5/16;
pixel[y+1][x+1] += err * 1/16;
}4) HDR — 더 넓은 다이내믹 레인지
**HDR(High Dynamic Range)**는 다음 3가지의 결합:
| 구성 요소 | SDR | HDR |
|---|---|---|
| 비트심도 | 8bit | 10/12bit |
| 색공간 | sRGB / BT.709 | Rec.2020 (또는 P3) |
| Transfer | sRGB γ≈2.2 | PQ (SMPTE ST 2084) 또는 HLG |
| Peak luminance | 100 nits | 1000~10000 nits |
Transfer 함수 비교
| Transfer | 표준 | 특징 |
|---|---|---|
| sRGB / BT.1886 | 일반 SDR | γ≈2.2, 0~100 nits |
| PQ (Perceptual Quantizer) | SMPTE ST 2084 | 절대 밝기 매핑, 0~10000 nits, Dolby Vision/HDR10 |
| HLG (Hybrid Log-Gamma) | ARIB STD-B67 | 상대 밝기, SDR과 호환, BBC/NHK 방송 |
PQ vs HLG의 핵심 차이:
- PQ: “100% 신호 = 10,000 nits”라고 절대 정의. 메타데이터로 마스터링 디스플레이의 peak를 알려줌.
- HLG: 신호의 절반까지는 SDR γ, 그 이상은 logarithmic. SDR TV에서 그냥 SDR로 보여도 자연스러움.
5) HEIF의 HDR 이미지
HEIF (High Efficiency Image File Format, 2015) = ISOBMFF 컨테이너 + HEVC/AV1 코덱.
iPhone (Pro 모델, 2020~)이 찍는 HDR 사진:
- 컨테이너: HEIF
- 코덱: HEVC (H.265)
- 비트심도: 10bit
- 색공간: Display P3 또는 Rec.2020
- Transfer: HLG (Apple은 HLG 선호 — SDR 호환성 때문)
- 메타: Gain Map (SDR 버전 + HDR boost map)
Apple Gain Map (2023~):
- HEIF 안에 SDR 이미지 + Gain Map를 함께 저장
- HDR 디스플레이: SDR × GainMap = HDR
- SDR 디스플레이: SDR만 사용 → 자연스러운 fallback
What — 구체 사양과 수치
비트심도별 밴딩 임계 (sRGB 그라디언트 1920px)
| 비트심도 | 0~5% 구간 단계 수 | 단계당 픽셀 | 밴딩 시인성 |
|---|---|---|---|
| 8bit | 13 | ~148px | 보임 |
| 10bit | 51 | ~38px | 거의 안 보임 |
| 12bit | 205 | ~9px | 안 보임 |
HDR 이미지 포맷 비교
| 포맷 | 비트 | 색공간 | Transfer | iOS Safari | Chrome Android |
|---|---|---|---|---|---|
| HEIF (HDR) | 10 | P3/Rec.2020 | HLG/PQ | iOS 16+ | Chrome 105+ (limited) |
| AVIF (HDR) | 10/12 | Rec.2020 | HLG/PQ | iOS 16.4+ | Chrome 85+ |
| JPEG XL (HDR) | 10/16 | Rec.2020 | PQ/HLG | iOS 17+ (flag) | Chrome (없음, 2026.05) |
| JPEG + Gain Map | 8 + 8 | sRGB + map | sRGB + log | iOS 17.4+ | Chrome 121+ |
| HDR PNG (cICP) | 16 | Rec.2020 | PQ | iOS 16+ | Chrome 113+ |
iPhone HEIF HDR 사진 헤더 예 (exiftool 출력)
Image Width : 4032
Image Height : 3024
Bit Depth : 10
Color Profile : Display P3
Transfer Characteristics : HLG
Color Primaries : Display P3
Matrix Coefficients : BT.2020 NCL
Has Gain Map : True
HDR Headroom : 4.0 (= 400 nits 대비 SDR 100 nits)What-if — 잘못 다루면 어떻게 깨지는가
사례 1) 하늘 사진의 줄무늬
상황: 8bit JPEG로 저장한 노을 사진을 4K 모니터로 봤더니 하늘에 계단 줄.
원인: JPEG 8bit + DCT 양자화로 인접 블록 사이 단차가 강조됨.
해결:
- 10bit 포맷 (HEIF/AVIF) 사용
- 또는 약한 dithering 적용 후 8bit JPEG 저장
- Photoshop: Filter → Noise → Add Noise (Gaussian, 1~2%)
사례 2) HDR 사진을 인스타에 올렸더니 까맣게 보임
상황: iPhone HEIF HDR 사진을 SNS에 업로드 → 일부 사용자에게 어두운 회색 또는 깨진 색으로 표시.
원인:
- 옛 디코더는 HLG의 신호값을 SDR sRGB로 직접 디코드 → 신호의 0.5 (= SDR 100% 지점)이 SDR 50%로 표시
- Gain Map 미지원 디코더는 boost map 무시
해결: 업로드 시 SDR 버전으로 tone-map해서 보내거나, Gain Map 포함 JPEG로 변환.
사례 3) PQ 비디오의 PNG 썸네일이 새카맣다
상황: HDR(PQ) 영상의 첫 프레임을 ffmpeg로 PNG 추출 → 거의 검정.
원인: PQ 신호값 0.1 = 약 1 nit. SDR sRGB로 그냥 출력하면 8bit 1~3 정도.
해결:
# Tone-map PQ → sRGB
ffmpeg -i hdr.mp4 -vf "zscale=t=linear,tonemap=hable,zscale=t=bt709,format=rgb24" -frames:v 1 thumb.png사례 4) 16bit TIFF를 8bit JPEG로 저장 → 그림자 디테일 사라짐
상황: 사진가가 16bit RAW를 편집 후 JPEG export → 그림자가 까맣게 뭉침.
원인: 16bit의 어두운 8 stops 정보가 8bit의 0~30 단계로 압축됨.
해결: Curves로 그림자를 미리 들어올린 후 export, 또는 HEIF/AVIF 10bit 사용.
Insight — 비트심도와 HDR의 역사
“왜 영상은 10bit, 사진은 8bit가 표준이었나”
영상은 시간 차원이 있어 인접 프레임 간 노이즈가 자연스러운 dither 역할 → 8bit로도 그럭저럭 견딤. 하지만 정지된 사진은 한 프레임을 오래 보기 때문에 8bit 밴딩이 더 잘 보인다. 그럼에도 사진이 8bit인 이유: JPEG 표준이 8bit였고, 모든 디코더가 그렇게 만들어졌기 때문. HEIF/AVIF가 비로소 사진의 10bit 시대를 연다.
“Dolby Vision의 12bit는 마케팅이 아니다”
사람 눈의 명도 단계 식별 한계는 약 2^12 = 4096단계. 10bit + dithering으로 가려지지만, 어두운 영역(특히 영화관)에서 12bit가 미세하게 더 부드럽다. Dolby Vision 마스터는 12bit, 배포는 10bit로 변환된다.
“Apple Gain Map은 똑똑한 fallback의 정수”
같은 파일이 HDR 디스플레이와 SDR 디스플레이 모두에서 자연스러워 보이려면:
- 옛 방식: 두 버전을 따로 저장 → 용량 2배
- HLG: SDR 호환이지만 완전히 자연스럽지는 않음
- Apple Gain Map: SDR 이미지 + 작은 boost map → SDR 디바이스는 SDR만, HDR 디바이스는 boost 적용
2025년 ISO 21496-1로 표준화되어 Adaptive HDR이라는 이름으로 보급 중.
한 단락 요약
비트심도는 단계 수, HDR은 다이내믹 레인지다. 8bit는 그라디언트에 줄(밴딩)을 만들고, dithering으로 가릴 수 있다. HDR은 단순히 밝은 게 아니라
10bit + Rec.2020 + PQ/HLG의 결합이며, HEIF/AVIF가 사진 HDR을 가능하게 한다. 다음 문서(04-formats-overview.md)는 이 모든 결정이 합쳐진 코덱 비교를 다룬다.