🍏 Despill 이란
Spill은 Foreground(피사체)의 안쪽으로 Key 컬러가 묻어나는 현상이다. 조명이나 피사체의 재질에 따라 발생할 수 있다.
Spill Suppression, 일명 Despill은 이런 Spill을 제거하기 위한 기능이다.
이 글은 Despill 기법에 대한 조사를 하면서 알게 된 Despill 알고리즘에 대한 정리이다.
🍏 Despill Algorithm 1
Green 채널이 Red, Blue 채널의 평균보다 크다면 Red, Blue 채널의 평균을 낸 결과를 사용하여 자연스럽게 Green을 제거한다. 그렇지 않은 경우 기존 Green 채널을 사용한다.
언리얼 내 기본으로 제공하는 크로마키 함수의 Despill도 이 알고리즘을 사용한다. 가장 많이 쓰이는 방법인 것 같다.
g>((r+b)/2)?((r+b)/2):g
'Digital Compositting for film and video' Chapter 5에서 소개하는 Despill Algorithms도 이 방법이다.
이 방법을 사용하는 다른 Tools : Primatte(Nuke), DespillTK(Advanced despill toolset by Timur Khodzhaev's)
🍏 Despill Algorithm 2
YCgCo : YCbCr에 비해 더 간단하고 빠른 계산, 압축 성능이 높다는 장점이 있으며 색상 계층 사이의 상관성도 더욱 낮다. Y는 휘도, Cg는 녹색 색차, Co는 주황색 색차를 가지고 있다.
RGB를 YCgCo 컬러스페이스로 변환하여 채도 값을 평탄화 한다. 키 컬러와 내적(dot product)을 통해 YCgCo 공간에서 키 컬러의 크로마 값(yz)에 해당하는 부분을 구한다. 구한 값을 키 컬러와 키 컬러 자신의 내적 값으로 나누어 정규화 하고 이 정규화 된 값(sub)를 사용하여 키 컬러의 반대 방향으로 색상을 이동 시킨다.
즉, 키 컬러의 반대 방향으로 색상을 이동시켜 키 컬러 주변의 Spill을 제거한다. 마지막으로 수정된 YCgCo 값을 다시 RGB로 변환하여 최종 값을 얻는다.
half3 ycgco = RGBYCgCo(rgb);
half sub = dot(_KeyCgCo, ycgco.yz) / dot(_KeyCgCo, _KeyCgCo);
ycgco.yz -= _KeyCgCo * (sub+0.5) * _SpillRemoval;
rgb = YCgCoRGB(ycgco);
🍏 Ref.
(추천!!) Deconstructing Despill Algorithms : https://benmcewan.com/blog/2018/05/20/understanding-despill-algorithms/
LMS (Long, Medium, Short) : https://en.wikipedia.org/wiki/LMS_color_space#CAT02
RGB to YCgCo : https://www.shadertoy.com/view/4lBXDR
YCbCr to RGB : https://gist.github.com/sortofsleepy/cf6e36fc1f5e5c2355fceaaa4a42e1f1
'합성' 카테고리의 다른 글
Ultimatte 12 (1) (0) | 2024.10.24 |
---|---|
Ultimatte 12 (2) (1) | 2024.10.24 |