RGB 공간 형상(RGB-space Geometry)를 통한 디지털 페인팅 라이팅 이팩트(lighting effect) 생성
결과
swipe_across_verticallyn_gif_011
No data available. Please select runs that logged the key move_circle_gif_013.
세트 실행
조명(ligiting)은 디지털 및 매트(matte) 페인팅에서 중요한 역할을 합니다. 현실의 물리적 조명 또는 렌더링 된 장면과는 다르게 디지털 페인팅의 채색된 라이팅 이팩트(lighting effect)는 여러 다른 종류로 이뤄진 스트로크(heterogeneous strokes)로 생성됩니다. "Generating Digital Painting Lighting Effects via RGB-space Geometry"논문에서, 저자들은 단일 이미지에서 디지털 페인팅 라이팅 이팩트를 생성하기 위한 이미지 프로세싱 알고리듬을 제안하고 있습니다. 이 알고리듬은 “아티스트는 라이팅 이팩트를 그리기 위해 수 많은 겹침 스트로크(overlapping strokes)를 사용합니다”라는 주요 관측을 기반으로 하고 있습니다. 즉, 빽빽한 스트로크 이력(stroke history)의 픽샐은 더 많은 조명 스트로크(illumination strokes)를 수집합니다. 이 관측에 기반하여 저자들은 다음을 수행할 수 있는 알고리듬을 고안했습니다.
- 색상 형상(color geometry)를 사용하여 이미지 자체에 기초한 입력 이미지의 스트로크 밀도를 추정합니다.
- 아티스트의 coarse-to-fine(대략적이었다가 점점 세밀화되는) 작업 흐름을 흉내 내어 시각적으로 사실적인 라이팅 이팩트를 생성합니다.
논문 →
다음은 제안된 알고리듬의 개요를 제공하는 논문의 저자들이 공개한 비디오 입니다.
논문 개요
제안된 알고리듬은 아티스트의 라이팅 이팩트 구성 작업 흐름의 단계별 모방입니다. 현재의 예술적인 작업 흐름에서, 아티스트는 수작업으로 이러한 라이팅 이팩트를 채색하고 최고의 구성을 찾기 위해서, 지루하지만, 계속해서 수정합니다. 사용할 수 있는 라이팅 이팩트 제품을 만들기 위해, 아티스트들은 처음엔 일반적으로 전반적인 또는 대략적인 조명 레이어를 그리며, 그 후 자연스럽게 원본 이미지 콘텐츠에 맞추기 위해 이 레이어의 디테일을 리터치합니다. 이러한 프로세스의 단점은 다음과 같습니다:
-
시간이 너무 오래 걸립니다.
-
많은 노동력을 요구합니다.
이 알고리듬은 “아티스트가 새로이 그린 스트로크는 이전 스트로크 이력(stroke history)과 관련 있다”라는 주요 가정을 기반으로 하고 있습니다. 하지만 디지털 페인팅의 대부분은 이러한 스트로크 이력 정보가 없습니다. 더욱이, 이러한 정보의 기록은 고해상도로 인해 비현실적입니다.
제안된 방법
-
저희는 스트로크 이력의 밀도(density)를 직접 추정합니다. 먼저 입력 이미지에서 가상 팔레트를 추출하고, 픽셀 색상과 팔레트 색상간의 관계를 활용하여 스트로크 밀도(stroke density)를 추적하여 이 작업을 수행합니다. 이 모든 작업은 하나의 완성된 일러스트레이션/이미지 만으로 수행하실 수 있습니다.
-
그 다음, 대략적이었다가 점점 세밀화되는 방향으로(coarse to fine) 아티스트의 작업 흐름을 모방하여 라이팅 이팩트를 적용합니다. *먼저, 대략적인 이팩트 맵을 생성합니다. 이 맵은 주변 사물의 영향으로 인한 하이라이트, 그림자 및 색상 변형(color variations)의 대략적인 저주파(low-frequency) 렌더링입니다.
- 이 대략적인 이팩트 맵은 원본 이미지 구조에 맞도록 다듬어지고, 따라서 심미적으로 만족스러운 라이팅(lighting) 결과 생성이 이뤄집니다.
주요 특징
논문의 주요 특징은 다음과 같습니다.
- 이 알고리듬은 위의 모든 작업을 수행하기 위해서 단 하나의 이미지만 필요로 합니다.
- 라이팅 이팩트는 사진 또는 3D 렌더링 이미지에 적용할 수 있습니다.
- 이팩트를 생성하는데 약 0.06초가 소요됩니다.
- 알고리듬은 다양한 광원(light sources)를 지원합니다.
- 알고리듬은 디지털로 생성된 일러스트레이션 뿐 아니라, 실제 장면/이미지에도 적용하실 수 있습니다.
코드
몇 가지 흥미로운 라이팅 이팩트 생성을 해봅시다.
코드 →
anaconda
명령 프롬프트를 열고 새로운 conda 환경을 생성합니다.
conda create --name paintlight
pip install https://github.com/ayulockin/PaintingLight
*repo의 README에 설명된 대로 dependencies(의존성)을 설치합니다. 생성된 환경에Python 3.6.x
버전이 있는지 확인하시기 바랍니다. 그렇지 않은 경우, 다음을 수행합니다:
conda install python=3.6.10
code
를 포함한 디렉토리로 갑니다. 이제 모든 예제를 실행할 준비 또는 여러분의 이미지를 사용해 이팩트를 확인하실 수 있습니다.
cd code
python example001.jpeg
참고: Weights & Biases 대시보드에서 결과를 보다 양방향으로 시각화하실 수 있도록, 원본 repo의 제 fork에서 wandb.com에 가입하셔야 합니다.
원본 repo를 사용하는 경우에도 이 곳 밑 README에 표시된 단계를 수행하실 수 있습니다. 이를 통해 이미지와 함께 cv2.window
을 생성합니다. 이미지 위에 마우스 커서를 올려 놓으면 라이팅 이팩트를 확인하실 수 있습니다. 이 이팩트를 저장하려면, Weights & Biases에 출력을 로그하셔야합니다.
결과
선택된 결과
매개변수 수정하기(Tweaking the Parameters)
여러분의 이미지에서 환상적인 라이팅 이팩트를 테스트해보시려면, 다음을 사용할 수 있습니다 –
python default.py path_to_image
또한 매개변수 값을 활용해서 원하는 라이팅 이팩트를 생성하실 수도 있습니다. 권장 값이 있는 모든 매개변수의 리스트는 repo의 README에서 확인하실 수 있습니다. 저는 x 및 y
값을 일정하게 유지하면서 최소 및 최대 값으로 범위를 변경함으로써 몇 가지 매개변수를 실험했습니다.
-
light_source_height
: 이미지에서 빛(light)와의 거리입니다. 권장 값은 1입니다. 이 매개변수의 이팩트를 확인하기 위해, 저는 스텝 사이즈 0.1인 범위(0.1, 2)
에서 값을 변경했습니다. 아래의light_height_source_gif_015
에서 결과를 확인하실 수 있습니다. 광원의 높이가 높아질수록 어두운 영역이 작아짐을 확인하세요. -
light_intensity
: 빛의 강도입니다. 권장값은 0.85입니다. 이 매개변수의 이팩트를 확인하기 위해, 저는 스텝 사이즈 0.1인 범위(0, 1)
에서 값을 변경했습니다. 아래의light_intenity_gif_008
에서 결과를 확인하실 수 있습니다. -
ambient_intensity
: 주변광(ambient light)의 강도입니다. 권장값은 0.45입니다. 이 매개변수의 이팩트를 확인하기 위해, 저는 스텝사이즈 0.1인 범위(0, 0.7)
에서 값은 변경했습니다. 아래의ambient_intensity_source_gif_018
에서 결과를 확인하실 수 있습니다.
시각적으로 매력적인 이미지 생성을 위해 이 값을 활용해보시기 바랍니다.
코드→
결론 및 마지막 한 가지 트릭
영역 마스킹(masking a region)
논문은 원하는 영역에만 라이팅 이팩트를 적용하기 위해 이미지를 마스킹하는 법에 대해서 설명하고 있습니다. 이를 위해, 이진 마스크(binary mask)를 생성하고 알고리듬에 전달할 수 있습니다. 저희는 아래의 그림에서 저자들이 제공한 예시를 시각화했습니다. 어떻게 기린에 수평 이팩트(horizontal effect)만 기린에 적용되었는지 확인하세요.
결론
작업하기에 즐거운 프로젝트였습니다. 이 프로젝트는 여전히 연구 중이며, 저자는 광범위한 적용을 가능케 하는 Photoshop 플러그인을 개발 중 입니다. 시각 자료가 마음에 드셨기를 바라며, 여러분이 직접 repo를 직접 한 번 시도하게끔 하는 동기부여가 됐기를 바랍니다. 오늘날의 딥러닝 시대에서도, 전통적인 이미지 프로세싱 알고리듬이 때때로 놀라운 결과를 만들어 낼 수 있다는 것은 종말로 흥미로운 일입니다. 피드백 하실 내용이 있으시다면, 트위터 @ayushthakur0로 언제든지 연락해 주시기 바랍니다.