Python과 OpenCV – 7 : 이미지에 대한 산술 연산

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_image_arithmetics/py_image_arithmetics.html 입니다.

이 글에서는 이미지에 대한 더하기 연산, 빼기 연산, Bitwise 연산 등에 대한 글이며, cv2.add(), cv2.addWeighted() 함수에 대해 살펴봅니다.

다음 코드는 OpenCV의 add 함수와 일반적인 덧셈에 대한 차이를 보여줍니다.

import cv2
import numpy as np

x = np.uint8([250]) # 250 + 10 = 260 => 255
y = np.uint8([10]) # 250 + 10 = 260 => 260 % 256 = 4

print(cv2.add(x,y))
print(x+y)

출력 결과는 각각 255와 4입니다. OpenCV의 경우 데이터 타입의 범위를 벗어나면 해당 데이터 타입이 갖을 수 있는 최대값이 됩니다.

다음은 이미지의 블랜딩(Blending)에 대한 코드입니다.

import cv2
import numpy as np

img1 = cv2.imread('./data/ml.png')
img2 = cv2.imread('./data/opencv_logo.png')

dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

결과는 다음과 같은데요. 아래의 3개의 이미지 중 첫번째는 ml.png이고 두번째는 opencv_log.png입니다. 그리고 세번째가 cv2.addWeighted 함수의 적용 결과 이미지입니다.

위의 코드에서 cv2.addWeighted 함수의 인자가 (imgA, a, imgB,b, c)라고 한다면 산술식은 다음과 같습니다.

result = imgA * a + imgB * b + c

다음은 Bitwise 연산에 대한 예제로써, 2개의 이미지를 하나의 이미지로 배경을 살리면서 합하는 예제입니다.

import cv2
import numpy as np

# Load two images
img1 = cv2.imread('./data/Penguins2.jpg')
img2 = cv2.imread('./data/opencv_logo.jpg')

# I want to put logo on top-left corner, So I create a ROI
rows,cols,channels = img2.shape
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)
cv2.imshow('mask_inv',mask_inv)

# 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('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

결과는 아래와 같습니다.

위의 결과는 2개의 이미지를 보여주고 있는데.. 첫번째는 배경 이미지에 섞을 이미지를 Mask로 사용하기 위해 만들어진 것이고 두번째는 그 결과 이미지입니다. 첫번째 이미지에 대한 이미지 객체는 위의 코드에서 mask 입니다. 이미지에 대한 Grayscale 변환 후 Threshold를 이용한 이진 비트맵 변환, Mask 기법과 bitwise 연산을 적용하고 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다