728x90
반응형
<3-2. Arithmetic Operations on Images>
덧셈, 뺄셈, 비트연산 등 이미지에 대한 다양한 산술 기능을 배워볼 것이다.
- cv2.add(), cv2.addWeighted() 에 대해서 알아볼 것이다.
Image Addition
cv2.add() 함수를 통해서 두 개의 이미지를 더할 수 있고 혹은 res = img1 + img2 처럼 numpy 연산으로도 가능하다. 두 개의 이미지는 동일한 깊이와 타입이거나 두 번째 이미지가 그냥 scalar이어도 된다.
import numpy as np
import cv2
x = np.uint8([250])
y = np.uint8([10])
# Saturation 연산
print(cv2.add(x,y))
# 255이상이어서 255로 표현함
# Modulo 연산
print(x+y)
# 256보다 크기에 256으로 나눠준다.
Image Blending
이 또한 이미지 더하기이지만, 이미지에 다른 가중치를 줌으로써 합성이나 투명도를 줄 수 있다. 이미지는 아래의 식처럼 연산된다.
첫 이미지의 가중치는 0.7이고 두 번째 이미지에 0.3을 준다. cv2.addWeighted()는 아래의 식에 따라 적용된다.
여기서
img1 = cv2.imread('golden.jpg')
img2 = cv2.imread('soccer.jpg')
# 크기를 같게 조정해준다.
img2 = cv2.resize(img2,(500,332))
print(img1.shape), print(img2.shape)
dst = cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
Bitwise Operations
비트연산 AND, OR, NOT, XOR을 포함한다. 이미지의 어느 부분을 추출하는동안, 직사각형이 아닌 ROI를 정의하고 작업하는 동안 유용할 것이다. 아래에는 이미지의 특정 영역을 변경하는 방법에 대해서 볼 것이다.
이미지 위에 한 부분에 다른 이미지를 넣어볼 것이다. 두 이미지를 더했을 때, 색이 변할 것이다. 만약에 합성했을 때는, 투명 효과를 얻을 수 있다. 하지만 불투명해지기를 원한다. 만약에 직사각형 부분이라면, 마지막 장에서 한 것처럼 ROI를 사용하면 된다. 하지만 더하고자하는 suzy.jpg는 직사각형 모양이 아니다. 그래서 이를 비트 연산으로 아래처럼 할 수 있다.
img1 = cv2.imread('beach.jpg')
img2 = cv2.imread('opencv.jpg')
print(img1.shape), print(img2.shape)
# 왼쪽 위 구석에 이미지를 넣을 것이다. ROI를 만들자
rows, cols, channels = img2.shape
roi = img1[0:rows,0:cols]
# 사진의 마스크를 만들고 인버스 마스크도 만든다.
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray,10,255,cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# ROI의 사진의 지역을 블랙아웃해준다.
img1_bg = cv2.bitwise_and(roi, roi,mask = mask_inv)
# 사진으로 부터 인물만 가져온다
img2_fg = cv2.bitwise_and(img2,img2,mask=mask)
# 인물사진을 ROI에 넣고 메인 이미지를 수정한다.
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows,0:cols] = dst
cv2.imshow('res' ,img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 로고를 스크린샷으로 잘못 떠서 우측하고 우측하단에 흰색인것이다…
728x90
반응형