소소한 컴퓨터 이야기

영상 합성과 마스킹

by Cori

배경이 투명한 알파 채널 영상을 이용하여 영상을 합성하는 방법에 대해 살펴보고, 마스크를 만드는 방법에 대해 알아본다.

 

* 해당 포스팅에서 다루고 있는 모든 내용은 다음 서적을 참고하였습니다.

 

파이썬으로 만드는 OpenCV 프로젝트

“개발자에게 딱 필요한 만큼의 이론과 활용 가능한프로젝트로 배우는 OPENCV 프로그래밍”OPENCV는 영상 처리와 컴퓨터 비전 분야에서 현존하는 가장 영향력 있는 라이브러리이다.이 책은 누구나


이미지 합성과 마스크

0) 정의

-> 두 개 이상의 영상에서 특정 영역끼리 합성하기 위해서는 전경이 될 영상과 배경이 될 영상에서 합성하고자 하는 영역만 떼어내는

작업과 그것을 합하는 작업으로 나눌 수 있다. 여기서 원하는 영역만 떼어내는 데 꼭 필요한 것이 마스크이다.

 

1) 이미지 합성 (영역을 이용한 마스킹)

-> 알파 채널을 가진 OpenCV 로고를 이용하여 영상을 합성해보자 

* roi를 지정하여 배경 사진에 전경 사진을 합성할 곳 선택 

마스크와 역마스크, 마스크 전경과 후경

다음은 이미지 합성한 결과물이다.

영역을 이용한 마스킹

2) 이미지 합성 (색을 이용한 마스킹)

-> 색상에 따라 영역을 떼어내야 하는 경우, 색을 가지고 마스크를 만들어아 함 .. HSV로 변환하여 원하는 색상 범위의 것만 고르기

OpenCV에서는 특정 범위에 속하는지 판단할 수 있는 함수 inRange를 제공하기 때문에, 이를 이용해 특정 범위 값을 만족하는 마스크를 만들기 쉬움.

 

* inRange 함수는 첫 번째 인자의 영상에서 두 번째와 세 번째 인자의 배열 구간에 포함되면 255를 할당하고, 그렇지 않으면 0을 할당

 

3) 크로마키 마스킹

토끼 코스프레를 한 남자가 있는 왼쪽 끝 배경 10 x 10 픽셀을 크로마 키가 있는 영역으로 어림잡아 지정하고, 이 영역의 색상 값 중 가장 큰 값과 가장 작은 값을 범위로 지정하여 cv2.inRange() 함수를 사용해 배경만 제거하였다. 

 

* offset을 이용해 어림잡아 선택한 색상 값보다 더 넓은 영역의 색상을 선택할 수 있도록 가감 (여러 차례 시도하며 조정할 것)

  그리고 크로마 키 이미지와, 합성할 배경 이미지의 높이나 너비 사이즈가 같으면 코드에 오류가 발생하니, 사이즈 조정이 필요하다. 

  (크로마 키 이미지 사이즈 < 배경 이미지 사이즈)

 

다음은 크로마 키를 적용한 결과물이다.

크로마키 마스킹

이와 같은 영상 합성 작업에는 대부분 알파 블렌딩 또는 마스킹이 필요하며, 블렌딩을 위한 적절한 알파 값 선택과 마스킹을 위한      

모양의 좌표나 색상 값 선택에 많은 시간과 노력이 필요하다. OpenCV는 버전 3부터 seamlessClone이라는 함수를 제공하는데,

이를 이용하면 알아서 두 영상의 특징을 살려 합성할 수 있다.

 

SeamlessClone 함수를 이용한 영상 합성

0) 구조

-> dst = cv2.seamlessClone(srt, dst, mask, coords, flags[, output])

· src: 입력 영상 (전경)

· dst: 대상 영상 (배경)

· mask: 마스크, src에서 합성하고자 하는 영역: 255, 나머지: 0

· coords: src가 놓여지기 원하는 dst의 좌표 

· flags: 합성 방식 (cv2.NORMAL_CLONE: 입력 원본 유지, cv2.MIXED_CLONE: 입력과 대상을 혼합)

 

1) 활용

cv2.NORMAL_CLONE의 경우 피부 주변이 뭉개져 보이고, cv2.MIXED_CLONE을 사용한 경우 자연스럽게 합성된 것을 확인할 수 있다.

블로그의 정보

코딩하는 오리

Cori

활동하기