我正在尝试使用遮罩去除图像的背景,其中像素的alpha值与黑色强度成正比。例如,给定以下输入图像和蒙版,结果包含“褪色”区域:
结果:
请注意褪色的区域。基本上,我试图模仿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)
我想这可能是不相关的,因为可能不需要层掩膜的阈值。
答案 0 :(得分:0)
我不确定这是否是您想要的,但是您可以通过从图像中减去蒙版的值来获得比例效果。这意味着您必须反转遮罩,因此要删除的Alpha数量为白色。对于subtract()
,输入数组必须具有相同的大小,因此请将反转的掩码转换为3个颜色通道。如果蒙版的大小不等于背景图像,则首先必须创建一个子图像。
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()