색 그레이딩
스크립트: scripts/grade.py IN OUT --look NAME [--strength 0.8] [--lut file.cube] [--compare grid.png]
--list로 룩 목록을 확인할 수 있습니다. ffmpeg 필터 체인으로 룩을 적용하며, --compare를 사용하면 여러 룩의 전후 비교 스틸 이미지를 렌더링하여 사용자가 직접 선택할 수 있습니다.
1. 작업 순서 (항상)
- 입력 변환: 회전/HDR/로그 → Rec.709 (Resolve에서는 Color Space Transform, ffmpeg에서는 LUT 또는 톤맵). 로그 영상을 직접 그레이딩하지 마세요.
- 색 보정 (중립적이고 일관되게 만들기): 화이트 밸런스 → 노출 → 대비 → 채도. 목표: 흰색은 흰색, 검은색은 검은색, 피부는 자연스럽게, 모든 샷이 일치.
- 룩 / 크리에이티브 그레이딩: 색조 변환, 스플릿 토닝, 곡선, 약하게 적용한 LUT.
- 마무리: 비네트, 그레인, 헐레이션, 마지막 샤프닝.
각 세그먼트를 연결(concat)하기 전에 그레이딩하여 한 번에 인코딩하세요. 시퀀스의 모든 클립에 동일한 룩을 적용하되, 스토리 비트(예: 따뜻한 A → 혼란스러운 차가운 B)가 있는 경우에만 변경합니다.
2. 개념 모델: ASC CDL
채널별: out = (in × slope + offset) ^ power, 다음에 채도 적용.
- slope → 하이라이트/게인, offset → 섀도우/리프트, power → 미드톤/감마.
- 따뜻한 하이라이트: R slope 증가, B slope 약간 감소. 틸 섀도우: B와 G offset 증가, R 감소.
- ffmpeg 대응:
colorbalance(섀도우/미드톤/하이라이트 RGB별),colorlevels,curves,eq(대비/밝기/채도/감마),colortemperature,lut3d,colorchannelmixer.
3. 룩 (시작점 – 프레임에서 확인 후 조정)
| 룩 | 느낌 | 주요 조작 |
|---|---|---|
neutral-punch | 깔끔, SNS용 | 작은 S-커브, 채도 +8%, 색조 변환 없음 |
teal-orange | 블록버스터, 여행 | 틸 섀도우, 따뜻한 하이라이트, 피부 보호 (주황은 피부 색상) |
warm-golden | 향수, 음식, 라이프스타일 | 화이트 밸런스 +300-600 K, 따뜻한 섀도우 리프트, 부드러운 대비 |
cool-moody | 기술, 밤, 드라마 | 차가운 화이트 밸런스, 채도 낮은 미드톤, 깊지만 뭉개지지 않은 블랙 |
film-kodak | 2383/Portra 스타일 프린트 | 롤오프된 하이라이트, 약간 녹색-시안 섀도우, 따뜻한 미드톤, 그레인 4-8% |
bleach-bypass | 거친, 전쟁, 스포츠 | 높은 대비, 채도 -40%, 은빛 하이라이트 |
pastel-matte | 미적, 미니멀, 패션 | 리프트 블랙 (매트), 낮은 대비, 채도 -15%, 핑크/피치 하이라이트 |
day-for-night | 주간 영상을 야간처럼 | -1.5 ~ -2 스톱, 푸른 색조, 채도 0.3-0.5, 하늘 압축, 실제 조명은 따뜻하게 유지 |
vintage-faded | 홈 비디오, 90년대 | 페이드 블랙, 황록색 하이라이트, 크로마 노이즈, 부드러움 |
bw-contrast | 시대를 초월한, 다큐멘터리 | 루미넌스 믹스 (피부를 위해 R 강조), 강한 S-커브, 그레인 |
cyberpunk-neon | 도시의 밤, 게이밍 | 마젠타-시안 분할, 하이라이트 높은 채도, 조명에 블룸 |
데이 포 나이트 참고: DaVinci Resolve의 "LMT Day for Night"는 ACES AP1 선형에서 power 0.5 → slope (0.3, 0.5, 0.8) → power 2.2 → saturation 0.3으로 작동합니다. Rec.709 영상에 사용하려면 Rec.709 → 선형 AP1 변환, 적용, 다시 변환 후 33포인트 .cube에 구워 넣습니다. 매우 어두운 소스는 LUT 전에 약간 리프트하세요.
4. LUT
lut3d=file.cube:interp=tetrahedral로 적용. 강도를 줄여 블렌딩:split[a][b];[b]lut3d=x.cube[g];[a][g]blend=all_expr='A*(1-0.7)+B*0.7'.- 기술 LUT(log→709)는 정확하므로 100% 사용. 크리에이티브 LUT는 양념이므로 보통 40-80%.
.cube파일을 컨텍스트에 직접 읽어들이지 마세요 (수만 개의 숫자). 프레임에 미치는 영향을 확인하세요.- Python으로 커스텀 LUT 생성: 33³ 그리드 구축, numpy로 컬러 함수 적용,
LUT_3D_SIZE 33+ 행 (R 가장 빠름) 작성.
5. 피부 톤
- 피부는 인종에 관계없이 피부 톤 라인(벡터스코프에서 약 123°, I-라인)에 위치하며, 루미넌스와 채도만 변합니다.
- 틸/쿨 룩을 적용할 때는 피부를 분리(HSL 키 색조 0-50°, 중간 채도)하여 유지하지 않으면 얼굴이 회색/녹색으로 변합니다.
- 모든 얼굴 샷을 그레이딩 상태에서 전체 크기로 확인하세요.
6. 샷 매칭
- 먼저 노출 매칭 (파형/평균 루마), 다음 화이트 밸런스 (중립 물체 또는 흰색), 다음 채도.
- 빠른 수치 매칭: 샷 간 중립 영역의 채널별 평균과 표준편차 비교; slope/offset 조정하여 약 2-3% 이내로 맞춤.
- 혼합 카메라 (휴대폰 + 액션캠 + DSLR): 모두 먼저 Rec.709로 변환한 후, 주 카메라에 맞춥니다.
7. 마무리 터치
- 그레인:
noise=alls=6:allf=t(시간적). 최종 크기로 스케일링 후 추가. 4K 영상: 약간 강한 값에서 그레인이 압축을 더 잘 견딥니다. - 비네트:
vignette=PI/5미묘하게. 가장자리에 텍스트가 있는 콘텐츠는 피하세요. - 헐레이션 / 블룸: 하이라이트 전용 복사본 임계값 처리, gblur 20-40, 빨간-주황 색조, 15-30%로 스크린.
- 샤픈:
unsharp=5:5:0.6한 번, 마지막에, 최종 크기에서. - HDR to SDR:
ffmpeg-pipeline톤 매핑 참조.
8. DaVinci Resolve에서
기본 노드 트리: CST in → WB/exposure → contrast/sat → secondary (skin) → look/LUT → CST out → grain/vignette. 입력 = 카메라 로그 (예: Apple Log), 출력 = Rec.709 Gamma 2.4로 Color Space Transform 사용. 스틸 또는 Color Group(프리/포스트 클립)으로 그레이딩 복사. davinci-resolve 참조.
9. 확인
3개 이상의 샷(가장 밝은, 가장 어두운, 얼굴)의 전후 비교 스틸을 나란히 배치. 확인: 피부에서 하이라이트 클리핑 없음, 디테일이 중요한 부분에서 블랙 뭉개짐 없음, 텍스트 오버레이 여전히 읽기 쉬움, 컷 간 룩 일관성.