호모그래피

편집 역사 토론
컴퓨터 그래픽스 수치해석 마지막 수정: 2026-08-29 04:14:27

1. 개요[편집]

두 사진을 겹쳤는데 가운데는 딱 맞고 가장자리가 유령처럼 두 겹으로 보인다면, 당신은 방금 호모그래피의 가정을 위반한 것이다.

호모그래피(homography, 사영변환·projective transformation)는 동차좌표로 표현한 평면의 점을 3×3 정칙행렬 하나로 옮기는 사상이다. 점 x=(x,y,1)T\mathbf{x}=(x,y,1)^{\mathsf T}

x~  =  Hx,H=(h11h12h13h21h22h23h31h32h33),x=h11x+h12y+h13h31x+h32y+h33\tilde{\mathbf{x}}' \;=\; H\,\mathbf{x}, \qquad H=\begin{pmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33}\end{pmatrix}, \qquad x'=\frac{h_{11}x+h_{12}y+h_{13}}{h_{31}x+h_{32}y+h_{33}}

로 보내고, 마지막에 세 번째 성분으로 나누는 것(동차 나눗셈)이 전부다. 이 나눗셈이 원근감을 만든다 — 아핀변환에는 없는 h31,h32h_{31},h_{32} 가 바로 「멀어질수록 작아지는」 성분이다.

핵심 성질 두 가지만 외우면 된다. 첫째, HHλH\lambda H (λ0\lambda \neq 0)는 완전히 같은 변환이다. 동차좌표는 스케일을 무시하므로 원소는 9개여도 자유도는 8이다.1 둘째, 호모그래피는 직선을 직선으로 보낸다. 다만 평행선은 평행하게 보내지 않는다 — 철길이 지평선의 한 점에서 만나는 그 사진이 호모그래피다.

2. 변환의 계층 — 무엇을 지키고 무엇을 버리는가[편집]

2D 변환은 자유도가 늘어날수록 지키는 성질을 하나씩 버리는 사다리를 이룬다.

변환행렬 형태자유도보존되는 것
유클리드회전 + 평행이동3길이, 각도, 넓이
상사(similarity)위에 균등 스케일4각도, 길이의 비
아핀마지막 행이 (0,0,1)(0,0,1)6평행성, 넓이의 비, 무한원선
사영(호모그래피)제약 없음8공선성, 결합 관계, 교차비

맨 아래 칸의 교차비(cross-ratio)는 한 직선 위 네 점 A,B,C,DA,B,C,D 로 만드는 ACBDBCAD\frac{\overline{AC}\cdot\overline{BD}}{\overline{BC}\cdot\overline{AD}} 로, 어떤 사영변환에도 값이 변하지 않는 사영기하의 마지막 보루다. 사진 한 장만으로 건물 높이를 재는 고전적인 단일영상 계측이 이 불변량 위에 서 있다.

아핀변환이 호모그래피의 특수한 경우라는 사실도 계층에서 바로 읽힌다. h31=h32=0h_{31}=h_{32}=0 이면 분모가 상수 h33h_{33} 이 되어 나눗셈이 사라지고, 원근이 없는 평행투영이 된다.

3. 언제 두 영상이 호모그래피로 엮이는가 — 조건은 딱 둘[편집]

이게 이 문서에서 가장 중요한 대목이다. 두 카메라가 찍은 영상이 전역적으로 하나의 HH 로 정확히 대응되는 경우는 원리적으로 두 가지뿐이다.

