ISP 파이프라인
센서가 내보내는 RAW는 어둡고, 초록빛이 돌고, 가장자리가 어둡고, 노이즈와 결함 픽셀이 섞인 흑백 모자이크입니다. 이것을 우리가 아는 "사진"으로 만드는 일련의 계산을 영상 신호 처리기(Image Signal Processor, ISP)가 합니다. 이 장에서는 각 단계를 직접 켜고 끄며 왜 그 단계가 필요한지, 어떤 수학이 들어 있는지 살펴봅니다.
- RAW 도메인(BLC·DPC·LSC) → RGB 도메인(디모자이크·WB·CCM) → 표시 도메인(감마·톤·샤프닝)으로 이어지는 파이프라인의 순서와 이유를 설명한다.
- 폰 크리스 화이트 밸런스, 최소자승 CCM, sRGB 감마 공식을 유도하고 계산할 수 있다.
- 노이즈 저감과 샤프닝의 순서, 비트 깊이와 감마 인코딩의 관계를 정량적으로 이해한다.
- AE·AWB·AF의 3A 제어 루프와 컴퓨테이셔널 포토그래피의 기본 아이디어를 이해한다.
ISP란 무엇인가
스마트폰 AP 안의 ISP는 초당 수억 픽셀을 처리하는 전용 하드웨어 파이프라인입니다. 센서에서 MIPI CSI-2로 들어온 RAW 데이터는 수십 개의 블록을 차례로 통과하며, 각 블록은 특정 물리적 결함을 되돌리거나 사람의 지각에 맞춰 신호를 변환합니다. 블록들은 데이터의 성격에 따라 세 영역으로 나뉩니다.
순서에는 이유가 있습니다. 선형성이 필요한 보정은 먼저, 비선형 변환은 나중에 합니다. 블랙 레벨, 쉐이딩, 화이트 밸런스, 색 보정은 모두 "광자 수에 비례하는 신호"라는 가정 위에서만 올바르게 동작하므로 감마보다 앞에 둬야 합니다. 결함 픽셀은 디모자이크가 이웃으로 퍼뜨리기 전에 제거해야 하고, 샤프닝은 노이즈를 먼저 줄인 뒤에 해야 노이즈를 키우지 않습니다.
RAW → JPEG 파이프라인 시뮬레이터
아래 시뮬레이터는 4장과 같은 절차적 장면에서 현실적인 RAW를 합성합니다. 텅스텐 조명(2800 K)의 색 편향, 센서의 분광 크로스토크 행렬, cos⁴ 비네팅과 색 쉐이딩, 64 DN 블랙 레벨 오프셋(10-bit, 최대 1023), 샷 노이즈 + 읽기 노이즈 2.5 e⁻, 핫/데드 픽셀, 베이어 샘플링이 모두 들어 있습니다. 위쪽 칩을 눌러 단계를 선택하고, 칩 오른쪽 스위치로 단계를 끄고 켜 보세요. "이 단계 결과 보기"를 누르면 그 단계 직후의 중간 결과를 볼 수 있습니다.
RAW → JPEG: 9단계 ISP 파이프라인
RAW 도메인 보정: BLC · DPC · LSC
① 블랙 레벨 보정 (Black Level Correction)
빛이 전혀 없어도 센서 출력은 0이 아닙니다. 센서 설계자가 ADC 입력에 일부러 페디스털(pedestal, 블랙 레벨 오프셋)을 더해 두기 때문입니다. 이유는 노이즈입니다. 암흑에서 신호는 0 근처에서 ± 방향으로 흔들리는데, 오프셋이 없으면 음수 쪽이 ADC에서 0으로 잘려 평균이 위로 치우칩니다(바이어스). 64 DN 정도의 여유를 두면 노이즈 분포 전체가 보존되고, ISP가 정확한 평균을 빼 줄 수 있습니다.
② 결함 픽셀 보정 (Defect Pixel Correction)
수천만 픽셀 중 일부는 암전류가 비정상적으로 큰 핫 픽셀이거나 반응이 없는 데드 픽셀입니다. 공장에서 위치를 측정해 OTP 메모리에 저장하는 정적 보정과, 프레임마다 이웃과 비교해 찾는 동적 보정을 함께 씁니다. 동적 DPC는 같은 색 이웃 8개(거리 2)의 범위를 벗어나는 픽셀을 이웃의 중앙값으로 바꿉니다.
③ 렌즈 쉐이딩 보정 (Lens Shading Correction)
광축에서 각도 \(\theta\)만큼 떨어진 상점의 조도는 대략 \(\cos^4\theta\)로 줄어듭니다(자연 비네팅). 거리 증가(\(\cos^2\)), 동공의 겉보기 면적 감소(\(\cos\)), 비스듬한 입사(\(\cos\))가 곱해진 결과입니다. 여기에 마이크로렌즈의 주광선각(CRA) 불일치로 픽셀 효율이 떨어지고, 채널마다 정도가 달라 색 쉐이딩까지 생깁니다(5장).
디모자이크와 화이트 밸런스
디모자이크는 4장에서 자세히 다뤘습니다. ISP에서는 보통 MHC 계열 선형 필터에 방향 판정을 결합한 하드웨어 블록이 쓰입니다. 디모자이크가 끝나면 모든 픽셀이 (R, G, B) 세 값을 갖지만, 아직 카메라 고유의 RGB일 뿐입니다. 먼저 조명의 색을 제거해야 합니다.
사람의 시각은 조명이 바뀌어도 흰 종이를 흰색으로 느끼는 색 순응(chromatic adaptation)을 합니다. 카메라는 그렇지 않아서, 텅스텐 조명 아래 회색 물체를 찍으면 R이 G의 1.7배, B는 0.4배쯤 나옵니다. 화이트 밸런스는 각 채널에 게인을 곱해 중성색이 R = G = B가 되도록 합니다. 이것이 폰 크리스(von Kries) 모델, 즉 대각 행렬 변환입니다.
조명의 색 \((R_w,G_w,B_w)\)는 모르므로 추정해야 합니다. 가장 오래된 방법인 그레이 월드(gray world) 가정은 "장면 전체의 평균은 회색"이라고 보고 \(g_R=\bar G/\bar R\), \(g_B = \bar G/\bar B\)로 둡니다. 계산은 간단하지만 하늘·잔디처럼 한 색이 넓게 차지하면 틀립니다(시뮬레이터에서 수동/프리셋과 비교해 보세요). 화이트 패치(white patch / max-RGB)는 가장 밝은 영역을 흰색으로 가정합니다. 실제 AWB는 흑체 궤적 근처 후보만 고려하는 제약, 회색 후보 픽셀 선별, 얼굴·하늘 인식, 그리고 최근에는 신경망으로 조명을 추정합니다.
채널별 게인은 센서 분광 감도가 좁고 겹치지 않을 때만 정확하다. 실제 감도는 넓고 겹치므로, 조명이 바뀌면 WB만으로는 모든 색을 되돌릴 수 없고 CCM도 조명에 따라 바뀌어야 한다. 그래서 카메라는 2~3개 조명(예: 2856 K, 6500 K)에서 CCM을 교정해 두고 추정한 색온도에 따라 보간한다. 시뮬레이터의 "D65 교정" CCM은 6500 K에서만 정확하므로 텅스텐 장면에서는 약간의 오차가 남는다.
색 보정 행렬 (CCM)
WB 후 중성색은 맞췄지만, 유색은 여전히 틀립니다. 센서 분광 감도가 CIE 색 대응 함수의 선형 결합이 아니고(4장의 루터–아이브스 조건), 광학·전기적 크로스토크로 채널이 섞이기 때문입니다. 이것을 3×3 행렬 하나로 근사 보정하는 것이 CCM입니다.
이 최소자승 해를 구하는 과정이 바로 카메라 색 교정(color calibration)입니다. 실무에서는 몇 가지를 더 고려합니다. (1) 행 합 = 1 제약: 흰색이 흰색으로 남도록 각 행의 합을 1로 고정한다(라그랑주 승수 또는 한 열을 소거). (2) 지각 오차 최소화: RGB 제곱 오차 대신 CIELAB의 \(\Delta E\)를 최소화한다(비선형 최적화). (3) 노이즈 증폭: 출력 노이즈는 \(\sigma_{\text{out},i}^2=\sum_j M_{ij}^2\sigma_j^2\)이므로 비대각 성분이 큰 행렬은 색을 정확히 하는 대가로 노이즈를 키운다. 저조도에서 CCM 채도를 일부러 줄이는 이유입니다.
파이프라인 시뮬레이터에서 ⑥ CCM 칩을 선택하고 "체커 최소자승"을 누르면, 현재 WB 결과에서 24패치 평균을 뽑아 위 식으로 행렬을 즉석 계산한다. 크로스토크 모델 \(X\)의 역행렬("D65 교정")과 비교해 보자. 행렬 원소를 직접 고쳐 볼 수도 있다(예: 대각을 키우고 비대각을 더 음수로 → 채도 증가).
노이즈 저감과 샤프닝
노이즈 저감(NR)은 "신호는 공간적으로 매끄럽고, 노이즈는 픽셀마다 독립적"이라는 가정을 이용합니다. 가장 간단한 가우시안 필터는 이웃을 거리 가중 평균해 노이즈 표준편차를 줄이지만 에지도 똑같이 흐립니다. 바이래터럴 필터(bilateral filter)는 거리뿐 아니라 밝기 차이로도 가중치를 줘서 에지를 넘어가는 평균을 막습니다.
샤프닝은 반대로 고주파를 키웁니다. 대표적인 언샤프 마스크(unsharp mask, USM)는 원본에서 흐린 버전을 뺀 "디테일"을 다시 더합니다.
USM은 고주파 이득이 \(1+a\)인 필터이므로, 노이즈가 남아 있는 상태에서 먼저 샤프닝하면 노이즈도 \(1+a\)배로 커지고 공간적으로 뭉쳐 "지글거리는" 입자가 됩니다. 그 뒤의 NR은 이미 커진, 에지처럼 보이는 노이즈 덩어리를 신호로 착각해 잘 지우지 못합니다. 그래서 NR → 샤프닝 순서가 원칙입니다.
NR과 샤프닝의 순서 (ISO 1600)
감마와 톤 매핑
여기까지의 신호는 광자 수에 비례하는 선형 값입니다. 그런데 사람의 밝기 지각은 대략 로그(또는 1/3 거듭제곱)에 가깝습니다. 선형 값을 그대로 8-bit로 저장하면 어두운 영역에 코드가 턱없이 모자라고 밝은 영역에는 남아돕니다. 그래서 저장·전송 전에 비선형 전달 함수(OETF)를 적용합니다. sRGB 표준의 인코딩 곡선은 다음과 같습니다.
감마 곡선 위에 톤 커브를 더해 사진의 "룩"을 만듭니다. S자 곡선은 중간톤 대비를 올리고 암부·명부를 부드럽게 압축합니다. 센서의 다이내믹 레인지(12~14 스톱)가 디스플레이(약 8 스톱)보다 넓을 때는 하이라이트를 부드럽게 눌러 주는 전역 톤 매핑(예: Reinhard \(L/(1+L)\))이나, 영역마다 다른 곡선을 쓰는 국소 톤 매핑(LTM)을 씁니다. 파이프라인 시뮬레이터의 ⑧ 단계에서 곡선 모양을 직접 확인해 보세요. 구의 반사 하이라이트가 Reinhard에서 어떻게 달라지는지도 눈여겨보세요.
RAW 파일(DNG)과 비트 깊이
JPEG는 ISP의 모든 결정(WB, CCM, 톤, NR, 샤프닝)이 "구워진" 8-bit 결과입니다. 반면 RAW 파일은 BLC조차 하지 않은 센서 데이터를 10~14-bit 그대로 저장하고, 나중에 PC에서 다른 결정을 내릴 수 있게 필요한 메타데이터를 함께 담습니다. Adobe의 DNG(Digital Negative)는 TIFF 기반의 공개 RAW 규격으로, 스마트폰의 "Pro/RAW" 모드도 대부분 DNG를 씁니다.
비트 깊이가 왜 중요할까요? ADC 비트 수 \(n\)은 표현 가능한 최대 명암비 \(2^n\)을 정합니다(12-bit ≈ 72 dB, 14-bit ≈ 84 dB). 선형 RAW에서는 가장 밝은 스톱이 전체 코드의 절반을 차지하고 한 스톱 어두워질 때마다 코드가 절반으로 줄어듭니다. 12-bit RAW라도 10스톱 아래에는 4개 코드만 남습니다. 그러나 이 영역은 대개 노이즈가 코드 간격보다 커서(디더링 효과), 적절한 비트 수는 양자화 간격 ≲ 읽기 노이즈가 되도록 고릅니다.
12-bit 선형 데이터를 8-bit 파일로 만들 때는 반드시 감마를 먼저 적용하고 양자화해야 합니다. 선형 8-bit로 자르면 암부에 코드가 몇 개밖에 없어, 나중에 밝기를 조금만 올려도 계단 같은 밴딩(banding, posterization)이 드러납니다.
비트 깊이 × 인코딩 방식과 암부 밴딩
3A: 자동 노출 · 자동 화이트 밸런스 · 자동 초점
ISP는 한 장을 처리하는 데서 끝나지 않고, 매 프레임의 통계를 보고 다음 프레임의 촬영 조건을 정합니다. 이 피드백 제어를 통틀어 3A라고 합니다. AE는 노출 시간과 아날로그/디지털 게인을, AWB는 WB 게인과 CCM을, AF는 렌즈 액추에이터(VCM) 위치를 조절합니다.
AE의 기본 목표는 장면의 평균 반사율이 약 18%라는 가정 아래, 측광 영역의 평균 휘도를 18% 회색(sRGB 약 118/255)에 맞추는 것입니다. 로그 영역에서 비례 제어를 하면
평균 측광은 역광에서 실패합니다. 밝은 하늘이 평균을 끌어올려 피사체가 어둡게 찍히죠. 그래서 중앙 중점 측광, 얼굴 우선 측광, 하이라이트 보호(상위 백분위가 포화되지 않도록 제한) 같은 전략을 섞습니다. AWB는 WB 절에서 본 조명 추정을 매 프레임 돌리며, AF는 영상 대비(콘트라스트 AF)나 듀얼 픽셀의 위상차(PDAF, 10장)를 이용해 초점을 찾습니다.
AE 수렴: 18% 회색 목표의 반복 노출 조정
컴퓨테이셔널 포토그래피
작은 스마트폰 센서가 큰 카메라에 근접한 화질을 내는 비결은 한 장이 아니라 여러 장을 찍어 계산으로 합치는 데 있습니다. 셔터를 누르기 전부터 ZSL(zero shutter lag) 버퍼에 프레임을 계속 쌓아 두고, 짧은 노출 프레임 여러 장을 정렬·병합하면 흔들림 없이 긴 노출과 같은 광량을 얻습니다. \(N\)장을 평균하면 노이즈는 \(1/\sqrt N\)로 줄어, 8장이면 SNR이 약 9 dB 좋아집니다. 이것이 야간 모드의 원리이며, 노출이 다른 프레임을 합치면 HDR이 됩니다(8장).
최근에는 ISP 블록 일부 또는 전체를 신경망으로 대체하는 AI ISP가 확산되고 있습니다. 디모자이킹과 노이즈 제거를 하나의 네트워크로 동시에 푸는 공동 디모자이킹(joint demosaicking & denoising), 장면 인식 기반 AWB, 멀티프레임 초해상도, 얼굴·하늘 영역별 톤 조절이 대표적입니다. 신경망은 이 장에서 본 수작업 가정(그레이 월드, 매끄러운 색차 등)을 대량의 데이터로 학습한 사전 지식으로 바꿉니다. 다만 모바일 NPU의 전력·지연 제약 때문에, 실제 제품은 고정 하드웨어 블록과 신경망을 섞어 쓰는 하이브리드 구조가 일반적입니다.
핵심 정리
- ISP는 RAW 도메인(BLC → DPC → LSC) → RGB 도메인(디모자이크 → WB → CCM → NR) → 표시 도메인(감마·톤 → 샤프닝 → 압축) 순서로 처리한다. 선형성이 필요한 보정은 비선형 변환보다 앞에 둔다.
- 블랙 레벨(페디스털)은 음의 노이즈를 보존하려고 일부러 더한 오프셋이며, \( (\mathrm{DN}-\mathrm{BL})/(\mathrm{WL}-\mathrm{BL}) \)로 정규화한다. 빼지 않으면 대비 저하와 그림자 색 편향이 생긴다.
- 결함 픽셀은 디모자이크 전에 같은 색 이웃의 중앙값으로 바꾸고, 렌즈 쉐이딩(\(\cos^4\theta\) + 색 쉐이딩)은 채널별 게인 맵으로 되돌린다.
- 화이트 밸런스는 폰 크리스 대각 게인 \(g_R=G_w/R_w,\ g_B=G_w/B_w\)이며, 조명 추정(그레이 월드 등)이 핵심이다. CCM은 컬러체커로 \(M=TC^\top(CC^\top)^{-1}\)을 구하고, 계수가 클수록 노이즈를 증폭한다.
- NR은 샤프닝보다 먼저 한다. USM은 고주파 이득 \(1+a\)로 남은 노이즈까지 키우기 때문이다.
- sRGB OETF(선형 구간 + 1/2.4 거듭제곱)는 지각에 맞게 코드를 암부로 재분배한다. 선형 8-bit 양자화는 밴딩을 만들므로 RAW는 12-bit 이상 선형, 최종 JPEG는 8-bit 감마로 저장한다.
- 3A는 매 프레임 통계로 노출·WB·초점을 피드백 제어한다. AE는 로그 영역 비례 제어로 18% 회색 목표에 수렴하며, 측광 방식이 역광 결과를 좌우한다.
확인 퀴즈
센서 설계자가 ADC 출력에 64 DN 같은 블랙 레벨 오프셋을 일부러 더하는 주된 이유는?
텅스텐 조명에서 회색 패치의 카메라 RGB가 (0.68, 0.40, 0.16)으로 측정되었다. G를 기준으로 한 WB 게인 \( (g_R, g_B) \)는?
컬러체커 24패치로 CCM을 최소자승 추정할 때 \(M\)의 식으로 옳은 것은? (\(C\): 카메라 RGB 3×24, \(T\): 목표 3×24)
노이즈 저감을 샤프닝보다 먼저 하는 이유로 가장 적절한 것은?
AE가 \(\mathrm{EV}_{n+1}=\mathrm{EV}_n + k\log_2(Y_t/\bar Y_n)\)로 동작한다. 목표 18%, 현재 측광 휘도 4.5%, \(k=0.5\)이면 다음 프레임 노출 변화는?