본문 바로가기
Developer/OpenCV

[OpenCV] 알파블렌딩을 이용한 이미지 합성

by Doony 2020. 4. 8.

영상처리에서 흔히 얘기하는 fade in/out 효과처럼 자연스럽게 2개의 이미지를 합성하는 방법을 알아보겠습니다.

0~255 사이의 숫자값으로 이루어진 이미지들!

이미지는 픽셀 기반의 숫자 배열 형태로 이루어져있습니다. 만약 2개의 이미지 합성을 위해 단순히 두 어레이를 더하는 형태로 표현하면 어떻게될까요?

이미지 데이터셋이므로 uint8, 즉 0~255 사이의 값만 갖도록 데이터타입을 선정했다고 가정했습니다.


a+b: 단순히 이미지 2개를 더합니다. 255보다 큰 값이 나오면, uint8에 의해 255를 뺀 값이 저장됩니다.


cv2.add(a, b): openCV에서 제공하는 add 메소드로, 255보다 크면 최대값인 255로 지정합니다.


이와 마찬가지로 더하기, 곱하기, 나누기도 동일한 방식으로 연산이 됩니다. 즉, 단순하게 cv2.add나 cv2.substract 등을 사용해서 이미지를 합성하게 되면, 최대값인 255로 값이 몰려서 하얗게 합성이미지가 변색(?)되는 것을 쉽게 확인할 수 있습니다.


이를 해결하기 위해 알파 블렌딩(Alpha Blending)을 사용합니다. 일종의 투명도 같은 역할을 하게 되는데, 합성하려는 이미지들의 총합이 255아래로 되도록, 더하거나 빼는 연산을 할 때 특정 비율(alpha) 만큼 곱해주는 것이 그 원리입니다.


1
2
3
4
5
6
7
8
9
10
11
12
import cv2
import numpy as np
import matplotlib.pylab as plt
 
img1 = cv2.imread('./img/wing_wall.jpg')
img2 = cv2.imread('./img/yate.jpg')
 
alpha = 0.5
dst = cv2.addWeighted(img1, alpha, img2, (1-alpha), 0)
cv2.imshow('cv2.addWeighted', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cs
___

img1에 대한 비율을 alpha로 놓으면, img2에 대한 비율은 (1-alpha)가 됩니다. 이런식으로 영상의 fade in/out 효과를 알파블렌딩을 통해 부여할 수 있습니다.

댓글