가우시안으로 그림 그리기
단순한 기계적 이미지 변환을 넘어, 이미지의 엣지(Edge) 정보를 활용해 붓터치 방향과 길이를 결정하는 디지털 페인팅 알고리즘을 소개합니다. 2D 가우시안 스플래팅(splatting)과 엣지 검출 기술을 결합하여, 기존의 느리고 결과물이 그림처럼 보이지 않던 경사 하강법(Gradient Descent) 방식의 한계를 극복했습니다.
날짜: 2026년 8월 3일 제목: 가우시안으로 그림 그리기 (Painting with Gaussians)
작년에 저는 이미지를 픽셀 아트로 변환하기 위해, 단순히 고정된 격자를 이미지 위에 덮는 대신 이미지의 윤곽선(엣지)을 따라 격자가 변형되도록 하는 '엣지 인식 픽셀화 도구'를 만든 적이 있습니다. 이렇게 변형된 격자를 바탕으로 픽셀의 색상과 밝기를 결정하도록 한 방식은 윤곽선을 또렷하게 유지하고 디테일을 보존하는 데 효과적이었습니다. 나중에 저는 이러한 윤곽선 정보가 디지털 페인팅에도 똑같이 적용될 수 있음을 깨달았습니다.
페인팅 프로그램은 붓터치를 어디에 놓을지, 크기는 얼마로 할지, 그리고 어느 방향으로 흘러가게 할지 결정해야 합니다. 이러한 정보의 상당 부분은 이미 영역 간의 경계를 나타내는 윤곽선에 인코딩되어 있습니다. 이 윤곽선들은 붓이 따라 그리게 될 객체 영역의 외곽선이며, 윤곽선이 없다는 것은 넓은 붓터치 몇 번만으로 충분한 평평한 영역임을 의미합니다. 그래서 저는 이미지의 구조에서 도출된 형태가 실제 붓터치를 닮은 디지털 페인팅 스타일의 프로그램을 만들 수 있을지 확인해 보기로 했습니다. 제 목표는 사용자가 슬라이더를 드래그하면 그림이 눈앞에서 실시간으로 다시 그려지는 대화형 도구를 만드는 것이었습니다. 또한 이 프로젝트는 'Jolt'를 테스트해보고, 이를 통해 복잡한 프로젝트를 구축할 때 얼마나 잘 작동하는지 확인할 수 있는 좋은 기회였습니다. 이 글에서는 모든 것이 어떻게 구성되었는지 안내해 드릴 것입니다. 어떤 아이디어가 효과가 있었고 어떤 것이 아닌지도 살펴볼 것입니다. 가장 중요한 것은, 최종 결과물이 실제로 그림처럼 보이게 될지 알아보는 것입니다.
왜 가우시안(Gaussians)인가?
계산적 관점에서 고려해야 할 첫 번째 질문은 붓터치가 정확히 무엇인가입니다. 유화나 아크릴 물감의 붓터치는 길쭉한 자국으로, 중심부의 짙은 색상이 가장자리로 갈수록 퍼져나가며, 그 방향은 캔버스 위를 끌고 간 붓의 움직임 결과물입니다. 가장자리는 반투명하며 붓터치가 겹쳐지므로, 화가는 먼저 넓은 색상 블록을 칠한 다음 더 작고 반투명한 자국을 위에 덧칠하여 섬세한 디테일을 추가할 수 있습니다.
이러한 개념은 2D 가우시안 스플래팅(splatting)과 놀라울 정도로 잘 들어맞습니다. 가우시안 스플랫에는 붓터치가 떨어지는 위치를 나타내는 평균(mean), 어떻게 늘어나고 회전하는지를 나타내는 공분산 행렬(covariance matrix), 그리고 색상 및 불투명도가 있습니다. 공분산은 주축(major axis)이 붓터치를 따라 향하고 단축(minor axis)이 가로지르도록 하여 붓의 방향과 길이를 인코딩하는 데 사용될 수 있습니다. 알파(alpha) 값을 이용해 각 스플랫이 뒤에 있는 것을 가리는 방식의 표준 합성(over-compositing)으로 스플랫 필드를 렌더링하면, 자국이 쌓이고 섞이는 자연스러운 페인팅 모델과 유사한 효과를 얻을 수 있습니다. 물론 실제 물감과 똑같은 정확도를 얻을 수는 없으므로, 그 효과는 GIMP나 Krita 같은 도구를 사용한 디지털 페인팅에 더 가깝습니다.
이미 'DrawingWithGaussians'나 '2d-gaussian-splatting-Art'와 같이 이 아이디어를 구현한 사례들이 있습니다. 하지만 이들은 무작위 스플랫을 심어놓고 렌더링된 결과물이 대상 이미지와 같아 보일 때까지 위치, 모양, 색상을 반복적으로 조정하는 경사 하강법(gradient descent) 방식을 사용합니다. 이 방식은 잘 알려져 있지만 속도가 느리고 과정을 직관적으로 파악하기 어렵습니다. 가장 안 좋은 점은 최종 결과물이 어떤 형태의 그림이라기보다는 단순히 입력 이미지의 손실 많은(lossy) 재구축에 불과해진다는 것입니다.
저는 이미 이미지에서 윤곽선 정보를 추출하는 솔루션을 가지고 있었기 때문에, 이미지를 맹목적으로 변형(진화)시킬 필요성을 느끼지 못했습니다. 대신, 추출된 윤곽선은 디테일의 위치와 붓터치의 방향을 알려주므로 페인팅 과정을 안내하는 데 사용될 수 있습니다. 디테일의 밀도와 픽셀 색상만 있다면 경사 하강법에 의존하지 않고도 필요한 모든 정보를 얻을 수 있었습니다. 기본적으로 기존 이미지를 그대로 따라 그리기만 하면 되는 셈입니다. 도대체 얼마나 어렵겠습니까? 그래서 저는 'pixel = background + Σ(intensity × color)' 방식의 더하기(Additive) 혼합을 사용하는 래스터라이저를 구현하는 방향으로 시작했습니다. 결과적으로 이 접근 방식은 최적화기가 겹침을 보상하는 색상을 학습하기 때문에 피팅(fitting) 과정에서 잘 작동하는 것으로 드러났습니다.