이제 이미지를 실제로 이어붙여 파노라마를 만들기 위해 필요한 모든 도구를 가지고 있습니다!
1) 여러 장의 이미지가 주어졌고, 하나의 기준 이미지를 선택합니다.
2) 이 이미지와 다른 각 이미지 간의 호모그래피를 계산하게 되고, 이렇게 하면 각 이미지를 기준 이미지의 좌표 프레임으로 변환하는 데 필요한 기하학적 변환을 얻을 수 있습니다.
3) 그런 다음 정렬된 이미지를 얻게 되며, 이러한 이미지를 어떻게 병합하여 단일 이미지를 만들어야 하는지 고민해야 합니다.
BUT!
최종 출력물이 고품질이 되도록 보장하기 위해 고려해야 할 몇 가지 기술적 문제가 있습니다.
우선 기하학적 변환 또는 워핑을 적용하는 것과 관련이 있습니다.
예를 들어, 이미지 f가 있다고 가정하고, transformation T를 적용하여 변환된 이미지 g를 얻으려면, f의 각 픽셀들에 transformation T를 적용하고 각 위치에 맞는 픽셀의 밝기 값을 쓸 수 있습니다.
-> 그러나 여기에 약간의 문제가 있습니다.![](https://velog.velcdn.com/images/lee9843/post/fc28ad7d-f478-4659-99a2- d03b36c32ee0/image.png)
변환된 픽셀이 g의 픽셀 중심에 정확히 놓이지 않을 수 있습니다. 또한 더 큰 문제는 변환 후에 g의 이미지에서 픽셀이 실제로 채워지지 않을 수 있다는 것입니다. 이것은 g에 결합된 구멍을 생성할 수 있으며, 이는 원하는 결과가 아닙니다.
Solve!
이 문제를 해결하기 위해 forward warping 대신 backward warping을 사용합니다.
이 방법을 사용하면 먼저 이미지 f의 네 개의 모서리를 forward warping을 적용하여 이미지 g의 경계 상자를 얻을 수 있습니다.
그런 다음 해당 경계 상자 내의 셀을 채우는 것 입니다. 이를 위해 해당 셀 내의 각 픽셀을 선택하고 이제 이러한 픽셀 위치에 대한 변환의 역을 적용하여 이미지 f에서 어느 위치로 이동해야 하는지 확인하고, 해당 위치에서 밝기 값을 가져옵니다.
이를 통해 빈 셀이 없도록 만들어낼 수 있습니다.
Image Alignment Process
이제 이미지 정렬을 수행할 준비가 되었습니다.
간단한 시나리오를 살펴보겠습니다.
세 개의 이미지, 즉 1, 2 및 3 번 이미지가 있는 상황입니다. 우선 이미지 2를 기준 이미지인 reference image로 선택하고, 다른 모든 이미지를 이미지 2로 왜곡하겠습니다.
이미지 1에서 이미지 2로 가는 homography matrix를 알고 있기에, 이미지 1의 모서리를 취하고 이를 forward mapping하여 reference image인 이미지 2에서 이미지 1의 바운딩 박스를 얻습니다. 이제 이미지 3에 대해서도 동일한 작업을 수행합니다.
이렇게 하면 이제 채워야 하는 영역(bounding box 내 검은 부분)을 이제 쉽게 알 수 있습니다!
이를 채우기 위해 위에서 언급한 backward warping을 수행합니다. 이미지 2의 바운딩 박스 내의 각 픽셀을 선택하고, 해당 픽셀을 이미지 1에서 어디에 놓여야 하는지 확인하기 위해 역 매핑 (H12, 역워핑)을 적용합니다. 그런 다음 이미지1의 해당 위치에서 밝기 값을 가져와서 이 위치에 기록합니다.
이 방법을 모든 바운딩 박스 내의 모든 픽셀에 대해 반복하며, 결과적으로 왜곡 또는 변환됩니다. 이미지 3에도 동일한 과정을 적용합니다.
Blending Images
이제 이렇게 정렬된 이미지를 얻었습니다. 이러한 이미지를 서로 쌓아서 하나 위에 다른 하나를 쌓아 파노라마와 같이 만들어 줍니다.
하지만 여기서 하나의 문제점을 확인해 볼 수 있습니다.
바로 명확한 seems(이미지 경계 부분에서 나타나는 이상한 선)이 있음을 알 수 있습니다.
Q. 그렇다면 이러한 seems는 어디에서 나오는 것일까요?
먼저, 이미지를 캡처할 때 카메라의 노출이 두 이미지 사이에서 정확히 동일하다고 가정할 이유가 없습니다. 게다가 카메라를 움직이면서 조명 조건도 약간 변경될 수 있고, 태양이 구름을 통과할 수 있기 때문에 씬의 노출이 약간 변경될 수 있습니다.
이러한 노출 문제 또는 조명 문제가 첫 번째 문제입니다.
또 다른 문제는 실제로 렌즈의 밝기 응답이 외부로 갈수록 감소한다는 것입니다.
이것은 Vignetting과 같은 것 때문입니다. 즉, 중심 근처에서 더 밝고 주변으로 갈수록 어둡습니다. 그러므로 이미지 경계 부분에 가까워질수록 밝기 불일치가 발생할 수 있습니다.
따라서 이러한 radiometric or photometric 차이를 완화하는 방법이 필요합니다.
이를 위해 Blending Images가 등장합니다.
이제 이미지를 블렌딩하는 방법에 대해 설명하겠습니다. 두 이미지 I1과 I2가 있다고 볼 때, 이 두 이미지를 정확히 가운데에서 블렌딩하려면 출력 이미지의 왼쪽 절반을 I1에서, 오른쪽 절반을 I2에서 가져와야 합니다.
이를 위해 두 가지 방법이 있습니다. 먼저, 이미지의 절반을 단순히 자르고 붙일 수 있습니다.
또는 이미지에서 중심으로부터 거리에 따라 가중치를 부여하는 방식을 사용할 수 있습니다. 중심에서는 한 이미지의 가중치를 1에서 0으로, 다른 이미지의 가중치를 0에서 1로 부여하고, w1을 이미지 1에, w2를 이미지 2에 곱하고 더한 다음 이미지를 블렌딩할 수 있습니다. 이는 경계가 뚜렷한 seem이 나타나지 않도록 부드럽게 블렌딩됩니다.
Computing Weighting Functions
마지막으로 이러한 간단한 아이디어를 Image Stitching에 적용해 보겠습니다.
우선 세 개의 이미지 I1, I2 및 I3가 있으며 각 이미지에 대한 가중치 함수를 계산합니다. 이 가중치 함수는 이미지 경계로부터의 거리에 따라 픽셀의 가중치를 할당합니다. 가중치가 edge에 있을수록 낮은 가중치 값을 갖습니다.
이러한 가중치 함수를 사용하여 이미지를 블렌딩하면 seem 없이 연속적인 파노라마 이미지를 얻을 수 있습니다.
또 다른 예시로 파리의 노트르담 성당을 section별로 찍은 것을 자연스럽게 연결해 본 예시입니다.
이렇게 경계가 없이 단일 이미지처럼 보이게 만들 수 있습니다.
참고 : https://www.youtube.com/watch?v=D9rAOAL12SY&list=PL2zRqk16wsdp8KbDfHKvPYNGF2L-zQASc&index=6