[OpenCV] 03-2. Arithmetic Operations on Images
🐍Python/OpenCV

[OpenCV] 03-2. Arithmetic Operations on Images

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

이 또한 이미지 더하기이지만, 이미지에 다른 가중치를 줌으로써 합성이나 투명도를 줄 수 있다. 이미지는 아래의 식처럼 연산된다.


g(x)=(1α)f0(x)+αf1(x)

α를 0~1로 다양하게 함으로써, 한 이미지에서 다른 이미지로 변화시킬 수 있다.

첫 이미지의 가중치는 0.7이고 두 번째 이미지에 0.3을 준다. cv2.addWeighted()는 아래의 식에 따라 적용된다.


dst=αimg1+βimg2+γ


여기서 γ는 0으로 줬다.

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
반응형