[MIT 머신비전 6강] 조명 세 개로 표면의 방향 알아내기 | 포토메트릭 스테레오(Photometric Stereo)
MIT 6.801 머신비전(Machine Vision, Berthold Horn) 6강 정리. 램버트 반사와 표면 법선, 조명 세 개로 표면 방향을 구하는 포토메트릭 스테레오(Photometric Stereo)의 원리와 잡음 문제를 쉽게 설명합니다.
MIT OpenCourseWare 6.801 6강 원본 영상 (영어)
한 줄 요약: 카메라는 그대로 두고 조명만 세 번 바꿔 찍으면, 픽셀마다 “표면이 어느 쪽을 보고 있는지”를 간단한 연립방정식으로 구할 수 있습니다. 이것이 포토메트릭 스테레오입니다. 다만 조명을 한쪽에 몰아 두면 작은 잡음이 크게 부풀려집니다.
밝기는 빛을 받는 각도에 달려 있다
종이, 석고, 분필처럼 반짝이지 않는 표면을 램버트 표면이라고 부릅니다. 이런 표면은 빛을 정면으로 받는 곳이 가장 밝고, 비스듬히 받을수록 어둡습니다. 그리고 어느 쪽에서 보든 밝기가 똑같습니다. 밝기는 빛과의 각도에만 달려 있습니다.
왼쪽: 왼쪽 위에서 빛을 받은 무광 공. 오른쪽: 표면 수직 방향이 빛과 이루는 각이 60°이면 밝기는 절반, 90°면 0입니다.
\(E\)는 카메라에 찍힌 밝기, \(\hat n\)은 표면에 수직인 방향(길이 1인 화살표), \(\hat s\)는 조명 쪽 방향, \(\rho\)는 그 표면이 원래 얼마나 하얀지(알베도)입니다. 가운데 점(·)은 두 화살표가 얼마나 같은 쪽을 보는지를 재는 계산이고, 각도의 코사인과 같습니다.
표면의 방향은 숫자 두 개
표면의 한 작은 조각은 거의 평평한 판으로 볼 수 있습니다. 판이 기운 정도는 x쪽 기울기 p와 y쪽 기울기 q 두 숫자면 충분합니다. 등산로 표지판의 “경사 10%”를 동서 방향, 남북 방향으로 하나씩 적는다고 생각하면 됩니다.
x쪽으로 1 갈 때 높이가 p, y쪽으로 1 갈 때 높이가 q만큼 오른다면, 표면에 수직인 방향은 (-p, -q, 1) 쪽입니다.
그래서 우리가 알아내야 할 미지수는 픽셀마다 p, q 두 개, 표면 색(알베도)까지 치면 세 개입니다.
사진 한 장으로는 왜 부족할까
밝기 하나를 재면 “빛과의 각도가 얼마인지”만 압니다. 그런데 같은 각도를 이루는 방향은 조명 주위로 고리 모양으로 무수히 많습니다.
가능한 표면 방향들을 위에서 본 반구에 그렸습니다. 사진 1장이면 고리 전체, 2장이면 두 고리가 만나는 두 점, 3장이면 딱 하나로 정해집니다.
- 1장: 고리 위 어디든 가능합니다.
- 2장: 두 고리가 만나는 두 점 중 하나입니다. (식이 2차라서 답이 2개 나옵니다.)
- 3장: 세 고리가 모두 지나는 점은 하나뿐입니다.
포토메트릭 스테레오: 조명만 바꿔 세 번 찍기
카메라와 물체는 그대로 두고 조명 위치만 바꿔 세 장을 찍습니다. 같은 픽셀에서 밝기 세 개 \(E_1, E_2, E_3\)를 얻습니다.
여기서 요령은 알베도와 방향을 한 화살표 \(\mathbf n = \rho \hat n\)으로 묶는 것입니다. 그러면 세 식이 모두 1차식이 되어 고등학교 연립방정식처럼 한 번에 풀립니다.
\[\mathbf n = S^{-1} \mathbf E\]\(S\)는 세 조명 방향을 한 줄씩 쌓은 3×3 표, \(\mathbf E\)는 밝기 세 개입니다. 구한 화살표의 방향이 표면 방향이고, 길이가 알베도입니다. 색과 모양이 한 번에 분리됩니다.
위: 언덕 두 개와 칠한 띠가 있는 물체를 조명만 바꿔 찍은 사진(직접 만든 장면). 아래: 픽셀마다 연립방정식을 풀어 얻은 표면 방향, 알베도, 그리고 색을 뺀 모양.
카메라가 하나뿐이라도 세 가지 색 채널(빨강·초록·파랑)을 쓰면 한 번에 찍을 수도 있습니다. 세 방향에 서로 다른 색 조명을 두는 방법인데, 색 채널끼리 섞이는 문제와 물체 자체에 색이 있으면 헷갈리는 문제가 있습니다.
조명을 몰아 두면 잡음이 커진다
세 조명이 한 평면 위에 놓이면 표 \(S\)를 거꾸로 풀 수 없습니다. 거의 한 평면이거나 거의 같은 방향이면 풀리긴 하지만, 사진의 작은 잡음이 결과에서 몇 배로 커집니다. 이를 노이즈 증폭이라고 합니다.
세 조명을 같은 각도로 벌릴 때의 노이즈 증폭. 세 조명이 서로 직각일 때(약 55°)가 가장 좋고, 한데 모이거나 지평선 쪽으로 눕히면 급격히 나빠집니다.
가장 좋은 배치는 세 조명 방향이 서로 직각일 때입니다. 표면 방향이 조금만 달라져도 세 밝기 중 어딘가가 크게 변하기 때문입니다.
강의에서 든 재미있는 예가 달입니다. 지구에서 보면 태양, 지구, 달이 거의 한 평면 위에서 움직여서, 달을 비추는 햇빛 방향들도 거의 한 평면에 놓입니다. 그래서 지구에서 찍은 달 사진만으로는 포토메트릭 스테레오로 달의 지형을 제대로 풀 수 없습니다.
직접 해 보기
색 동그라미(조명 1, 2, 3)를 끌어 보세요. 가운데로 모으거나 테두리에 늘어놓으면 “계산으로 되찾은 모양”이 지저분해지고, 노이즈 증폭 숫자가 커집니다. 잡음 슬라이더도 움직여 보세요.
조명을 지평선 근처로 눕히면 그림자가 생기는 곳도 늘어납니다. 그림자 속은 밝기가 0이라 식이 맞지 않으니, 실제 장비에서는 조명을 너무 눕히지 않습니다.
정리
- 무광(램버트) 표면의 밝기는 빛과 표면 수직 방향 사이 각도의 코사인에 비례하고, 보는 방향과는 상관없습니다.
- 표면 방향은 기울기 두 개 (p, q)로 나타내며, 밝기 하나로는 고리 위의 후보만 알 수 있습니다.
- 조명을 바꿔 세 장을 찍고 알베도를 방향과 한 화살표로 묶으면, 픽셀마다 1차 연립방정식으로 방향과 색을 함께 구합니다.
- 조명은 서로 직각에 가깝게 벌려 놓아야 하며, 한 평면이나 한 방향에 몰리면 잡음이 크게 부풀려집니다.
참고: MIT 6.801/6.866 Machine Vision (Fall 2020), Berthold Horn · Ryan Sander · Tadayuki Yoshitake 강의 노트 (MIT OpenCourseWare, CC BY-NC-SA 4.0)