Computer Vision Theory : 기하 변환과 이미지 정합
기하 변환(Geometric Transformation)
전처리 알고리즘에서 이미지를 회전하거나 확대하는 변환을 간단히 다루었습니다. 이러한 변환은 픽셀의 값을 바꾸는 필터링과 달리, 픽셀의 위치를 바꿉니다. 이처럼 이미지의 좌표를 다른 좌표로 옮기는 연산을 기하 변환(Geometric Transformation)이라 합니다.
기하 변환이 필요한 상황은 매우 많습니다. 비스듬히 찍은 문서 사진을 정면에서 찍은 것처럼 펴거나, 기울어진 번호판을 수평으로 맞추거나, 여러 장의 사진을 이어 붙여 파노라마를 만드는 일은 모두 기하 변환입니다. 의료 영상에서는 같은 환자를 다른 날 촬영한 두 영상을 같은 좌표계로 맞춰야 병변의 변화를 비교할 수 있습니다.
이처럼 서로 다른 시점, 시간, 장비로 얻은 이미지들을 하나의 좌표계로 맞추는 작업을 이미지 정합(Image Registration)이라 합니다. 이미지 정합은 두 이미지 사이의 기하 변환을 찾아내는 문제이며, 이 강좌에서는 먼저 변환의 종류를 정리한 뒤, 두 이미지에서 그 변환을 추정하는 방법을 차례대로 다룹니다.
동차 좌표(Homogeneous Coordinates)
기하 변환은 행렬로 표현합니다. 2차원 점 \((x, y)\)를 원점 기준으로 \(\theta\)만큼 회전하는 것은 \(2 \times 2\) 행렬을 곱하는 것으로 쓸 수 있습니다. 점 \((1, 0)\)을 30도 회전하면 \((\cos 30^{\circ}, \sin 30^{\circ}) \approx (0.866, 0.5)\)가 됩니다.
그런데 이동(Translation)은 행렬 곱으로 쓸 수 없습니다. 모든 점에 같은 값을 더하는 연산이기 때문입니다. 회전과 이동을 함께 하려면 “곱한 뒤 더한다”는 두 단계가 필요하고, 변환을 여러 번 이어 붙일 때마다 식이 복잡해집니다.
이 문제를 해결하기 위해 좌표에 1을 하나 덧붙여 \((x, y, 1)\)로 나타내는 동차 좌표(Homogeneous Coordinates)를 사용합니다. 그러면 이동을 포함한 모든 변환이 \(3 \times 3\) 행렬 하나의 곱으로 표현됩니다.
왼쪽 위의 \(2 \times 2\) 부분이 회전, 크기, 기울임을 담당하고, 오른쪽 열의 \(t_{x}, t_{y}\)가 이동을 담당합니다. 변환을 여러 번 적용하는 것은 행렬을 차례로 곱하는 것과 같으므로, 회전한 뒤 이동하고 다시 확대하는 복잡한 변환도 행렬 하나로 합쳐 한 번에 적용할 수 있습니다.
변환의 종류
기하 변환은 무엇을 보존하는지에 따라 단계적으로 나뉩니다. 보존하는 성질이 적을수록 더 다양한 변형을 표현할 수 있지만, 정하는 데 필요한 값도 늘어납니다. 변환을 정하는 독립적인 값의 개수를 자유도(Degree of Freedom)라 합니다.
유클리드 변환(Euclidean Transformation): 회전과 이동만 합니다. 물체를 들어서 옮기는 것처럼 길이와 각도가 모두 보존됩니다. 회전 각도 하나와 이동 두 값으로 자유도는 3입니다.닮음 변환(Similarity Transformation): 여기에 크기 변화를 더합니다. 길이는 바뀌지만 각도와 모양은 보존되며, 자유도는 4입니다.아핀 변환(Affine Transformation): 위의 행렬에서 \(a, b, c, d\)를 자유롭게 정할 수 있습니다. 직사각형이 평행사변형이 되는 기울임(Shear)이 가능해지며, 각도와 길이는 바뀌지만 평행한 선은 계속 평행합니다. 자유도는 6이며, 대응하는 점 3쌍으로 결정됩니다.원근 변환(Perspective Transformation): 행렬의 마지막 행까지 자유롭게 정합니다. 평행선이 한 점으로 모일 수 있어, 비스듬히 본 직사각형이 사다리꼴이 되는 원근 효과를 표현합니다. 직선은 직선으로 유지되지만 평행성은 보존되지 않습니다. 자유도는 8이며, 대응하는 점 4쌍으로 결정됩니다.
원근 변환을 나타내는 \(3 \times 3\) 행렬을 호모그래피(Homography)라 합니다. 행렬의 원소는 9개이지만, 행렬 전체에 같은 수를 곱해도 같은 변환이 되므로 독립적인 값은 8개입니다. 호모그래피를 적용한 결과는 세 번째 성분이 1이 아니게 되므로, 앞의 두 성분을 세 번째 성분으로 나누어 실제 좌표를 얻습니다. 이 나눗셈이 멀리 있는 부분을 작게 만드는 원근 효과를 만들어 냅니다.
- Tip : OpenCV에서는 대응점 3쌍으로 아핀 행렬을 구하는
getAffineTransform과 4쌍으로 호모그래피를 구하는getPerspectiveTransform을 제공하며, 구한 행렬은 각각warpAffine과warpPerspective로 이미지에 적용합니다.
호모그래피가 성립하는 경우
호모그래피는 어떤 두 이미지 사이에서나 성립하는 것은 아닙니다. 3차원 비전에서 다룬 것처럼 이미지는 3차원 공간을 평면에 투영한 결과이며, 카메라의 위치가 바뀌면 가까운 물체와 먼 물체가 서로 다른 양만큼 움직이는 시차가 생깁니다. 하나의 행렬로는 이러한 움직임을 표현할 수 없습니다.
호모그래피가 정확히 성립하는 경우는 두 가지입니다. 첫째, 촬영 대상이 하나의 평면일 때입니다. 책상 위의 문서, 벽에 걸린 그림, 건물의 정면처럼 평평한 대상은 어느 방향에서 찍든 두 이미지가 호모그래피로 연결됩니다. 둘째, 카메라가 제자리에서 회전만 할 때입니다. 카메라의 중심이 움직이지 않으면 시차가 생기지 않으므로, 장면에 깊이가 있어도 호모그래피가 성립합니다.
파노라마 촬영에서 “몸을 움직이지 말고 제자리에서 돌며 찍으라”고 안내하는 이유가 여기에 있습니다. 카메라가 옆으로 이동하면 가까운 물체에서 시차가 생겨, 이어 붙인 부분에서 물체가 두 번 보이거나 잘리는 현상이 나타납니다.
이미지 와핑(Image Warping)
변환 행렬을 구했다면 이미지 전체에 적용해야 합니다. 이를 이미지 와핑(Image Warping)이라 합니다. 가장 직관적인 방법은 원본의 픽셀마다 변환을 적용해 결과 이미지의 새 위치에 값을 옮기는 순방향 매핑(Forward Mapping)입니다.
그러나 순방향 매핑에는 문제가 있습니다. 변환된 좌표는 대부분 정수가 아니므로 가장 가까운 픽셀에 값을 넣어야 하는데, 이미지를 확대하면 값을 받지 못한 빈 픽셀이 구멍처럼 생기고, 축소하면 여러 값이 한 픽셀에 겹칩니다.
그래서 실제로는 반대 방향으로 계산하는 역방향 매핑(Inverse Mapping)을 사용합니다. 결과 이미지의 각 픽셀에서 출발해 역변환을 적용하고, 원본의 어느 위치에서 값을 가져올지 찾는 것입니다. 결과 이미지의 모든 픽셀이 반드시 한 번씩 계산되므로 구멍이 생기지 않습니다.
역변환으로 찾은 원본 위치도 대개 정수가 아니므로, 주변 픽셀의 값으로 그 위치의 값을 추정해야 합니다. 이것이 노이즈 제거 & 이미지 복원의 크기 변환에서 다룬 보간(Interpolation)입니다. 가장 가까운 픽셀을 그대로 쓰는 최근접 이웃 보간은 빠르지만 계단 현상이 생기고, 주변 네 픽셀을 거리에 따라 섞는 양선형 보간은 부드럽지만 약간 흐려집니다.
특징 기반 정합
이제 두 이미지가 주어졌을 때 그 사이의 변환을 어떻게 찾는지 살펴보겠습니다. 가장 널리 쓰이는 방법은 두 이미지에서 같은 지점을 찾아 짝지은 뒤, 그 짝들로부터 변환을 계산하는 특징 기반 정합(Feature-based Registration)입니다.
먼저 특징 검출에서 다룬 방법으로 각 이미지에서 모서리처럼 눈에 띄는 특징점(Keypoint)을 찾고, 각 특징점 주변의 모양을 특징 기술자(Feature Descriptor)라는 벡터로 요약합니다. SIFT나 ORB 같은 기술자는 회전이나 크기가 바뀌어도 같은 지점에서 비슷한 벡터가 나오도록 설계되어 있습니다.
다음으로 두 이미지의 기술자를 비교해 가장 비슷한 것끼리 짝을 짓습니다. 이를 특징 매칭(Feature Matching)이라 합니다. 이미지 A의 특징점 하나에 대해 이미지 B의 모든 특징점과 기술자 사이의 거리를 계산하고, 가장 가까운 것을 짝으로 고릅니다.
문제는 가장 가까운 짝이 항상 맞는 짝은 아니라는 점입니다. 창문이 여러 개 늘어선 건물처럼 비슷한 모양이 반복되는 장면에서는, 엉뚱한 창문의 모서리가 가장 가까운 짝으로 뽑히기 쉽습니다. SIFT를 제안한 로우(David Lowe)는 이를 걸러 내기 위해 가장 가까운 거리와 두 번째로 가까운 거리의 비율을 확인하는 비율 검사(Ratio Test)를 제안했습니다. 가장 가까운 짝이 두 번째보다 확실히 가깝다면 믿을 만한 짝이고, 비슷한 거리의 후보가 둘이라면 헷갈리는 짝이므로 버립니다. 로우는 비율이 0.8보다 크면 버리는 기준을 사용했습니다.
RANSAC
비율 검사를 거쳐도 틀린 짝은 남습니다. 문제는 틀린 짝이 단 몇 개만 섞여도 변환 추정이 크게 망가진다는 점입니다. 모든 짝에 대해 오차의 제곱합이 최소가 되는 변환을 구하면, 엉뚱한 위치로 연결된 짝 하나가 큰 오차를 만들어 결과 전체를 그쪽으로 끌어당깁니다. 이처럼 모델에 맞지 않는 잘못된 데이터를 이상치(Outlier), 맞는 데이터를 정상치(Inlier)라 합니다.
RANSAC(Random Sample Consensus)은 1981년 피슐러(Martin Fischler)와 볼스(Robert Bolles)가 제안한 방법으로, 이상치가 많이 섞인 데이터에서도 올바른 모델을 찾아냅니다. 아이디어는 소수의 짝만 뽑아 모델을 만들고, 그 모델에 동의하는 짝이 얼마나 많은지 세는 것입니다.
- 전체 짝 중에서 모델을 정하는 데 필요한 최소한의 개수만 무작위로 뽑습니다. 호모그래피라면 4쌍입니다.
- 뽑은 짝으로 변환을 계산합니다.
- 나머지 모든 짝에 이 변환을 적용해, 예측 위치와 실제 위치의 거리가 기준값 이내인 짝의 개수를 셉니다. 이 짝들이 이 모델의 정상치입니다.
- 1~3을 여러 번 반복하고, 정상치가 가장 많았던 모델을 고릅니다.
- 마지막으로 그 모델의 정상치 전체를 사용해 변환을 다시 정밀하게 계산합니다.
이 방법이 동작하는 이유는 간단합니다. 뽑은 4쌍에 이상치가 하나라도 섞이면 엉뚱한 변환이 나오고, 그 변환에 우연히 동의하는 짝은 거의 없습니다. 반면 4쌍이 모두 정상치라면 올바른 변환이 나오고, 다른 정상치들이 모두 그 변환에 동의합니다. 정상치들은 같은 변환에 일관되게 동의하지만, 이상치들은 제각각 다른 방향을 가리키므로 서로 힘을 모으지 못합니다.
필요한 반복 횟수는 확률로 계산할 수 있습니다. 정상치의 비율이 \(w\)이고 한 번에 \(s\)개를 뽑는다면, 한 번의 시도에서 모두 정상치를 뽑을 확률은 \(w^{s}\)입니다. 확률 \(p\) 이상으로 적어도 한 번 성공하려면 다음 횟수만큼 반복해야 합니다.
\[N = \frac{\log (1 - p)}{\log (1 - w^{s})}\]호모그래피(\(s = 4\))를 99%의 확률로 찾으려면, 정상치 비율이 80%일 때 9번, 70%일 때 17번, 50%일 때 72번이면 충분합니다. 짝의 절반이 틀렸더라도 72번의 시도로 올바른 변환을 거의 확실하게 찾을 수 있다는 뜻입니다. 반면 한 번에 뽑는 개수가 많아지면 필요한 횟수가 급격히 늘어납니다. 같은 50% 조건에서 8쌍이 필요한 모델이라면 1,177번이 필요합니다. RANSAC에서 모델을 최소한의 점으로 정하는 이유가 여기에 있습니다.
- Tip : OpenCV의
findHomography함수에cv2.RANSAC옵션을 주면 RANSAC으로 호모그래피를 추정하고, 어떤 짝이 정상치였는지 표시한 마스크도 함께 반환합니다. 정상치로 판정할 거리 기준은 보통 수 픽셀 정도로 정합니다.
파노라마 합성(Panorama Stitching)
지금까지의 내용을 모으면 여러 장의 사진을 이어 붙여 넓은 장면을 만드는 파노라마 합성(Panorama Stitching)을 할 수 있습니다.
- 특징 검출과 매칭 : 이웃한 사진 쌍마다 특징점을 찾고 기술자를 비교해 짝을 짓습니다.
- 변환 추정 : RANSAC으로 사진 쌍 사이의 호모그래피를 구합니다.
- 와핑 : 기준이 되는 사진 하나를 정하고, 나머지 사진을 호모그래피로 변환해 기준 사진의 좌표계로 옮깁니다.
- 블렌딩 : 겹치는 부분의 경계가 자연스럽게 이어지도록 두 사진을 섞습니다.
마지막 블렌딩 단계가 결과의 품질을 크게 좌우합니다. 사진마다 노출과 화이트 밸런스가 조금씩 다르므로, 겹치는 부분을 그냥 덮어쓰면 밝기가 달라지는 경계선이 뚜렷하게 보입니다. 경계에 가까울수록 두 사진의 비중을 서서히 바꾸며 섞는 방법이 가장 단순하지만, 정합이 조금만 어긋나도 물체가 겹쳐 보이는 잔상이 생깁니다. 그래서 이미지를 여러 주파수 대역으로 나누어 낮은 주파수(밝기의 큰 변화)는 넓게, 높은 주파수(세밀한 무늬)는 좁게 섞는 다중 대역 블렌딩(Multi-band Blending)이 널리 쓰입니다.
사진을 여러 장 이어 붙여 시야가 180도에 가까워지면, 평면 하나에 호모그래피로 투영하는 방식으로는 가장자리가 극단적으로 늘어납니다. 이 경우에는 사진을 원통이나 구의 표면에 투영한 뒤 펼치는 방식을 사용합니다. 스마트폰의 파노라마 기능은 이러한 과정을 촬영과 동시에 실시간으로 수행합니다.
정합의 다른 방법
특징 기반 정합은 두 이미지에 뚜렷한 특징점이 충분히 있을 때 잘 동작합니다. 흰 벽이나 하늘처럼 무늬가 없는 장면, 의료 영상처럼 경계가 흐릿한 영상에서는 특징점을 찾기 어렵습니다.
이런 경우에는 특징점 대신 픽셀 값 전체를 직접 비교하는 밝기 기반 정합(Intensity-based Registration)을 사용합니다. 변환을 조금씩 바꿔 가며 변환된 이미지와 기준 이미지의 픽셀 값 차이가 가장 작아지는 변환을 찾는 최적화 문제로 풉니다. 움직임 추적에서 다룬 광학 흐름도 이웃한 프레임 사이의 밝기 변화로 움직임을 추정한다는 점에서 같은 원리입니다. CT와 MRI처럼 촬영 방식이 달라 같은 조직의 밝기가 다른 영상끼리는, 밝기 차이 대신 두 영상의 밝기가 얼마나 함께 변하는지를 측정하는 상호 정보량(Mutual Information)을 기준으로 정합합니다.
딥러닝도 정합에 활용됩니다. 사람이 설계한 기술자 대신 신경망이 학습한 특징점과 기술자를 사용하거나, 두 이미지의 특징을 트랜스포머로 서로 비교해 짝을 직접 예측하는 방법이 등장했습니다. 조명이 크게 다르거나 낮과 밤처럼 겉모습이 크게 달라진 이미지 사이에서도 짝을 찾을 수 있어, 전통적인 기술자가 어려워하던 조건에서 특히 효과적입니다.
기하 변환과 정합 정리
| 변환 | 자유도 | 필요한 대응점 | 보존되는 성질 | 예시 |
|---|---|---|---|---|
| 유클리드 변환 | 3 | 2쌍 | 길이, 각도 | 물체의 회전과 이동 |
| 닮음 변환 | 4 | 2쌍 | 각도, 길이의 비율 | 확대와 축소를 포함한 정렬 |
| 아핀 변환 | 6 | 3쌍 | 평행성, 직선 | 기울어진 스캔 보정 |
| 원근 변환 | 8 | 4쌍 | 직선 | 문서 펴기, 파노라마 |
이미지 정합은 대응을 찾고, 틀린 대응을 걸러 내고, 변환을 계산하는 세 단계로 이루어집니다. 특징 검출과 기술자가 대응 후보를 만들고, 비율 검사와 RANSAC이 틀린 대응을 걸러 내며, 남은 정상치로 변환 행렬을 계산합니다.
이 과정에서 가장 중요한 판단은 어떤 변환 모델을 쓸 것인가입니다. 자유도가 높은 모델은 더 다양한 변형을 표현하지만, 더 많은 대응점이 필요하고 잘못된 대응에 더 쉽게 흔들립니다. 장면이 평면인지, 카메라가 회전만 했는지, 원근 효과가 있는지를 먼저 판단하고, 그 상황을 표현할 수 있는 가장 단순한 모델을 고르는 것이 안정적인 정합의 출발점입니다.
- Writer by : 윤대희
댓글 남기기