티스토리 뷰

반응형
[영상처리] 알파 블렌딩(Alpha Blending)이란? (OpenCV-python)

알파 블렌딩(Alpha Blending)이란?

두 개의 영상을 합성할 때, 일반적으로 생각할 수 있는 방법은 더하기 연산이다. 그러나 일반적인 덧셈으로는 픽셀값이 255를 넘어가면 overflow가 발생하거나, 255로 고정이 되는데 이렇게 되면 원하는 결과를 얻기가 힘들다. 그래서 두 영상에 가중치를 주어 더하는 방식이 알파 블렌딩이다.

g(x)=(1α)f0(x)+αf1(x)g(x) = (1-\alpha)f_0(x)+\alpha f_1(x)

위의 수식대로 f1의 영상에 가중치 α\alpha를 곱하고, 다른 영상 f0에는 1α1-\alpha 를 곱한다.

Opencv Python 코드-1

일단 위에서 설명한대로 기본적인 덧셈으로 연산해보고, cv2에서 제공하는 덧셈 함수 cv2.add()를 사용해 2가지 결과를 확인해보겠다.

import cv2
import matplotlib.pyplot as plt
import numpy as np

img1 = cv2.imread('imgs/man_face.jpg')
img2 = cv2.imread('imgs/lion_face.jpg')

img3 = img1 + img2          # 방식1
img4 = cv2.add(img1, img2)  # 방식2

for i, img in enumerate([img1, img2, img3, img4]):
    plt.subplot(2,2,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(img[:,:,::-1])
plt.show()

아래 결과영상을 보면 왼쪽위부터 원본1, 원본2, 일반덧셈, cv2덧셈함수 순이다. 일반 덧셈은 영상이 매우 이상해 보이는데 더하기 연산 과정 중에 255를 넘어가면 overflow가 발생하여 다시 0부터 시작되어 원하지 않는 값을 갖게 된다.

두번째로는 cv2.add 연산인데 결과는 일반 덧셈에 비해 그럴듯해보인다. 하지만 일반 덧셈과 다르게 픽셀의 값이 255를 넘어가면 overflow가 되는게 아니라 255가 고정된다. 그래서 코,입 주변을 보면 매우 밝은 값을 갖는 걸 확인할 수 있다.

OpenCV Python 코드-2

두번째로는 위에서 설명한 알파 블렌딩 방법을 사용해 보겠다. 일반적으로 위에서 설명한 수식대로 직접 구현해도 되고, cv2.addWeighted() 함수를 사용해도 된다.

import cv2
import matplotlib.pyplot as plt
import numpy as np

img1 = cv2.imread('imgs/man_face.jpg')
img2 = cv2.imread('imgs/lion_face.jpg')

alpha = 0.5
blended1 = (img1 * alpha) + (img2 * (1-alpha))              # 방식1
blended1 = blended1.astype(np.uint8) # 소수점 제거
blended2 = cv2.addWeighted(img1, alpha, img2, (1-alpha), 0) # 방식2

for i, img in enumerate([blended1, blended2]):
    plt.subplot(1,2,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(img[:, :, ::-1])
plt.show()

아래 결과 영상을 보면 alpha를 이용한 일반적인 연산을 통한 결과와 cv2.addWeighted() 함수를 이용한 결과가 같다. 위의 일반적인 덧셈에 비해 더욱 자연스러운 합성 결과가 나왔다.

참고자료

[도서] 파이썬으로 만드는 OpenCV 프로젝트

[OpenCV] 공식문서

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday