Python 使用遮罩创建彩色背景-在遮罩为真的情况下无法指定3个输入值时出现错误

Python 使用遮罩创建彩色背景-在遮罩为真的情况下无法指定3个输入值时出现错误,python,numpy,opencv,Python,Numpy,Opencv,我正试图创建一个RGB背景颜色周围的头部,我已蒙面 mask = np.ones(image.shape) mask = cv2.drawContours(mask, [c], -1, 0, cv2.FILLED) output = image.copy() output[mask != 0] = (255,0,0) 但我得到了以下错误: ValueError: NumPy boolean array indexing assignment cannot assign 3 input va

我正试图创建一个RGB背景颜色周围的头部,我已蒙面

mask = np.ones(image.shape)
mask = cv2.drawContours(mask, [c], -1, 0, cv2.FILLED)

output = image.copy()
output[mask != 0] = (255,0,0)

但我得到了以下错误:

ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 143184 output values where the mask is true
当使用单个输入时,它工作:

mask = np.ones(image.shape)
mask = cv2.drawContours(mask, [c], -1, 0, cv2.FILLED)

output = image.copy()
output[mask != 0] = 0

并给出正确的掩蔽:

然而,我理想情况下希望背景是红色的,这样当我以后使背景透明时,它不会影响脸上的任何东西


非常感谢您的帮助

简单回答:制作
mask
单通道

mask = np.ones(image.shape[:2])
说明:

这是因为您的
遮罩
图像
的形状相同,并且您试图用三个值替换每个值。若要每三个值替换一个值,则应构建一个查询,该查询将为每个操作提供三个值的访问权限

在代码
中,输出[mask!=0]=anything
放置
anything
,而不是每个通道的每个值,但前提是它符合形状


假设您的图像是400x300像素RGB(或BGR,任何有3个通道的图像),那么它的形状是400x300x3。由于遮罩的形状相同,因此条件
mask!=0
指向每个通道的每个值。当遮罩为单通道时,条件完全指向每个像素,然后您可以用3个所需的值替换3个现有值(仍保持形状)。

非常感谢您,这是有效的,您的解释清楚地解释了我的错误所在。