Python OpenCV - 将彩色蒙版应用于图像

时间:2018-06-06 08:57:26

标签: python opencv

我有以下几点:

  • 使用OpenCV(numpy数组)读取的图像
  • 与图像大小相同的二进制掩码
  • 一个颜色字符串,如'red''blue'

:在将面具添加到图像之前,如何为蒙版着色? 明确地说:如何在给定颜色字符串的情况下将颜色通道添加到二进制掩码

我知道如何添加蒙版(例如使用cv2.addWeighted(mask,alpha,image,1-alpha,0,image)),但我不知道如何使用简单的颜色“字符串”作为输入将二进制蒙版转换为颜色空间。我知道这可以在PIL中使用rgb = PIL.ImageColor.getrgb(color),但我不知道如何使用OpenCV做到这一点!

修改: 我设法获得通道元组(0,0,0)中的颜色,目前我的解决方法是:

mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2RGB)
mask[np.where((mask == [1,1,1]).all(axis = 2))] = color
cv2.addWeighted(mask,alpha,image,1-alpha,0,image)

但问题是,现在图像是灰度的,带有彩色地图...... 所以第一行需要交换

1 个答案:

答案 0 :(得分:1)

您可以使用更简单,更原生的方法。什么是滤色片,如果不是您在其中一个频道上应用的均匀移位?我通常只使用np.power。假设 img 是图像的3D RGB矩阵:

img = np.power(img,[1.5, 1.0, 1.0]) # shift the reds
img = np.power(img,[1.0, 1.5, 1.0]) # shift the greens
img = np.power(img,[1.2, 1.2, 1.0]) # orange type? (I suck at color mixing, you'll find out the one you need to shift) (since all your colors are made from a combination of these three basic ones)

当我发现这个技巧时,我刚刚停止使用openCV和PIL(顺便提一下,看看skimage

要仅在屏蔽部分应用过滤器,您可以执行以下操作:

mask =  numpy.expand_dims(mask, 2) 
mask = numpy.repeat(mask, 3, axis=2) # give the mask the same shape as your image
colors = {"red": [0.1,0.,0.], "blue": [0.,0.,0.1]} # a dictionary for your colors, experiment with the values
colored_mask = numpy.multiply(mask, colors["red"])  # broadcast multiplication (thanks to the multiplication by 0, you'll end up with values different from 0 only on the relevant channels and the right regions)
img = img+colored_mask # element-wise sum (sinc img and mask have the same shape)