模仿Photoshop的图层蒙版

时间:2019-07-17 07:14:26

标签: python opencv opencv3.0

我正在尝试使用遮罩去除图像的背景,其中像素的alpha值与黑色强度成正比。例如,给定以下输入图像和蒙版,结果包含“褪色”区域:

enter image description here

enter image description here

结果:

enter image description here

请注意褪色的区域。基本上,我试图模仿Photoshop中的图层蒙版功能。

我可以使用二进制阈值将蒙版转换为alpha,但是我想知道如何使alpha与比例成比例。二进制阈值的代码如下:

    mask = cv2.imread(mask_path, 0)
    mask2 = np.where(mask<50, 0, 1).astype('uint8')

    img = img * mask2[:, :, np.newaxis]

    _, alpha = cv2.threshold(mask2, 0, 255, cv2.THRESH_BINARY)

    png = np.dstack((img, alpha))
    cv2.imwrite(dest_path, png)

我想这可能是不相关的,因为可能不需要层掩膜的阈值。

1 个答案:

答案 0 :(得分:0)

我不确定这是否是您想要的,但是您可以通过从图像中减去蒙版的值来获得比例效果。这意味着您必须反转遮罩,因此要删除的Alpha数量为白色。对于subtract(),输入数组必须具有相同的大小,因此请将反转的掩码转换为3个颜色通道。如果蒙版的大小不等于背景图像,则首先必须创建一个子图像。

enter image description here

import cv2 
import numpy as np

# load background image
img = cv2.imread('grass.jpg')
# load alpha mask as grayscale
mask = cv2.imread('a_mask.jpg',0)
# invert mask and convert to 3 color channels
mask = cv2.bitwise_not(mask)
fullmask = cv2.cvtColor(mask,cv2.COLOR_GRAY2BGR)

# create a subimage with the size of the mask
xOffset = 30
yOffset = 30
height, width = mask.shape[:2]
subimg = img[yOffset:yOffset+height,xOffset:xOffset+width]

#subtract mask values from subimage
res = cv2.subtract(subimg,fullmask)

# put subimage back in background
img[yOffset:yOffset+height,xOffset:xOffset+width] = res

#display result
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()