무효 클릭 IP 추적 중...
머신러닝,딥러닝/opencv

[파이썬 opencv] 두 이미지 합치는 방법(with 크기 다른 이미지)

꼬예 2022. 9. 13.

 

 

이번 포스팅에서는 파이썬 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 포스팅을 읽고 와주시기 바랍니다.

 

[넘파이 기초] bool ndarray로 인덱싱하기(np.nonzero, np.where)

지금까지는 int ndarray를 통해서만 인덱싱을 해보았습니다. 하지만 넘파이에선 int ndarray이외에도 bool ndarray인덱싱도 가능합니다. 자세한건 코드를 통해 확인해보시죠! bool ndarray 기본형 import numpy a

yeko90.tistory.com

 

 

3) 다른 크기의 이미지와 합치기

우리가 실제로 맞딱드릴 상황은 이미지의 크기가 같을 경우는 거의 없습니다.

즉 우리가 앞서 배운 방식은 현실성이 없는 코드인거죠.

 

그렇다면 어떻게 서로 다른 크기의 이미지를 합칠 수 있을까요?

 

(1) 이미지 준비

 

이미지 준비

 

output:

 

 

보시는 바와 같이 하늘 이미지와 사과 이미지의 크기가 다릅니다.

 

(2) 객체(사과) 이미지 크기 추출

 

 

ouptut:

 

채널을 제외한 h, w크기 추출을 합니다.

 

(3) crop을 통해 크기 맞추기

 

 

위에서 추출한 크기를 이용하여 배경 이미지를 크롭 시킵니다.

 

크롭 시킨 이유는 이미지 합성을 위해 크기를 같게 하기 위함입니다.

 

 

(4) 이미지 합성

 

 

기존에 dst가 들어갈 위치에 crop한 이미지를 넣어줍니다.

 

최종적으로 결과값을 확인하기 위해서 원본 배경이미지를 출력할때는 crop이아닌 dst를 넣어준다는것을 주의하시기 바랍니다.

 

output:

 

 

보시는바와 같이 정상적으로 합성이 된걸 알 수 있습니다.

crop에 이미지를 붙혔는데 왜 dst를 출력하지?라고 의문이 드시는 분들도 있을겁니다.

 

이는 crop과 dst가 같은 메모리를 공유하고 있기 때문에 이름만 다르지 사실상 같은 이미지입니다.

 

여러분의 예상대로 동작하려면 .copy()를 통해 crop과 dst가 서로 다른 메모리를 쓰도록 세팅 해줘야 합니다.

 

 

+보너스

아래와 같이 인덱싱을 조정하면 이미지의 위치를 조절할수도 있으니 참고하시기 바랍니다.

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글