vfx-9 / python_core /processing /compositing.py
TaqiRaza512's picture
Initial commit
a103028
import numpy as np
# --------------------------------------------------------------------------------
def scale_depth(depth, img):
img_sc = np.zeros(img.shape).astype(img.dtype)
for i in range(img.shape[-1]):
img_sc[:,:,i] = depth * img[:,:,i]
return img_sc
# --------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------------------------------------
def blend_fg_bg(bg_img, fg_img, bg_depth, fg_depth):
# Blends subject and background using lightwraping technique
depth = bg_depth
SEG_THRESH = 200
# ksize = 5
# kernel = cv2.getStructuringElement(cv2.MORPH_ERODE, (ksize, ksize))
# depth_erode = cv2.erode(fg_depth.copy(), kernel, iterations=1)
# Define background border around subject
# border = fg_depth - depth_erode
# bg_border = bg_img.copy()
# bg_border[border < 50] = 0
# bg_border = cv2.GaussianBlur(bg_border, (5, 5), 1)
# Add weighted border to to subject
# added_fg_img = cv2.addWeighted(bg_border, 0.3, fg_img, 0.7, 0)
fg_matte = fg_depth.astype(np.float64) / 255.
inv_fg_matte = 1 - fg_matte
# Scale foreground and background by depth values and then add.
blended_fg = scale_depth(fg_matte, fg_img)
blended_bg = scale_depth(inv_fg_matte, bg_img)
blended = blended_bg + blended_fg
blended_img = blended.astype(np.uint8)
# Get total depth by combining both foreground and background depth/seg maps.
if depth is not None:
depth[fg_depth > SEG_THRESH] = fg_depth[fg_depth > SEG_THRESH]
return blended_img, depth
# ---------------------------------------------------------------------------------------------------------------