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()
를 사용하는 것임.
\[ \text{dst}(x,y) = \alpha \cdot \text{src1}(x,y) + \beta \cdot \text{src2}(x,y) + \gamma \]
Parameters:¶
src1
: 첫 번째 입력 이미지 또는 배열.alpha
: 첫 번째 이미지의 가중치.src2
: 두 번째 입력 이미지 또는 배열. 첫 번째 이미지와 동일한 크기 및 데이터 타입이어야 합니다.beta
: 두 번째 이미지의 가중치.gamma
: 이 값은 결과 이미지에 더해지는 상수입니다. 밝기 조정에 사용할 수 있습니다.dst
: (선택 사항) 결과 이미지를 저장할 배열입니다. 기본값은None
으로, 새로운 배열이 생성됩니다.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()