이번 포스팅에서는 파이썬 OpenCV에서 아래의 사과 이미지를 오른쪽 하늘 배경에 넣는 것을 해보고 싶습니다.
이 글을 읽기 전 선수 지식 포스팅
1) 준비사항
이때 필요한 것은 3개의 이미지가 필요합니다.
이중 2개는 당연히 원본 사과 이미지와, 원본 하늘 이미지입니다.
나머지 1개는 바로 사과의 마스크 이미지인데요.
마스크 이미지란 아래와 같이 검은색과 흰색으로 구성된 이미지라고 보시면 됩니다.
여기서 포인트는 우리가 관심있어 하는 부분이 흰색이 되어야 한다는 점입니다.
이를 전문용어(?)로 A Region Of Interest 줄여서 ROI, 한국말로는 관심 영역이라고 합니다.
해당 마스크 이미지는 opencv 이진 영상 처리 함수를 통해서도 만들어 줄 수 있지만, 복잡한 이미지 같은 경우 직접 포토샵과 같은 이미지 처리 툴을 통해 이미지를 만들어줘야 합니다.
준비한 이미지들을 오픈cv 를 통해 불러와보도록 할게요.
output:
2) 이미지 합치기
(1) 이미지 합치기 전제조건
이미지를 합치기에 앞서 중요한 포인트는 각 이미지의 크기가 동일해야 한다는 것입니다.
output:
마스크 이미지는 그레이스케일 이미지임으로 차원이 다르지만 , 모두 같은 크기의 이미지라는것을 알 수 있습니다.
또한 추가적으로 사과 이미지와 하늘 이미지는 차원까지 모두 같아야 합니다.
즉 컬러 이미지면 둘다 컬러이미지 ,그레이스케일 이미지이면 둘다 그레이스케일이어야 한다는 것이죠.
왜냐하면 합성하는데 두이미지의 속성이 다르면 합성자체가 되지 않기 때문입니다.
(2) CopyTo함수를 통한 두 이미지 합성
copyTo 함수 첫번째 인자에는 옮길 객체 이미지, 즉 여기선 사과 이미지를 말하겠죠?
두번째 인자에는 해당 객체의 마스크 이미지,
마지막으로 세번째 인자에는 배경이 될 이미지, 여기선 하늘 이미지를 넣어주면 됩니다.
해당 함수는 내부적으로 객체를 붙히고 수정하기 때문에 따로 return값을 받을 필요는 없습니다.
합성된 이미지의 결과를 확인하기 위해서는 배경이미지를 출력해보겠습니다.
output:
정상적으로 이미지가 합성된것을 알 수 있습니다.
(3) 넘파이 indexing을 통한 합성
copyTo 이외에도 넘파이 boolean 인덱싱을 통해서도 합성이 가능합니다.
위 코드가 이해가 안되시는 분은 넘파일 boolean 포스팅을 읽고 와주시기 바랍니다.
3) 다른 크기의 이미지와 합치기
우리가 실제로 맞딱드릴 상황은 이미지의 크기가 같을 경우는 거의 없습니다.
즉 우리가 앞서 배운 방식은 현실성이 없는 코드인거죠.
그렇다면 어떻게 서로 다른 크기의 이미지를 합칠 수 있을까요?
(1) 이미지 준비
output:
보시는 바와 같이 하늘 이미지와 사과 이미지의 크기가 다릅니다.
(2) 객체(사과) 이미지 크기 추출
ouptut:
채널을 제외한 h, w크기 추출을 합니다.
(3) crop을 통해 크기 맞추기
위에서 추출한 크기를 이용하여 배경 이미지를 크롭 시킵니다.
크롭 시킨 이유는 이미지 합성을 위해 크기를 같게 하기 위함입니다.
(4) 이미지 합성
기존에 dst가 들어갈 위치에 crop한 이미지를 넣어줍니다.
최종적으로 결과값을 확인하기 위해서 원본 배경이미지를 출력할때는 crop이아닌 dst를 넣어준다는것을 주의하시기 바랍니다.
output:
보시는바와 같이 정상적으로 합성이 된걸 알 수 있습니다.
crop에 이미지를 붙혔는데 왜 dst를 출력하지?라고 의문이 드시는 분들도 있을겁니다.
이는 crop과 dst가 같은 메모리를 공유하고 있기 때문에 이름만 다르지 사실상 같은 이미지입니다.
여러분의 예상대로 동작하려면 .copy()를 통해 crop과 dst가 서로 다른 메모리를 쓰도록 세팅 해줘야 합니다.
+보너스
아래와 같이 인덱싱을 조정하면 이미지의 위치를 조절할수도 있으니 참고하시기 바랍니다.
'머신러닝,딥러닝 > opencv' 카테고리의 다른 글
[파이썬 opencv] 오픈 cv에서 yolov3 사용하는 방법 (2) | 2022.10.26 |
---|---|
[파이썬 opencv] 오픈 cv에서 detection model 실행하는 방법 (0) | 2022.10.21 |
[오픈 cv] 트랙바란? 트랙바 사용방법(for opencv 초보자) (0) | 2022.09.14 |
[opencv] 그림 그리기 | 글자 쓰는 법 (+ 한글 사용 방법) (0) | 2022.09.06 |
[오픈 cv python] 이미지 읽기(cv2.imread) | 컬러 , 흑백 (0) | 2022.08.30 |
댓글