📋 목차
스테레오 매칭이란 무엇인가
스테레오 매칭은 서로 약간 다른 위치에서 촬영된 두 장의 이미지를 이용해 장면의 깊이 정보를 추정하는 기술이다. 핵심 아이디어는 직관적이다. 같은 물체라도 관측 위치가 다르면 영상 위에 맺히는 위치가 조금 달라지는데, 이 위치 차이를 이용하면 물체가 카메라로부터 얼마나 떨어져 있는지 계산할 수 있다.
인간이 두 눈으로 거리감을 느끼는 원리와 거의 같다. 왼쪽 눈과 오른쪽 눈은 약간 떨어져 있으므로 같은 물체를 보더라도 망막에 맺히는 위치가 조금 다르고, 뇌는 이 차이를 이용해 입체감을 복원한다. 스테레오 비전도 본질적으로 같은 문제를 수학적으로 푸는 것이다.
그런데 실제 계산은 그렇게 단순하지 않다. “왼쪽 영상의 이 점이 오른쪽 영상의 어디에 대응하는가?”를 정확히 찾는 일이 매우 어렵기 때문이다. 비슷한 텍스처가 반복될 수도 있고, 한쪽에서는 보이지만 다른 쪽에서는 가려질 수도 있고, 조명이 달라질 수도 있다. 그래서 스테레오 매칭은 보통 다음과 같은 단계적 처리 파이프라인으로 구성된다.
1. 이미지 보정 (Image Rectification)
왜 필요한가
이론적으로 왼쪽 이미지의 어떤 3차원 점에 대응하는 오른쪽 이미지의 점은 에피폴라 기하(Epipolar Geometry)에 의해 특정 선 위에 존재한다. 이를 에피폴라 라인이라고 한다. 왼쪽 이미지에서 한 점을 잡으면 오른쪽 이미지 전체를 다 뒤질 필요 없이, 대응하는 에피폴라 선 위에서만 찾으면 된다.
문제는 실제 카메라 배치가 완벽히 정렬되어 있지 않다는 것이다. 카메라가 약간 회전해 있거나, 높이가 다르거나, 렌즈 왜곡이 있으면 에피폴라 라인이 수평선이 아니라 기울어진 선이 된다. 그러면 대응점을 찾기 위해 매번 비스듬한 선을 따라 탐색해야 하고 계산이 복잡해진다.
이미지 보정의 목표는 다음과 같다.
- 두 영상의 에피폴라 라인을 모두 수평선으로 변환한다
- 대응점 탐색을 같은 행(row) 상의 1차원 문제로 바꾼다
- 렌즈 왜곡과 카메라 상대 자세 때문에 생기는 불필요한 기하학적 차이를 제거한다
원래 2차원 탐색이 필요한 문제를 1차원 수평 이동 탐색 문제로 바꾸는 핵심 전처리다.
실제로 무엇을 하는가
이 단계에서는 먼저 카메라 캘리브레이션 정보가 필요하다.
- 내부 파라미터(intrinsic): 초점거리, 주점(principal point), 왜곡 계수
- 외부 파라미터(extrinsic): 두 카메라 사이의 회전과 이동
이 정보로 각 이미지에 대해 적절한 호모그래피 변환 또는 재사영 변환을 적용하여 두 영상을 새로운 공통 평면 위에 재배치한다. 결과적으로 동일한 3차원 점이 두 영상에서 거의 같은 $y$ 좌표를 갖게 된다.
보정 후에는 대응 관계가 다음처럼 바뀐다.
- 왼쪽 점: $(x_L, y)$
- 오른쪽 대응점: $(x_R, y)$
같은 $y$ 좌표를 가지므로, 시차는 단순히 $d = x_L - x_R$ 형태로 계산할 수 있다.
왜 계산량을 줄이는가
보정이 없으면 왼쪽 픽셀 하나에 대해 오른쪽 이미지의 넓은 2차원 영역을 탐색해야 한다. 보정이 끝나면 같은 행에서만 찾으면 되므로 각 픽셀마다 후보 탐색 공간이 크게 줄어든다.
한계와 주의점
이미지 보정이 완벽하지 않으면 이후 단계가 모두 흔들린다.
- 캘리브레이션이 틀리면 대응점이 같은 row에 오지 않음
- 렌즈 왜곡이 남아 있으면 정합 오차 증가
- 재사영 과정에서 해상도 손실이나 블러가 생길 수 있음
스테레오 매칭은 표면적으로는 “매칭 문제”지만, 실제 성능은 기하 보정 품질에 크게 좌우된다.
2. 비용 계산 (Cost Computation)
본질
보정된 왼쪽 이미지의 한 픽셀 $p$에 대해, 오른쪽 이미지의 같은 행에 있는 여러 후보 픽셀 $p’$ 중 무엇이 진짜 대응점인지 판단해야 한다. “둘이 얼마나 비슷한가?”를 숫자로 나타낸 것이 매칭 비용(matching cost)이다. 비용이 작을수록 더 잘 맞는다고 해석한다.
이 단계는 각 픽셀과 가능한 시차 후보들에 대해 “이 시차가 맞을 가능성이 얼마나 높아 보이는가?”를 점수표 형태로 만드는 과정이다. 이를 보통 cost volume이라고 부른다. 픽셀 위치 $(x, y)$와 시차 $d$마다 비용 $C(x, y, d)$를 저장하는 3차원 구조다.
왜 단순 픽셀 비교만으로는 부족한가
가장 단순한 생각은 왼쪽 픽셀의 밝기값과 오른쪽 후보 픽셀의 밝기값을 직접 비교하는 것이다. 하지만 현실에서는 문제가 있다.
- 조명이 조금만 달라도 밝기값이 달라짐
- 센서 노이즈가 있음
- 표면 반사 특성이 다름
- 텍스처가 없는 영역에서는 여러 후보가 비슷하게 보임
그래서 실제로는 단일 픽셀보다는 작은 패치나 주변 관계를 함께 봐야 한다.
대표적인 비용 함수들
SAD (Sum of Absolute Differences) — 가장 고전적인 방법이다. 왼쪽 패치와 오른쪽 패치의 같은 위치 픽셀들끼리 밝기 차이의 절대값을 모두 더한다.
\[\text{SAD}(p, d) = \sum_{q \in W(p)} \lvert I_L(q) - I_R(q - d) \rvert\]여기서 $W(p)$는 픽셀 $p$ 주변의 윈도우다. 두 패치가 비슷하면 각 픽셀 차이가 작으므로 전체 합도 작아진다. 계산이 빠르고 구현이 쉽지만, 밝기 변화에 매우 민감하다. 그림자나 노출 차이가 있으면 쉽게 깨진다.
NCC (Normalized Cross Correlation) — 두 패치가 상관관계 측면에서 얼마나 유사한지를 본다. 평균과 분산을 정규화한 뒤 비교하기 때문에 밝기가 전체적으로 조금 달라져도 강인하다. “절대 밝기값이 똑같은가”보다 “밝기 패턴의 모양이 비슷한가”를 보는 방식이다. 조명 변화에 SAD보다 강하지만 계산이 더 무겁고, 텍스처가 부족한 곳에서는 여전히 불확실하다.
Census Transform — 매우 중요한 방법이다. 픽셀의 절대 밝기값 자체보다, 주변 픽셀들과의 상대적인 밝기 관계를 사용한다. 중심 픽셀 주변 이웃들이 중심보다 밝은지 어두운지를 0과 1의 비트열로 표현하고, 왼쪽과 오른쪽의 비트열을 비교해 해밍 거리(Hamming distance)를 계산한다.
핵심 장점은 다음과 같다.
- 조명 변화에 강함
- 절대 밝기 스케일 변화에 덜 민감함
- 경계 구조를 비교적 잘 보존함
실전 스테레오 알고리즘에서 Census 계열은 굉장히 자주 사용된다. 특히 야외 환경이나 조도 변화가 있는 경우 유리하다.
비용 계산의 핵심 난제
비용 계산만으로는 정답이 결정되지 않는 경우가 많다.
- 텍스처가 거의 없는 영역 — 하얀 벽처럼 변화가 없으면 여러 후보 시차가 모두 비슷한 비용을 가질 수 있다
- 반복 패턴 — 창문, 타일, 난간처럼 비슷한 무늬가 반복되면 잘못된 대응점을 고르기 쉽다
- 반사/투명 표면 — 유리, 물, 금속 반사는 시점에 따라 모양이 달라져서 밝기 일관성 가정을 깨뜨린다
- 가려짐(Occlusion) — 왼쪽에서는 보이지만 오른쪽에서는 안 보이는 영역은 진짜 대응점이 존재하지 않는다
비용 계산은 “후보 평가” 단계일 뿐이며, 이것만으로는 안정적인 시차 지도를 만들기 어렵다.
3. 비용 집계 (Cost Aggregation)
왜 필요한가
비용 계산 단계에서 얻은 $C(x, y, d)$는 매우 국소적(local)이다. 한 픽셀 또는 작은 패치만 보고 계산한 값이라 노이즈나 우연한 밝기 유사성에 쉽게 흔들린다. 비용 집계 단계에서는 주변 픽셀들의 정보를 함께 사용해 비용을 더 안정적으로 만든다.
실제 세계에서 같은 물체 표면 위의 이웃 픽셀들은 대체로 비슷한 깊이를 가진다.
따라서 한 픽셀의 시차를 결정할 때 주변 픽셀들의 경향을 반영하면 잡음이 줄어든다.
기본 아이디어
각 픽셀에서 시차 후보별 비용을 그냥 쓰지 않고, 주변 윈도우의 비용을 모아서 새로운 집계 비용을 만든다. 단순 박스 윈도우라면,
\[\tilde{C}(x, y, d) = \sum_{(u,v) \in W(x,y)} C(u, v, d)\]이렇게 하면 개별 픽셀의 불안정한 비용이 주변 평균에 의해 완화된다.
단순 평균의 문제
물체 경계가 있다고 하자. 경계 왼쪽은 가까운 물체, 오른쪽은 먼 배경이라면 실제 시차가 크게 달라진다. 이때 큰 윈도우로 평균을 내면 서로 다른 깊이가 섞여서 경계가 흐려진다. 비용 집계는 노이즈를 줄이는 대신 깊이 경계를 뭉개는 부작용이 있다.
개선된 방법들
고정 윈도우 기반 집계 — 가장 단순한 방식이다. 구현은 쉽지만 경계 보존이 약하다.
가중 윈도우 기반 집계 — 중심 픽셀과 색이 비슷하고 거리가 가까운 픽셀에 더 높은 가중치를 부여한다. 같은 물체 내부의 픽셀은 강하게 묶고, 색이 급격히 바뀌는 경계 너머 픽셀은 덜 반영한다. “가까운 픽셀”보다 “같은 표면일 가능성이 높은 픽셀”을 더 신뢰하는 방식이다.
Bilateral / Guided Filter 계열 — 공간 거리와 색 차이를 동시에 고려하여 비용을 부드럽게 만든다. 깊이 경계를 비교적 잘 보존하면서도 잡음을 줄일 수 있다.
Cross-based aggregation — 적응적으로 윈도우 모양을 바꾼다. 물체 경계를 넘지 않도록 비슷한 색 영역 안에서만 집계하려는 접근이다.
본질적 역할
비용 집계는 단순히 “평균내기”가 아니다. 매칭 비용의 신뢰도를 주변 문맥을 통해 재해석하는 단계다. 개별 픽셀만 보면 잘못된 후보가 낮은 비용을 가질 수 있지만, 주변 구조를 함께 보면 그 후보가 부자연스럽다는 것이 드러날 수 있다. 즉, local evidence를 neighborhood context로 보강하는 과정이다.
4. 시차 최적화 (Disparity Optimization)
이 단계에서 결정되는 것
앞 단계까지 오면 각 픽셀 $(x, y)$와 각 시차 $d$에 대해 집계된 비용 $\tilde{C}(x, y, d)$가 있다. 이제 해야 할 일은 각 픽셀마다 최종 시차값 하나를 선택하는 것이다. 스테레오 매칭의 핵심 출력인 disparity map을 만드는 단계다.
Local Method: WTA (Winner-Takes-All)
가장 단순한 방법은 픽셀마다 비용이 가장 작은 시차를 선택하는 것이다.
\[d^*(x, y) = \arg\min_d \tilde{C}(x, y, d)\]빠르고 간단하지만 각 픽셀을 독립적으로 결정하므로 전체 장면 구조를 잘 반영하지 못한다. 노이즈가 조금만 있어도 픽셀별 결과가 들쭉날쭉해진다. 계산은 빠르지만 전역적 일관성이 약하다.
왜 Global 관점이 필요한가
현실 세계의 깊이는 무작위가 아니다. 대부분의 물체 표면은 연속적이며, 깊이는 공간적으로 어느 정도 매끄럽게 변한다. 물체 경계에서는 갑자기 달라질 수 있지만, 같은 표면 내부에서는 급격히 튀지 않는다.
좋은 disparity map은 두 조건을 동시에 만족해야 한다.
- 각 픽셀에서 영상 증거와 잘 맞아야 한다
- 전체적으로 너무 들쭉날쭉하지 않아야 한다
이 두 조건을 함께 만족시키려면 에너지 최소화 문제로 정식화한다.
에너지 함수
보통 다음과 같은 형태를 사용한다.
\[E(D) = \sum_p C(p, D_p) + \sum_{(p,q) \in \mathcal{N}} P(D_p, D_q)\]- $D_p$: 픽셀 $p$의 시차
- 첫 번째 항: 데이터 항(data term), 영상과 얼마나 잘 맞는지
- 두 번째 항: 매끄러움 항(smoothness term), 이웃 픽셀들의 시차가 너무 다르면 패널티 부여
영상 증거와 공간적 부드러움 사이의 균형을 잡는 문제다.
SGBM (Semi-Global Block Matching)
실전에서 매우 자주 쓰이는 방법이다. 완전한 global optimization은 계산량이 매우 크기 때문에, SGBM은 여러 방향으로 경로를 따라 비용을 누적하여 준전역적(semi-global)으로 최적화한다.
- 좌우, 상하, 대각선 등 여러 방향에서 누적 비용을 계산
- 시차가 갑자기 크게 바뀌면 패널티 부여
- 여러 방향 결과를 합쳐 전체적으로 더 일관된 시차 결정
완전 global은 아니지만, 단순 WTA보다 훨씬 안정적이다. OpenCV 등에서도 널리 사용된다.
Graph Cuts / Belief Propagation
보다 명시적으로 에너지 최소화를 푸는 기법이다. 이론적으로 강력하지만 계산량이 더 크고 구현 복잡성도 크다.
- Graph Cuts: 특정 형태의 에너지 최소화에 강함
- Belief Propagation: 확률적 메시지 전달을 통해 최적해 근사
고전 스테레오 비전에서 매우 중요한 역할을 했다.
최적화의 핵심 난점
부드러움 가정의 양면성 — 너무 강하게 강제하면 경계가 뭉개지고, 너무 약하게 하면 노이즈가 많아진다.
반복 텍스처 — 영상 증거 자체가 애매하면 전역 최적화도 틀린 해를 고를 수 있다.
얇은 구조물 — 전선, 난간, 가지처럼 매우 얇은 구조는 주변 배경과 섞이기 쉬워 잘 복원되지 않는다.
최적화는 “정답을 찾는 마법 단계”가 아니라, 불완전한 비용 정보 위에 구조적 제약을 더하는 단계다.
5. 시차 보정 (Disparity Refinement)
왜 마지막 보정이 필요한가
앞 단계까지 거쳐도 disparity map에는 여전히 다음과 같은 오류가 남는다.
- 경계 주변의 잘못된 시차
- 가려짐 영역의 오차
- 소금-후추 형태의 점 잡음
- 정수 시차만 써서 생기는 거친 계단 현상
마지막으로 후처리를 통해 시차 지도를 더 자연스럽고 신뢰도 높게 다듬는다.
좌우 일관성 검사 (Left-Right Consistency Check)
매우 중요한 검증 방법이다. 왼쪽 기준으로 구한 disparity map과, 오른쪽 기준으로 구한 disparity map을 서로 비교한다. 이상적으로는 왼쪽 픽셀에서 오른쪽으로 이동한 대응점이, 다시 반대로 왔을 때 원래 위치로 돌아와야 한다.
이 둘이 서로 일치하지 않는다면 보통 다음 둘 중 하나다.
- 가려짐 영역이라 진짜 대응점이 없음
- 잘못된 매칭이 선택됨
이런 픽셀은 invalid로 표시하거나 주변 값으로 보간한다.
서브픽셀 추정 (Sub-pixel Estimation)
기본 시차 탐색은 보통 정수 픽셀 단위로 한다. 하지만 실제 대응점은 정수 위치에 딱 맞게 떨어지지 않는 경우가 많다. 실제 시차가 12.3 픽셀인데 12나 13만 선택하면 오차가 생긴다.
특히 깊이는 $Z = \frac{fB}{d}$처럼 시차의 역수에 비례하므로, 시차가 조금만 틀려도 깊이 오차가 커질 수 있다. 그래서 최적 시차 주변의 비용 곡선을 보고 포물선 보간 같은 방법으로 소수점 단위 시차를 추정한다. 먼 거리 물체는 시차가 작기 때문에 서브픽셀 정밀도가 특히 중요하다.
중간값 필터링 (Median Filtering)
중간값 필터는 주변 픽셀 값들의 중앙값으로 현재 픽셀을 바꾸는 방법이다. 점 형태의 이상치나 작은 노이즈를 제거하는 데 매우 효과적이다. 어떤 영역이 대부분 10~11 픽셀 시차인데 중간에 50 같은 이상치가 튀면, median filter는 이를 쉽게 제거한다. 평균 필터보다 경계를 덜 흐리게 만드는 장점도 있다.
홀 채우기와 엣지 보존 후처리
좌우 일관성 검사 후 invalid가 된 영역이나 가려짐 영역은 빈칸처럼 남는다. 이 경우 주변 신뢰도 높은 시차를 이용해 보간한다. 가이드 필터나 엣지 보존 스무딩을 통해 disparity map을 다듬을 수 있다. 단순히 부드럽게 만드는 것이 아니라, 영상의 경계와 깊이 경계를 최대한 일치시키는 것이 핵심이다.
시차(Disparity)와 깊이(Depth)의 관계
시차란
보정된 스테레오 영상에서 같은 3차원 점이 왼쪽 이미지와 오른쪽 이미지에 맺히는 $x$ 좌표 차이를 시차(disparity)라고 한다.
\[d = x_L - x_R\]가까운 물체는 좌우 영상에서 위치 차이가 크게 나타나고, 먼 물체는 차이가 작게 나타난다.
왜 깊이와 반비례하는가
스테레오 카메라의 기하를 풀면 깊이 $Z$는 다음처럼 표현된다.
\[Z = \frac{f \cdot B}{d}\]- $f$: 초점거리
- $B$: 베이스라인 (두 카메라 사이 거리)
- $d$: 시차
이 식이 말하는 핵심은 다음과 같다.
- 시차가 크면 물체는 가깝다 — 가까운 물체일수록 좌우 시점 차이에 민감하므로 영상에서 위치 차이가 크게 난다
- 시차가 작으면 물체는 멀다 — 멀리 있는 물체는 두 카메라에서 봐도 거의 같은 위치에 보인다
실전적 의미
베이스라인이 크면 깊이 분해능이 좋아질 수 있다. 카메라 간 거리가 멀수록 같은 깊이에서도 시차가 더 크게 나타나므로 구분이 쉬워진다. 하지만 너무 멀면 가려짐이 심해지고 대응점 찾기가 더 어려워진다.
초점거리가 길수록 시차 변화가 더 민감하게 나타난다. 더 정밀한 깊이 추정이 가능하지만 시야각은 좁아진다.
먼 물체일수록 깊이 추정이 어렵다. 깊이가 멀어질수록 시차가 매우 작아지고, 시차 0.1 픽셀 오차도 깊이에서는 큰 오차로 확대될 수 있다. 스테레오 비전은 근중거리에서는 강력하지만, 매우 먼 거리에서는 정확도가 급격히 떨어진다.
전제 조건과 가정
스테레오 매칭이 잘 되기 위해서는 몇 가지 암묵적 가정이 있다.
밝기 일관성 가정 — 같은 3차원 점은 두 영상에서 비슷한 밝기 또는 비슷한 로컬 패턴을 가진다고 가정한다. 그림자, 반사, 노출 차이로 쉽게 깨질 수 있다.
공간적 연속성 가정 — 이웃 픽셀들은 대체로 비슷한 깊이를 가진다고 가정한다. 경계나 얇은 구조물에서는 성립하지 않을 수 있다.
가시성 가정 — 한쪽에서 보이는 점이 다른 쪽에서도 보인다고 가정한다. 실제로는 occlusion이 자주 발생한다.
스테레오 매칭은 완전히 일반적인 문제를 푸는 것이 아니라, 현실 세계에서 꽤 자주 성립하는 구조적 가정들을 활용해 문제를 풀고 있는 것이다.
실무 관점에서의 핵심 포인트
텍스처가 중요하다. 무늬가 풍부한 곳은 잘 맞고, 하얀 벽이나 도로처럼 균일한 곳은 어렵다.
보정 품질이 매우 중요하다. 캘리브레이션이 조금만 틀려도 이후 단계 전체가 흔들린다.
경계와 가려짐이 가장 어렵다. 깊이가 갑자기 바뀌는 곳은 거의 항상 문제를 일으킨다.
시차 오차는 깊이 오차로 비선형 증폭된다. 특히 먼 거리에서 이 현상이 심하다.
정리
스테레오 매칭의 전체 파이프라인을 한 단계씩 정리하면 다음과 같다.
- 이미지 보정 — 탐색 공간을 줄이기 위한 기하 정렬 단계
- 비용 계산 — 각 시차 후보가 얼마나 그럴듯한지 점수화하는 단계
- 비용 집계 — 주변 문맥을 이용해 불안정한 점수를 보강하는 단계
- 시차 최적화 — 데이터 적합도와 공간적 일관성을 함께 고려해 최종 시차를 고르는 단계
- 시차 보정 — occlusion, 노이즈, 정수 해상도 한계를 처리해 결과를 다듬는 단계
- 깊이 변환 — 시차를 실제 3차원 거리로 바꾸는 기하학적 해석 단계
스테레오 매칭은 단순한 픽셀 비교가 아니라, 기하 정렬 → 후보 평가 → 주변 문맥 반영 → 전역적 일관성 확보 → 오류 제거와 정밀화를 순차적으로 수행하는 복합적인 최적화 문제다.