이미지 스티칭 - Image Stitching
이미지 스티칭은 동일 장면의 사진을 자연스럽게(seamless) 붙여서 한 장의 사진으로 만드는 기술입니다.
사진 이어 붙이기, 파노라마 영상(Panorama image)
기본적인 방법은 여러장의 영상에서 특징점을 검출하고 특징점이 동일한 것들을 찾아서 두 장의 영상과의 투시변환 관계를 찾아내어 이어 붙입니다.
위 두 영상에서 특징점을 검출 시 하늘에서는 특징점이 검출되지 않습니다.
엣지가 있고 지글지글한 텍스쳐가 있는 부분만 특징점이 검출됩니다.
위 그림에서 양쪽에 검출된 특징점만 남겨둡니다.
매칭되는 정보를 이용해서 투시변환 관계를 추출하고 이어 붙입니다.
단순히 이어 붙이면 밝기가 급격히 바뀌는 부자연스러움이 생깁니다.
밝기를 부드럽게 할 수있는 블렌딩을 이용하면 자연스럽게 처리할 수 있습니다.
위 그림은 이미지 스티칭의 전제적인 모습입니다.
여러장의 영상을 입력으로 받아서 리사이즈(속도를 빠르게 하기 위함)을 하고 특징점을 검출합니다.
특징점 매칭을 하고 투시변환의 상관관계를 계산하고 그 정보를 이용해서 영상을 결합(compositioning)합니다.
그 후에 노출 보정, 블렌딩을 적용한 후에 최종적인 영상이 만들어 집니다.
이미지 스티칭 객체 생성 - cv2.Stitcher_create
이미지 스티칭을 하기 위해서는 우선 이미지 스티칭 객체를 생성해야 합니다.
Stitcher 클래스는 surf 또는 ORB를 이용합니다.
기본적으로 ORB 특징점 검출 알고리즘을 제공합니다.
cv2.Stitcher_create(, mode=None) -> retval
• mode: 스티칭 모드. cv2.PANORAMA 또는 cv2.SCANS 중 하나 선택. 기본값은 cv2.PANORAMA.
• retval: cv2.Stitcher 클래스 객체
mode의 인자는 일반적인 사진을 합성할 때는 cv2.PANORAMA를 입력합니다.
cv2.SCANS는 스캐너에서 문서를 스캔하듯이 자유도가 좀 더 낮습니다.
affine, 밝기가 어느정도 균일하다고 가정할 때 이용합니다.
이미지 스티칭 함수 - cv2.Stitcher.stitch
Stitcher 객체를 생성하고 이미지 스티칭 함수를 이용하면 파노라마 영상을 출력할 수 있습니다.
cv2.Stitcher.stitch(images, pano=None) -> retval, pano
• images: 입력 영상 리스트
• retval: 성공하면 cv2.Stitcher_OK.
• pano: 파노라마 영상
이미지 스티칭 예제
예제 코드 출처 : 황선규 박사님 github홈페이지 sunkyoo.github.io/opencv4cvml/
# 3장의 영상을 리스트로 묶어서 반복문으로 하나하나 갖고옴
img_names = ['img1.jpg', 'img2.jpg', 'img3.jpg']
# 불러온 영상을 imgs에 저장
imgs = []
for name in img_names:
img = cv2.imread(name)
if img is None:
print('Image load failed!')
sys.exit()
imgs.append(img)
# 객체 생성
stitcher = cv2.Stitcher_create()
# 이미지 스티칭
status, dst = stitcher.stitch(imgs)
if status != cv2.Stitcher_OK:
print('Stitch failed!')
sys.exit()
# 결과 영상 저장
cv2.imwrite('output.jpg', dst)
# 출력 영상이 화면보다 커질 가능성이 있어 WINDOW_NORMAL 지정
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()
이처럼 이미지 스티칭을 사용하면 여러 장의 영상을 하나의 영상으로 묶을 수 있습니다.
OpenCV 홈페이지와 황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.
논문 출처 : matthewalunbrown.com/papers/ijcv2007.pdf
OpenCV 홈페이지 : docs.opencv.org/master/d1/d46/group__stitching.html