使用遮罩创建彩色背景-出现错误,无法在遮罩为true的情况下分配3个输入值

时间:2020-09-27 10:15:09

标签: 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 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

并提供正确的遮罩:

masking

但是,理想情况下,我希望将背景设置为红色,以便以后再使背景透明时,不会影响脸部任何东西。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

简单的答案:将mask单通道化。

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

说明:

这是因为您的maskimage的形状相同,并且您尝试将每个值替换为三个。如果要替换每三个值,则应构建查询以允许每个操作访问三个。

在您的代码中,output[mask != 0] = anything放置anything而不是每个通道的每个值,但前提是要适合形状。

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