[OpenCV-Python Tutorials] 08 이미지의 산술 연산
목표
- 더하기, 빼기, 비트 연산 등과 같은 이미지에 대한 여러 가지 산술 연산에 대해 배웁니다.
- cv2.add(), cv2.addWeighted() 등의 함수를 배우게 됩니다.
이미지 추가
OpenCV 함수 cv2.add()
또는 단순히 numpy 연산인 res = img1 + img2
로 두 개의 이미지를 추가 할 수 있습니다. 두 이미지는 모두 같은 깊이와 유형이어야 하며 두 번째 이미지는 스칼라 값일 수 있습니다.
OpenCV 추가와 Numpy 추가에는 차이가 있습니다. OpenCV 추가는 포화된 작업이며 Numpy 추가는 모듈러스 연산입니다.
예를 들어, 다음 샘플을 확인하십시오.
1 | 250]) x = np.uint8([ |
두 개의 이미지를 추가하면 더 잘 보입니다. OpenCV 기능이 더 나은 결과를 제공합니다. 항상 OpenCV 기능을 더 잘 사용하십시오.
코드
1 | import cv2 |
이미지 블렌딩
이것은 이미지 추가이지만 이미지에 다른 가중치가 주어지기 때문에 블렌딩이나 투명성을 부여합니다. 이미지는 아래의 방정식에 따라 추가됩니다.
\alpha$$ 값을 0에서 1로 변경하면서 이미지간에 멋진 전환을 수행 할 수 있습니다. 섞기 위해 두 개의 이미지를 사용했습니다. 첫 번째 이미지에는 0.7의 가중치가 부여되고 두 번째 이미지에는 0.3이 주어집니다. `cv2.addWeighted()`는 이미지에 다음 방정식을 적용합니다.
dst = \alpha \cdot img1 + \beta \cdot img2 + \gamma
여기서 $$\gamma$$는 0으로 간주됩니다.
1
2
3
4
5
6
7
8
9
10import cv2
img1 = cv2.imread('resize_model1.jpg')
img2 = cv2.imread('resize_model2.jpg')
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31import cv2
img1 = cv2.imread('resize_model1.jpg')
img2 = cv2.imread('opencv-logo-white.png')
# I want to put logo on top-left corner, So I create a ROI
rows, cols, channels = img2.shape
print(rows, cols, channels) # 222 180 3
roi = img1[0:rows, 0:cols]
# Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# Now black-out the area of logo in ROI
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('bg', img1)
cv2.imshow('res', img1)
cv2.imshow('res', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()