Homography
호모그래피는 뷰 간 평면을 매핑하는 사영 변환으로, 원근 보정, 이미지 정합, 파노라마 스티칭을 가능하게 합니다.
호모그래피는 한 평면의 점을 다른 평면의 점으로 매핑하면서 직선을 보존하는 가역 사영 변환입니다. 컴퓨터 비전에서 호모그래피는 평평한 표면이 서로 다른 시점에서 어떻게 보이는지를 설명합니다. 예를 들어 비스듬한 각도에서 촬영한 직사각형 페이지를 정면에서 본 직사각형으로 변환할 수 있습니다. 호모그래피는 이미지 정합, 원근 보정, 파노라마 스티칭에 사용됩니다. "사영 변환"은 동의어이며, 언어학 용어인 "동형어"는 철자가 같은 단어를 가리킵니다.
호모그래피 행렬의 작동 원리#
호모그래피는 일반적으로 H라고 부르는 3 x 3 행렬로 표현됩니다. 이 행렬은 2차원 점을 세 개의 값으로 나타내는 동차 좌표에 적용됩니다. 행렬 곱셈 후 출력값의 첫 두 값을 세 번째 값으로 나누면 일반적인 이미지 좌표를 얻을 수 있습니다.
H에는 아홉 개의 항목이 있지만, 자유도는 여덟 개입니다. 모든 항목에 동일한 0이 아닌 수를 곱해도 매핑은 변하지 않습니다. 이러한 평면 이미지 매핑의 기하학을 바탕으로 적절한 점 대응 네 쌍이 호모그래피를 결정하는 이유를 알 수 있습니다.
아핀 변환은 평행선을 보존하는 제한된 호모그래피입니다. 일반 호모그래피는 소실점을 향해 수렴하는 평행한 가장자리 등 원근 효과도 나타냅니다. 거리와 각도는 일반적으로 달라집니다. 미셸 샤슬은 1837년 쌍대성과 호모그래피에 관한 회고록에서 이 개념을 발전시켰습니다.
호모그래피 추정 방법#
추정은 두 이미지에서 동일한 물리적 특징을 나타내는 위치인 대응점에서 시작합니다. 대응점은 직접 선택한 모서리일 수도 있고, 특징점 매칭을 통해 찾을 수도 있습니다. 특징 추출로 얻은 특징점을 활용할 수 있습니다. Scale-Invariant Feature Transform과 같은 방법은 뷰 간 특징을 매칭하기 위해 국소 외관을 수치로 요약한 디스크립터를 제공합니다.
최소 네 쌍의 점이 필요하며, 어느 집합에서도 세 점이 한 직선 위에 놓여서는 안 됩니다. 직접 선형 변환(DLT) 알고리즘은 점의 좌표 관계를 선형 시스템으로 변환합니다. 측정값에 노이즈가 있을 경우 대응점을 추가하면 추정 결과가 개선됩니다.
잘못된 매칭에는 강건한 피팅이 필요합니다. 무작위 표본 합의(RANSAC)는 작은 부분 집합에 후보 변환을 반복적으로 피팅하고, 후보 변환과 일치하는 매칭인 인라이어를 식별합니다. 재투영 오차는 변환된 원본 점과 관측된 목적지 점 사이의 거리를 측정합니다. OpenCV의 호모그래피 추정 API는 cv2.findHomography을 통해 이 과정을 수행하며, H와 인라이어 마스크를 모두 반환합니다.
Python에서 호모그래피 적용하기#
OpenCV는 행렬 추정과 이미지 워핑에 별도의 연산을 제공합니다. pip install opencv-python numpy로 종속 항목을 설치합니다. 다음 예제에서는 샘플 이미지의 직사각형 경계를 사다리꼴로 매핑합니다.
from urllib.request import urlopen
import cv2
import numpy as np
image_url = "https://ultralytics.com/images/bus.jpg"
with urlopen(image_url) as response:
encoded = np.frombuffer(response.read(), dtype=np.uint8)
image = cv2.imdecode(encoded, cv2.IMREAD_COLOR)
height, width = image.shape[:2]
# 두 배열에서 동일한 시계 방향 모서리 순서를 유지합니다.
source = np.float32([[0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1]])
target = np.float32([[120, 80], [width - 121, 80], [width - 1, height - 1], [0, height - 1]])
matrix, _ = cv2.findHomography(source, target)
warped = cv2.warpPerspective(image, matrix, (width, height))
cv2.imwrite("homography_result.jpg", warped)저장된 이미지에는 원근 단축 효과가 나타납니다. 위쪽 가장자리는 더 좁아지고 장면의 직선 가장자리는 직선으로 유지됩니다.
호모그래피의 활용 분야#
- 문서 처리: 원근 보정을 통해 평면 문서의 네 모서리를 직사각형에 매핑합니다. 이 전처리 단계는 광학 문자 인식 전에 텍스트 레이아웃을 정규화하며, OpenCV의 원근 보정 예제에서 보여 주는 것과 동일한 평면 워프 기하학을 따릅니다.
- 파노라마 스티칭: 겹치는 사진을 정렬한 뒤 블렌딩합니다. 매튜 브라운과 데이비드 로우의 Autostitch 시스템은 매칭된 국소 특징을 사용해 파노라마 제작을 자동화하며, 순서가 정해지지 않은 컬렉션에서 겹치는 이미지를 식별하는 기능도 포함합니다.
Ultralytics YOLO의 RandomPerspective 증강은 학습 중에 사영 워프를 적용하여 이미지와 이에 연결된 바운딩 박스, 세그멘테이션 윤곽선, 특징점을 함께 변환합니다. perspective 설정은 이 데이터 증강의 원근 구성 요소를 제어합니다.
기하학적 한계와 관련 개념#
단일 호모그래피는 하나의 평면을 촬영한 이상적인 핀홀 카메라 뷰 간의 관계를 정확히 나타내거나, 투영 중심을 기준으로 카메라를 회전해 촬영한 뷰 간의 관계를 정확히 나타냅니다. 카메라가 이동하고 물체가 서로 다른 깊이에 있으면 시차로 인해 깊이에 따라 변위가 달라집니다. 배경 평면을 정렬하면 전경 물체는 변위된 상태로 남아 스티칭 이미지에서 가장자리가 이중으로 보이거나 고스트 현상이 발생합니다.
카메라 보정은 렌즈 왜곡을 다룹니다. 렌즈 왜곡으로 발생하는 이미지의 곡선 기하학은 평면 정렬 전에 보정해야 합니다. 일반적인 3차원 장면에서 에피폴라 기하학은 대응점을 직선 위의 위치로 제한하지만, 호모그래피는 점의 위치를 직접 예측합니다. 스테레오 비전에서는 에피폴라 직선을 따라 남은 위치가 시차 정보를 제공하며, 이를 깊이 추정에 사용합니다.










