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

python - 模仿Photoshop的图层蒙版-LMLPHP

python - 模仿Photoshop的图层蒙版-LMLPHP

结果:

python - 模仿Photoshop的图层蒙版-LMLPHP

注意褪色的区域。基本上,我试图模仿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)

我想这可能无关紧要,因为层掩膜可能不需要阈值。

最佳答案

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

python - 模仿Photoshop的图层蒙版-LMLPHP

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()

10-07 13:38
查看更多