데니슈크 홀로그램에 관심을 갖게 된 계기는 얇고 평평한 판에서 느껴지는 놀라운 입체감이었다. 겉으로는 2D 이미지가 담긴 얇은 판처럼 보이지만, 들여다보면 마치 창문 너머에 실제 대상이 놓여 있는 듯하다. 시점을 바꾸며 대상의 앞뒤 깊이를 살펴볼 수 있다는 점이 특히 인상적이었다. 평면 사진을 볼 때와는 다른, 그 공간을 직접 들여다보는 듯한 느낌이다.
아래 영상은 이 글의 출발점이 된 홀로그램의 모습을 보여 준다. 이런 입체감이 어떻게 얇은 판에 기록되는지 알아보고, 사진 한 장과 코드로 그 느낌을 어디까지 표현할 수 있을지 실험해 보고 싶었다.
데니슈크 홀로그램이란?
데니슈크(Denisyuk) 홀로그램은 하나의 레이저 빔으로 기록하는 반사형 홀로그램이다. 레이저 빛이 투명한 기록판을 통과해 뒤쪽 물체를 비추면, 물체에서 돌아오는 빛과 입사하는 빛이 기록층 안에서 만나 간섭무늬를 만든다. MIT의 데니슈크 홀로그래피 실습 자료에서 이 구성을 확인할 수 있다.
기록층의 미세한 간섭 구조는 특정 파장을 선택적으로 반사한다. 그래서 적절한 방향에서 백색광을 비추어도 입체상이 보인다. 단일 파장으로 기록한 홀로그램의 단색 입체감을 이번 실험의 출발점으로 삼았다. 원리와 재생 조건
사진 한 장으로 그 모습을 표현하기
코드에서는 사진 속 앞뒤 깊이를 추정해 시점에 따른 움직임을 만들고, 레이저 파장에 맞춘 색을 입힌다. 광학 간섭무늬를 계산하는 대신, 데니슈크 홀로그램의 입체감과 단색 표현을 체험하는 2.5D 실험이다.
아래에서 사진을 선택해 시작하자. 사진과 깊이맵은 브라우저 메모리에만 남으며, 사진을 지우거나 페이지를 떠나면 해제한다.
사진 한 장을 선택하고, 깊이를 더해 새로운 시점에서 바라보세요.
사진과 깊이맵은 이 기기에서만 처리합니다. AI 서버로 전송하거나 서버에 저장하지 않습니다.
사진을 선택한 뒤 «입체감 만들기»를 누르세요.
사진을 선택해 시작하세요
이렇게 관찰해 보자
- 앞쪽 피사체와 뒤쪽 배경이 뚜렷한 사진을 선택하고 입체감 만들기를 누른다. 첫 실행은 모델 다운로드 때문에 오래 걸릴 수 있다.
- 원본, 깊이맵, 3D 결과를 번갈아 살펴본다. 깊이맵의 밝은 부분은 가깝고, 어두운 부분은 멀다고 추정한 영역이다.
- 3D 화면에서 마우스를 움직이거나 터치해 드래그한다. 화면에 키보드 초점을 두면 방향키로 시점을 이동하고 Home 키로 돌아올 수 있다.
- 깊이 강도와 시점 이동 범위를 조금씩 높여 본다. 경계가 늘어나 보이면 두 값을 낮춘다. 조명 방향을 바꾸면 표면의 굴곡이 더 잘 드러난다.
- Hologram을 선택하면 레이저 색상 설정이 나타난다. 파장은 632.8 nm · He–Ne, 레이저 색상 보정은 100% 로 시작한다. 시점과 조명에 따라 밝기가 바뀌면서 적색의 입체감을 유지한다. 컬러 사진은 3D Photo로 돌아가 비교한다.
깊이 추정과 2.5D 표면
Depth Anything V2 Small은 사진 속 형태와 문맥을 바탕으로 상대적 깊이를 추정한다. 실제 거리나 치수를 측정하는 도구는 아니다. 유리, 반사면, 투명한 물체, 흐린 경계에서는 추정이 틀릴 수 있다.
이 실험은 추정값을 정규화하고 완만하게 다듬은 뒤, Three.js의 촘촘한 평면 메시를 깊이 방향으로 변위시킨다. 원본 사진을 텍스처로 입히고 작은 범위에서 관찰 카메라를 움직인다. 외곽 변위를 줄이고 컬러 모드에 평면 배경을 덧대어 가장자리의 빈 영역을 줄였다.
첫 버전은 2.5D 구현이다. 사진에 없는 뒷면이나 가려진 배경을 복원하지 않으며, 큰 시점 이동에서는 텍스처가 늘어날 수 있다. Hologram은 반사형 홀로그램을 연상시키는 색과 광택 표현으로, 광학 홀로그램의 간섭무늬를 생성하지 않는다.
레이저 색깔에 가깝게 보정하기
파장 프리셋에서 405, 473, 532, 632.8, 650 nm를 선택하거나, 파장 슬라이더로 400–700 nm 사이를 직접 조절한다. 632.8 nm의 적색과 532 nm의 녹색을 비교해 보자. 색 견본과 3D 결과에 즉시 적용되며, 깊이 추정을 다시 실행할 필요는 없다.
레이저 색상 보정을 100%로 두면 사진의 밝기 정보를 이용하되 표면과 하이라이트를 모두 선택한 파장의 색조로 표현한다. 0%로 낮추면 기존 무지갯빛 반사 효과가 나타나고, 중간값은 두 표현을 섞는다. 단색 재생의 모습을 관찰하려면 100%를 유지하고 조명 방향을 바꾸어 본다.
색상은 Wyman·Sloan·Shirley의 CIE 1931 색 일치 함수 근사식으로 파장을 XYZ 값으로 변환한 뒤, 선형 sRGB 변환을 적용한다. 화면에서 표현할 수 없는 채널은 잘라내고 밝기를 정규화한다. 모니터의 RGB로 근사한 색이며, 실제 레이저의 스펙트럼이나 광량을 재현하지 않는다.
실제 홀로그램의 재생 색은 기록판의 수축·팽창과 조명 각도에도 영향을 받는다. 여기서는 선택한 파장을 고정해 비교하며, 그에 따른 광학적 파장 이동은 계산하지 않는다. MIT의 관찰 실습
브라우저와 성능
Transformers.js와 ONNX Runtime Web을 이용해 방문자의 브라우저에서 추론한다. WebGPU를 사용할 수 있으면 GPU를 우선 사용하고, 초기화 또는 추론에 실패하면 CPU/WASM으로 전환한다. CPU 호환 모드를 직접 선택할 수도 있다. 별도 AI 서버나 유료 API는 사용하지 않는다.
사진은 최대 20 MB·40 MP이며, 가로세로 비율은 8:1 이내로 제한한다. 표시용 사진은 긴 변 1,024 픽셀 이하로 줄인다. 모델 입력은 일반 GPU 모드에서 392 × 392, CPU 또는 저사양 모드에서 280 × 280으로 제한하므로 세부 묘사와 깊이 경계가 단순해질 수 있다.
모델과 실행 파일은 외부 호스트에서 다운로드하며, 모델 파일은 브라우저 캐시에 저장될 수 있다. 사진이나 추론 결과를 이 캐시에 저장하지 않는다. 첫 실행에 GPU 모델 약 50 MB(반정밀도를 지원하지 않으면 약 99 MB), CPU 모델 약 27 MB와 실행 파일이 필요하다. GPU에서 CPU로 전환하면 CPU 모델을 추가로 다운로드할 수 있다.
추론은 Worker에서 실행해 화면 조작을 유지하며, 취소하면 Worker를 종료한다. 추론이 끝나면 모델 메모리도 해제한다. 3D 렌더링은 조작할 때만 실행하고, 화면 밖 또는 숨겨진 탭에서는 멈춘다. 느린 기기는 화면 해상도를 자동으로 낮추며, 저사양 모드로 다시 생성하면 추론과 메시의 부담도 줄일 수 있다.
모델 출처와 공개 라이선스
- 원본: Depth Anything V2, Lihe Yang 외, 2024. Small 모델: Apache 2.0. 다른 크기 모델은 라이선스가 다르므로 이 실험에서 사용하지 않는다.
- ONNX 변환: onnx-community/depth-anything-v2-small, Apache 2.0. 이 버전은 단일 ONNX 파일을 제공해 Transformers.js 3.8.1과 함께 사용하며, 리비전 4472b73으로 고정했다. 후속 ONNX 저장소는 가중치를 별도 파일로 제공한다.
- Transformers.js: Apache 2.0 · ONNX Runtime: MIT · Three.js: MIT.
사용자가 선택하는 사진의 저작권은 해당 권리자에게 있다.