Skip to content

Image Blending (or alpha Blending)

이것도 이미지 더하기 의 일종이지만,

  • 이미지에 다른 가중치(\(\alpha\))를 부여하여
  • Blending 또는 transparency (투명감) 느낌을 부여함.

이는 아래 수식에 따라 더해짐:

\[ g(i,j) = (1-\alpha) \text{b} (i,j) + \alpha \text{f} (i,j) \]

\(\alpha\)를 0에서 1까지 변화시키면, 한 이미지에서 다른 이미지로 멋진 전환 효과를 수행할 수도 있음.


\(\alpha\)를 scalar 하나로 사용하여 일종의 투명도 처럼 사용하기 위해서는
cv2.addWeight()를 사용하는 것임.

cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
\[ \text{dst}(x,y) = \alpha \cdot \text{src1}(x,y) + \beta \cdot \text{src2}(x,y) + \gamma \]

Parameters:

  1. src1: 첫 번째 입력 이미지 또는 배열.
  2. alpha: 첫 번째 이미지의 가중치.
  3. src2: 두 번째 입력 이미지 또는 배열. 첫 번째 이미지와 동일한 크기 및 데이터 타입이어야 합니다.
  4. beta: 두 번째 이미지의 가중치.
  5. gamma: 이 값은 결과 이미지에 더해지는 상수입니다. 밝기 조정에 사용할 수 있습니다.
  6. dst: (선택 사항) 결과 이미지를 저장할 배열입니다. 기본값은 None으로, 새로운 배열이 생성됩니다.
  7. dtype: (선택 사항) 출력 이미지의 데이터 타입입니다. 기본값은 입력 이미지와 동일한 데이터 타입입니다.

예제

import os
import cv2
import numpy as np

d_path = os.path.dirname(__file__)
d_path = f'{d_path}/img'
fstr_bg = os.path.join(d_path,'ml.png')
fstr_fg = os.path.join(d_path,'opencv-logo0.png')

def show_imgs(ax, title, img):
    ax.imshow(img[...,::-1])
    ax.set_title(title)
    ax.set_xticks([]); ax.set_yticks([])


bg = cv2.imread(fstr_bg)
fg = cv2.imread(fstr_fg)
print(fg.shape)
bg = cv2.resize(bg, dsize=fg.shape[1::-1], interpolation= cv2.INTER_AREA)

dst = cv2.addWeighted(bg,0.7, fg,0.3,0)

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


다음은 Alpha 채널이 있는 png파일을 fg로 사용하면서 alpha channel로 투명배경 처리와 함께,
투명도(transparency)를 0.7로 사용하는 code임.

아래의 코드가 위의 경우와 차이는 alpha 채널을 이용하여 투명배경을 처리하고 있음.

  • OpenCV 마크가 alpha channel이 있는 PNG 이미지임.

import os
import cv2
import numpy as np

d_path = os.path.dirname(__file__)
d_path = f'{d_path}/img'

fstr_bg = os.path.join(d_path,'ml.png')
fstr_fg = os.path.join(d_path,'opencv-logo.png')
bg = cv2.imread(fstr_bg)
fg = cv2.imread(fstr_fg,cv2.IMREAD_UNCHANGED)
bg = cv2.resize(bg, dsize=fg.shape[1::-1], interpolation=cv2.INTER_AREA)

transparency = 0.7
bgr   = fg[...,:3]
alpha = fg[...,3]/255.
alpha = alpha[..., np.newaxis] * (1-transparency)

ret = bgr * alpha + bg * (1.-alpha)
ret = cv2.convertScaleAbs(ret)

cv2.imshow('img', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()