영상 합성과 마스킹
by Cori배경이 투명한 알파 채널 영상을 이용하여 영상을 합성하는 방법에 대해 살펴보고, 마스크를 만드는 방법에 대해 알아본다.
* 해당 포스팅에서 다루고 있는 모든 내용은 다음 서적을 참고하였습니다.
이미지 합성과 마스크
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을 사용한 경우 자연스럽게 합성된 것을 확인할 수 있다.
'AI > Computer Vision' 카테고리의 다른 글
영상 히스토그램 그리기 (0) | 2021.09.24 |
---|---|
노멀라이즈, 이퀄라이즈, CLAHE (0) | 2021.09.23 |
두 영상 간 다른 점 찾기 (차영상) (1) | 2021.09.21 |
영상 합성 (알파 블렌딩) (0) | 2021.09.20 |
오츠의 알고리즘 & 적응형 스레시홀드 (0) | 2021.09.19 |
블로그의 정보
코딩하는 오리
Cori