머신러닝 & 딥러닝/컴퓨터 비전

[OpenCV with Python] - 12. 행렬 덧셈과 곱셈을 이용한 이미지(영상) 합성/합치기

by seokii 2021. 9. 26.
728x90
반응형

코드 및 이미지 : https://github.com/Seokii/Study_OpenCV

 

GitHub - Seokii/Study_OpenCV: study about OpenCV

study about OpenCV. Contribute to Seokii/Study_OpenCV development by creating an account on GitHub.

github.com

 

저번 포스팅에서는 이미지(영상)의 크기 변환에 대해서 포스팅 했었습니다.

이번에는, 행렬 덧셈과 곱셈을 이용해서 영상 합성을 해보도록 하겠습니다.

 

함수 설명

1. cv2.add(src1, src2, dst, mask, dtype) -> dst

  • src1 : 입력할 첫 번째 영상 혹은 스칼라
  • src2 : 입력할 두 번째 영상 혹은 스칼라
  • dst : (출력) 덧셈 연산의 결과 영상(이미지)
  • mask : 마스크 영상
  • dtype : 출력 영상의 타입

- 두 영상의 같은 위치에 있는 픽셀들의 값을 더하여 결과 값으로 출력합니다.

- saturate 연산을 수행합니다. (10번 포스팅 참고)

 

 

2. cv2.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype) -> dst

  • src1 : 첫 번째 입력 영상(이미지)
  • alpha : 첫 번째 영상(이미지)의 가중치
  • src2 : 두 번째 입력 영상(이미지)
  • beta : 두 번째 영상(이미지)의 가중치
  • gamma : 결과 값에 추가적으로 더할 값
  • dst : 결과 영상(이미지)
  • dtype : 출력 영상(이미지)의 타입

- 두 영상의 같은 위치에 있는 픽셀들의 값을 가중치를 두어 합을 계산합니다. 그 결과를 출력합니다.

- 가중치를 곱하여 합을 계산하기 때문에 평균 밝기를 유지할 수 있습니다.

 

3. np.clip(a, a_min, a_max, out)

  • a : 고정(clip)할 요소를 포함하는 입력 배열
  • a_min : 고정할 최댓값 설정
  • a_max : 고정할 최소값 설정
  • out : 결과 값

ex) a=[1,2,3,4,5,6,7], a_min=3, a_max=5 -> out = [3,3,3,4,5,5,5]

 

 

주피터 노트북으로 구현하기

In [1] : 

import numpy as np
import cv2

In [2] : 

cat = cv2.imread("images/cat.jpg", cv2.IMREAD_GRAYSCALE)
dog = cv2.imread("images/dog.jpg", cv2.IMREAD_GRAYSCALE)

- 필요한 라이브러리와 이미지들을 불러옵니다.

- 이미지는 그레이스케일(흑백)로 불러왔습니다.

 

 

In [3] : 

cat.shape, dog.shape

Out [3] : 

- 이미지 행렬의 크기를 확인합니다.

- 행렬의 크기가 같지 않으므로 임의대로 조정하는 작업을 하겠습니다.

 

 

In [4] : 

cat = cv2.resize(cat, (640 ,480))
dog = cv2.resize(dog, (640 ,480))

- 지난 포스팅의 내용이었던 cv2.resize() 함수를 사용해 이미지의 크기를 재조정합니다.

- 두 이미지를 합치기 위해서 같은 크기로 변환했습니다.

 

 

In [5] : 

ratio1 = 0.6
ratio2 = 0.4
add1 = cv2.add(cat,dog)
add2 = cv2.add(cat * ratio1, dog* ratio2)
add2 = np.clip(add2, 0, 255).astype('uint8')
add3 = cv2.addWeighted(cat, ratio1, dog, ratio2, 0)

- alpha 값은 0.6, beta 값은 0.4로 설정했습니다.

- add1 값은 가중치를 두지 않고 단순히 이미지를 합한 것입니다. 이 경우, 많은 부분이 saturation연산의 최댓값에 도달하여 이미지가 흰색으로 보일 것으로 예상됩니다.

- add2 값은 가중치를 주고 행렬 합을 계산한 후, np.clip() 함수를 사용하여 saturation연산을 합니다.

- add3 값은 cv2.addWeighted()함수를 사용하여 가중치에 대한 합 계산 및 saturation연산을 함께 수행합니다.

 

 

In [6] : 

cv2.imshow("cat", cat)
cv2.imshow("dog", dog)
cv2.imshow("add1", add1)
cv2.imshow("add2", add2)
cv2.imshow("add3", add3)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 결과를 출력하는 코드입니다.

 

Out [6] : 

- 이미지를 합치기 위한 각각의 원본 사진입니다.

 

- add1의 출력 결과입니다. 예상과 같이 많은 부분이 흰색으로 표현되었습니다.

 

- add2, add3의 출력 결과입니다. 가중치에 대한 합 계산이 잘 이루어진 것 같습니다.

 

 

728x90
반응형

댓글