【问题标题】:Python OpenCV - apply colored mask to imagePython OpenCV - 将彩色蒙版应用于图像
【发布时间】:2018-06-06 08:57:25
【问题描述】:

我得到了以下东西:

  • 使用 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)

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

【问题讨论】:

    标签: python opencv


    【解决方案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)
    

    【讨论】:

    • 那么如何看待将彩色二进制掩码与图像相乘的整个代码?
    • 事情就是这样:您不再需要添加蒙版,因为您直接在图像上应用更改。什么算作掩码是作为参数传递的 [v,v,v]
    • 我不会。我只是提供了一种解决方法来实现您正在寻找的东西,而无需使用复杂库中的复杂函数。它涉及稍微改变你看待问题的方式,从而改变你的代码。如果您想不惜任何代价使用 Open CV,并且不更改代码行或尝试我刚刚发布的内容,那么我的解决方案不是您正在寻找的解决方案
    • 我想试试你的解决方案,问题是我只是不明白如何应用你的想法。我得到了三样东西:一个图像(3D RGB 数组)、一个掩码(2D 二进制)和一个颜色(一个 3 通道元组)。从这里开始,我如何应用你的代码?
    • 啊,好的,我明白你在做什么。您要应用的过滤器不是统一的,而是仅在“蒙面部分”上,对吗?我编辑我的答案
    猜你喜欢
    • 2012-05-15
    • 2023-03-04
    • 2017-11-16
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多