코드 및 이미지 : https://github.com/Seokii/Study_OpenCV
저번 포스팅에서는 이미지(영상)의 크기 변환에 대해서 포스팅 했었습니다.
이번에는, 행렬 덧셈과 곱셈을 이용해서 영상 합성을 해보도록 하겠습니다.
함수 설명
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의 출력 결과입니다. 가중치에 대한 합 계산이 잘 이루어진 것 같습니다.
'머신러닝 & 딥러닝 > 컴퓨터 비전' 카테고리의 다른 글
[OpenCV with Python] - 14. 히스토그램 평활화, 이퀄라이즈(histogram equalize) : cv2.equalizeHist() (0) | 2021.11.10 |
---|---|
[OpenCV with Python] - 13. 히스토그램 계산 및 그리기 : cv2.calcHist() (0) | 2021.10.24 |
[OpenCV with Python] - 11. 이미지(영상)의 크기 변환(확대 및 축소) : cv2.resize() (0) | 2021.09.26 |
[OpenCV with Python] - 10. 이미지(영상)의 밝기 조절 (0) | 2021.09.25 |
[OpenCV with Python] - 09. 관심 영역(ROI) 지정 및 값 확인 (0) | 2021.09.25 |
댓글