카메라 프레임을 받아 Vision에 넘기는 건 코드 한 줄입니다. 그런데 그 한 줄이 전제하는 것들이 꽤 많습니다.
센서에서 빛이 어떻게 색이 되고, 그 색이 어떤 포맷으로 앱에 도착하는지 — 표면 아래에 여러 레이어가 있습니다.
ISP
센서는 각 픽셀에서 그저 "빛이 얼마나 들어왔는가"만 숫자로 내뱉습니다. 원래는 흑백입니다. 색을 보려면 어떻게 해야 할까요?
Bayer 패턴
색 인식을 위해 픽셀마다 색상 필터를 씌운 것이 Bayer 패턴입니다.
왜 초록이 50%일까요? 인간의 눈이 초록 파장(약 555nm)에 가장 민감하기 때문입니다. 망막의 M-cone(초록 감지)이 가장 많습니다. ISP의 demosaicing 알고리즘이 이 불완전한 샘플에서 완전한 RGB를 복원합니다.
A17 Pro ISP
iPhone 15 Pro Max 스펙 시트를 열면 칩 항목에 A17 Pro가 적혀 있습니다. CPU·GPU·Neural Engine이 하나의 다이(die) 위에 집적된 Apple Silicon입니다. 그 안에는 카메라 전용 블록도 포함돼 있는데, 그것이 ISP(Image Signal Processor, 이미지 신호 처리기) 입니다. 센서 RAW 데이터를 입력받아, 색 복원·노이즈 제거·화이트 밸런스까지 소프트웨어가 개입하기 전에 전부 처리하는 전용 회로입니다.
"Apple devices have been able to fully leverage our Image Signal Processor to capture beautiful HEIC or JPEG images that are ready for display." — WWDC21: Capture and process ProRAW images
흥미로운 점은, Apple의 공식 스펙 시트나 프레스 릴리즈 어디에도 "ISP"라는 단어는 나오지 않습니다. 소비자 문서에서는 대신 Photonic Engine, Deep Fusion, Smart HDR 같은 브랜드 이름으로 포장됩니다. 칩 내부 블록 수준의 다이 분석은 TechInsights나 ChipWise 같은 반도체 분석 기관에서 역설계를 통해 확인할 수 있습니다.
ISP를 통과한 프레임은 demosaicing, 노이즈 제거, 화이트 밸런스, HDR 합성까지 모두 완료된 상태입니다. 출력 포맷은 YCbCr 4:2:0입니다. 왜 RGB가 아닐까요?
YCbCr
인간의 눈은 밝기 변화에는 민감하지만 색상 변화에는 상대적으로 둔감합니다. 망막의 간상세포(rod, 약 1억 2천만 개, 밝기 담당)와 원추세포(cone, 약 600만 개, 색상 담당)의 비율이 20:1입니다.
단순하게 말하면, 색 정보를 줄여도 사람은 잘 모릅니다. 이 특성을 이용한 포맷이 YCbCr입니다.
| 채널 | 이름 | 내용 | 해상도 |
|---|---|---|---|
| Y | Luma | 밝기 정보 | 전체 유지 |
| Cb | Chroma Blue | 파랑-녹색 차분 | ½ 다운샘플 |
| Cr | Chroma Red | 빨강-녹색 차분 | ½ 다운샘플 |
크로마 서브샘플링
4:2:0은 Y, Cb, Cr을 얼마나 촘촘하게 샘플링하는지를 나타내는 비율입니다. 직접 확인해보겠습니다.
4픽셀 기준 Y 4개 + Cb 1개 + Cr 1개 = 6바이트.
| 포맷 | 4픽셀 크기 | 픽셀당 |
|---|---|---|
| RGB 24bit | 12 byte | 3.0 byte |
| YCbCr 4:4:4 | 12 byte | 3.0 byte |
| YCbCr 4:2:2 | 8 byte | 2.0 byte |
| YCbCr 4:2:0 | 6 byte | 1.5 byte |
RGB 대비 50% 크기. 색상 해상도 손실을 사람이 거의 못 느끼는 걸 이용한 것입니다. H.264, HEVC, JPEG, 카메라 내부 데이터 전송이 전부 YCbCr 4:2:0을 쓰는 이유가 여기 있습니다.
YCbCr이 비디오 압축 코덱(H.264, HEVC)과 어떻게 연결되는지 — I/P/B 프레임 구조, 비압축 비용, H.264 비트스트림은 YCbCr이 H.264 압축에 맞는 이유에서 다룹니다.
BiPlanar 레이아웃
YCbCr 4:2:0을 메모리에 배치하는 방식은 여러 가지가 있습니다. 카메라 파이프라인에서 흔히 쓰이는 것이 NV12(BiPlanar) 레이아웃입니다. BiPlanar는 메모리가 두 개의 평면(plane)으로 나뉜다는 뜻입니다.
Cb와 Cr이 각각 별도 plane에 있지 않고, Plane 1에 Cb Cr Cb Cr... 순서로 인터리브되어 있습니다. 이게 NV12 포맷입니다.
FullRange는 Y 값이 0–255 전체 범위를 쓴다는 뜻입니다. VideoRange(Y: 16–235)는 방송 장비 호환성을 위한 legacy 규격입니다. 두 범위를 혼동하면 변환 후 색이 밝거나 어둡게 뜹니다.