(1) 장면이 평면일 때. 3D 점이 평면 nTX=d\mathbf{n}^{\mathsf T}\mathbf{X}=d 위에 있고 두 카메라가 (K,I,0)(K,\,I,\,\mathbf 0)(K,R,t)(K',\,R,\,\mathbf t) 라면, X\mathbf{X} 를 소거해서

H  =  K(RtnTd)K1H \;=\; K'\Bigl(R - \frac{\mathbf t\,\mathbf n^{\mathsf T}}{d}\Bigr)K^{-1}

가 나온다. 카메라가 아무리 움직여도 점들이 한 평면 위에만 있으면 대응은 호모그래피다. 체스보드, 건물 벽면, 바닥, 서류 한 장, AR 마커가 여기 해당한다.

(2) 카메라가 순수 회전만 할 때. t=0\mathbf t=\mathbf 0 이면 위 식에서 평면 항이 통째로 사라져

H  =  KRK1H \;=\; K' R K^{-1}

이 되고, 장면의 깊이가 어떻든 상관없이 대응이 호모그래피다. 삼각대 위에서 카메라를 광학중심 둘레로 돌리며 찍는 파노라마가 정확히 이 경우다.

그리고 이 둘을 벗어나면 — 즉 카메라가 이동하면서 장면에 깊이 차이가 있으면 — 어떤 HH 도 두 영상을 맞출 수 없다. 원인은 시차(parallax)다. 기준 평면에 대한 잔차를 쓰면 대응은

x~  =  Hx  +  ρe\tilde{\mathbf{x}}' \;=\; H\mathbf{x} \;+\; \rho\,\mathbf{e}'

형태가 되는데(e\mathbf{e}' 는 에피폴, ρ\rho 는 평면으로부터의 깊이와 기선 길이에 비례하는 시차량), 이 「평면 + 시차」 분해가 호모그래피가 못 하는 일을 정확히 짚어 준다. 남는 항 ρe\rho\,\mathbf{e}' 는 점마다 다르므로 전역 HH 로 흡수될 수가 없다. 이 잔차를 제대로 다루려면 에피폴라 기하로 넘어가야 한다.

파노라마 스티칭 실무의 고생은 전부 여기서 나온다. 손에 들고 찍으면 카메라는 반드시 몇 센티미터씩 이동하고, 가까운 물체와 먼 배경의 시차가 이음매에서 유령(ghosting)으로 나타난다. 처방은 셋 중 하나다 — 광학중심(이른바 노달 포인트)을 축으로 돌리는 파노라마 헤드를 쓰거나2, 이음매를 시차가 작은 곳으로 우회시키는 심(seam) 탐색과 다중대역 블렌딩을 쓰거나, 아예 전역 HH 를 포기하고 국소적으로 다른 호모그래피를 이어 붙이는 국소 워핑을 쓰거나. 세 번째가 이미지 스티칭 최신 기법의 방향이다.

4. DLT — 4점이면 충분한 이유[편집]

대응점 쌍 (xi,xi)(\mathbf{x}_i,\mathbf{x}'_i)HH 를 푸는 표준 방법이 직접선형변환(Direct Linear Transform, DLT)이다. 동차 나눗셈 때문에 xi=Hxi\mathbf{x}'_i = H\mathbf{x}_i 를 그대로 쓰면 비선형이지만, 「방향이 같다」는 조건을 외적으로 쓰면 선형이 된다.

xi×(Hxi)=0\mathbf{x}'_i \times (H\mathbf{x}_i) = \mathbf{0}

이 외적은 성분 3개지만 그중 독립인 것은 2개다(세 성분의 합이 항상 종속). 즉 대응점 하나가 방정식 2개를 준다. 미지수는 HH 를 펼친 9차원 벡터 h\mathbf h 이고 자유도는 8이므로, 점 4개 → 방정식 8개면 스케일을 뺀 해가 유일하게 정해진다. RANSAC에서 호모그래피의 최소표본이 4인 것도 이 계산이다.

방정식을 쌓으면 Ah=0A\mathbf h=\mathbf 0 꼴의 동차 연립계가 되고, 잡음이 있으면 정확한 영공간이 없으므로 h=1\lVert \mathbf h\rVert=1 제약 아래 Ah\lVert A\mathbf h\rVert 를 최소화한다. 답은 특이값 분해에서 가장 작은 특이값에 대응하는 우특이벡터다. 4점보다 많으면 그대로 과결정계가 되어 최소자승법적 해가 나온다.

축퇴 조건은 하나다 — 4점 중 어느 3점도 공선이면 안 된다. 세 점이 한 직선 위에 있으면 그 직선 전체가 자유롭게 미끄러질 수 있어 HH 가 결정되지 않는다. 거의 공선인 경우도 위험해서, RANSAC 안에서는 표본을 뽑자마자 네 점이 이루는 사각형의 넓이나 조건수를 보고 버리는 것이 정석이다.

4.1. 정규화 — 빼먹으면 조용히 틀린다[편집]

DLT에서 한나 정규화(Hartley normalization)는 선택 사항이 아니라 필수다. 이유는 순전히 조건수 때문이다. AA 의 한 행을 펼쳐 보면 xxx x', xyx y', xx, \dots, 11 같은 항이 섞여 있는데, 픽셀좌표가 수백 단위라면 곱 항은 10510^5 대이고 상수 항은 1이다. 원소 크기가 다섯 자릿수 차이 나는 행렬의 특이값 분해는 작은 특이값 쪽이 반올림 오차에 그대로 잠식된다.

처방은 각 영상에서 좌표를 상사변환 T,TT,T' 로 옮기는 것이다.

  1. 점들의 중심을 원점으로 평행이동한다.
  2. 원점까지 거리의 RMS가 2\sqrt2 가 되도록 균등 스케일한다(평균적으로 (±1,±1)(\pm1,\pm1) 근처에 오게).

정규화 좌표로 H^\hat H 를 푼 뒤 H=T1H^TH = T'^{-1}\hat H\,T 로 되돌리면 끝이다. 코드 다섯 줄인데 조건수가 10810^8 대에서 1010 대로 떨어진다. 한나가 에피폴라 기하의 8점 알고리즘에 대해 「이 알고리즘은 나쁜 게 아니라 정규화를 안 한 게 나빴다」고 논문 한 편을 쓴 그 정규화와 같은 것이다.3

네 점 대응에서 DLT 로 3×3 호모그래피를 풀어 평면을 실시간으로 워프한다(목적 버퍼 200×140 에서 H⁻¹ 로 소스를 찾는 역사상 + 쌍선형). 4점은 최소해라 재투영 오차가 반올림 수준이고, 갈리는 것은 선형계 쪽이다 — 같은 대응에서 AᵀA 조건수가 정규화 OFF 4.6e11, ON 18.0 이다. 좌표 원점을 10⁵ px 밀면 정규화 없는 해는 화면에서 형체가 무너지고, 정규화한 해는 전달오차 1.8e−10 px 를 지킨다.

DLT는 대수적 오차(Ah\lVert A\mathbf h\rVert)를 최소화하는 것이지 우리가 원하는 픽셀 단위 기하오차를 최소화하는 게 아니다. 정밀도가 필요하면 DLT 해를 초기값으로 삼아, 양방향 전이오차

ixiHxi2+xiH1xi2\sum_i \bigl\lVert \mathbf{x}'_i - H\mathbf{x}_i \bigr\rVert^2 + \bigl\lVert \mathbf{x}_i - H^{-1}\mathbf{x}'_i \bigr\rVert^2

이나 재투영오차를 레벤버그-마쿼트 방법으로 줄이는 비선형 정련을 붙인다. 실제 대응에는 오대응이 섞이기 마련이므로 그 앞단에는 거의 항상 RANSAC이 붙는다.

5. 워핑 — 왜 역행렬로 도는가[편집]

HH 를 구했으면 영상을 실제로 변형해야 한다. 여기서 초보가 반드시 한 번은 밟는 지뢰가 순방향 사상(forward mapping)이다. 원본 화소마다 HH 를 곱해 목적지에 찍으면, 확대되는 영역에는 구멍이 뚫리고 축소되는 영역에는 여러 화소가 겹쳐 쌓인다. 목적지 좌표가 정수로 떨어지지도 않는다.

정답은 역방향 사상(backward mapping)이다. 목적지 화소 u\mathbf u 를 하나씩 돌면서 x=H1u\mathbf{x}=H^{-1}\mathbf u 로 원본 좌표를 역으로 찾고, 그 실수 좌표에서 보간해 값을 가져온다. 구멍도 겹침도 원리적으로 생기지 않는다. 보간은 최근접(빠르지만 계단), 쌍선형 보간(국룰), 바이큐빅(선명하지만 링잉) 순으로 고르면 된다.

주의할 점 둘. 첫째, 원근 워핑에서는 화면 한쪽이 심하게 축소될 수 있는데 이때 단순 쌍선형은 표본화 정리를 위반해 에일리어싱을 만든다. 축소가 크면 밉맵이나 이방성 필터링이 필요하다. 둘째, h31x+h32y+h33h_{31}x+h_{32}y+h_{33} 이 0이 되는 직선이 존재한다 — 이것이 소실선이고, 그 너머는 카메라 뒤로 넘어간 영역이라 렌더링에서 잘라내야 한다. 안 자르면 하늘이 발밑에 뒤집혀 그려지는 명작이 나온다.

6. 분해 — H에서 R, t, n 꺼내기[편집]

카메라 내부행렬 K,KK,K' 를 알고 있으면(즉 카메라 보정이 되어 있으면) 정규화 호모그래피 H^=K1HK\hat H = K'^{-1}HK

H^    RtnTd\hat H \;\propto\; R - \frac{\mathbf t\,\mathbf n^{\mathsf T}}{d}

이므로 여기서 회전 RR, 평행이동 방향 t\mathbf t, 평면 법선 n\mathbf n 을 되뽑을 수 있다. 파우제라와 뤼스트만이 1988년에 해석적 해법을 냈고, 이후 특이값 분해 기반의 정리된 형태가 표준이 되었다.

실무적으로 알아야 할 것은 결과의 다중성이다. 분해는 일반적으로 네 개의 해를 내놓고, 그중 「관측한 점들이 두 카메라 앞에 있어야 한다」는 가시성(cheirality) 조건으로 대개 둘까지 줄어든다. 남은 모호성은 평면 법선이 카메라를 향해야 한다든가 하는 추가 정보로 없앤다. OpenCV의 decomposeHomographyMat 이 해를 4개 배열로 돌려주는 것이 바로 이 사정이다.

그리고 t\mathbf tdd 로 나눠진 채로만 복원된다. 평면까지의 거리를 모르면 이동량의 절대 스케일도 모른다 — 사진만으로는 「작은 방을 가까이서 찍은 것」과 「큰 방을 멀리서 찍은 것」을 구별할 수 없다는, 단안 시각의 근본적인 스케일 모호성이 여기서도 그대로 나타난다.

7. 어디에 쓰이나[편집]

  • 파노라마 스티칭. 순수 회전 가정 아래 영상쌍마다 HH 를 추정하고, 전역적으로 회전만 남기는 번들 정련을 거쳐 구·원통면에 투영한다. 초점거리를 알면 8자유도 대신 3자유도 회전만 추정하면 되어 훨씬 안정적이다.
  • 카메라 보정. 장(Z. Zhang, 2000)의 평면 체스보드 보정법이 대표적이다. 평면 패턴을 여러 자세로 찍으면 자세마다 호모그래피가 하나 나오고, H=K[r1 r2 t]H = K[\mathbf r_1\ \mathbf r_2\ \mathbf t] 에서 r1,r2\mathbf r_1,\mathbf r_2 가 정규직교라는 두 제약이 나온다. 호모그래피 몇 장을 모으면 KK 가 풀린다.
  • 원근 보정. 비스듬히 찍은 문서·화이트보드를 네 모서리만 찍어 정면 뷰로 펴는 그 기능. 스캐너 앱의 심장부이자 호모그래피의 가장 대중적인 용도다.4
  • 증강현실 마커. 마커는 평면이므로 마커-영상 대응이 정확히 호모그래피이고, 분해로 얻은 R,tR,\mathbf t 가 그대로 가상 물체의 자세가 된다.
  • 평면 기반 시각 항법. 지면을 평면으로 보고 프레임 간 호모그래피를 추적하면 이동량을 추정할 수 있다. 지면이 평평하다는 가정이 깨지는 순간(과속방지턱) 결과도 같이 깨진다는 점이 인상적이다.

8. 함정 모음[편집]

  1. 평면 가정을 확인 없이 믿지 않는다. 재투영 잔차의 분포를 보라. 내점 비율이 어중간하고 잔차가 영상 한쪽으로 몰려 있으면 시차가 있는 것이다. 이럴 땐 HH 대신 기초행렬 모형을 써야 하고, 둘 중 뭘 쓸지 자동으로 고르는 모형선택 기준(GRIC 계열)이 따로 있다.
  2. 정규화를 생략하지 않는다. 위에서 말한 그대로다. 결과가 「대충 맞는데 미묘하게 틀린」 상태로 나오기 때문에 발견이 늦다.
  3. HHh33=1h_{33}=1 로 고정하지 않는다. 흔한 편법이지만 h33=0h_{33}=0 인 정당한 호모그래피(무한원점을 원점으로 보내는 경우)를 표현할 수 없어 특정 배치에서 폭발한다. h=1\lVert\mathbf h\rVert=1 로 잡는 게 안전하다.
  4. 렌즈 왜곡을 먼저 없앤다. 호모그래피는 직선을 직선으로 보내는 사상이라 배럴 왜곡이 남아 있으면 원리적으로 맞출 수 없다. 렌즈 왜곡 보정이 항상 앞에 온다.
  5. 누적 HH 를 곱해 나가지 않는다. 프레임 간 호모그래피를 계속 곱하면 오차가 기하급수적으로 누적되어 영상이 서서히 찌그러진다. 주기적으로 기준 프레임과 직접 정합하거나 전역 번들 정련을 걸어야 한다.

9. 관련 문서[편집]

10. Footnotes[편집]

  1. 「9개 원소인데 왜 8자유도냐」는 질문은 동차좌표를 처음 만나면 누구나 한다. 답은 「HH 를 2배 해도 결과가 같으니 배율 하나만큼은 정보가 아니다」인데, 이 사실을 잊고 h\lVert\mathbf h\rVert 제약 없이 Ah=0A\mathbf h=\mathbf 0 을 풀면 최적화기가 아주 성실하게 h=0\mathbf h=\mathbf 0 이라는 완벽한 해를 찾아 준다. 잔차 0짜리 무의미한 해에 감동하지 말자.

  2. 파노라마용 「노달 포인트」라는 말은 사실 광학 용어로는 부정확하다. 시차가 사라지는 회전축은 절점(nodal point)이 아니라 입사동(entrance pupil)이고, 사진 커뮤니티에서 굳어진 관용어가 그대로 남은 것이다. 다만 삼각대 앞에서 「입사동 맞춰라」라고 말하면 대화가 30초쯤 길어지므로 대개 그냥 노달 포인트라고 부른다.

  3. Hartley, R. (1997). “In Defense of the Eight-Point Algorithm.” IEEE TPAMI 19(6). 제목이 이미 사연을 다 말한다. 당시 8점 알고리즘은 「잡음에 취약해서 쓸 수 없다」는 게 정설이었는데, 알고 보니 취약했던 건 알고리즘이 아니라 정규화를 건너뛴 사람들의 습관이었다. 좌표를 옮기고 스케일만 맞췄더니 갑자기 쓸 만해진 이 사건은, 수치해석 수업에서 조건수 이야기를 왜 그렇게 지겹게 하는지에 대한 가장 좋은 반례집이다.

  4. 스캐너 앱이 문서 네 모서리를 잡아 A4 비율로 펴 주는 기능은 호모그래피 4점 DLT + 역방향 워핑, 딱 그것이다. 원리를 알고 나면 감동이 절반쯤 줄어들지만, 대신 「왜 구겨진 종이는 못 펴는가」에 즉답할 수 있게 된다 — 구겨진 종이는 평면이 아니기 때문이다.