【问题标题】:Reduce opacity of image using Opencv in Python在 Python 中使用 Opencv 降低图像的不透明度
【发布时间】:2017-06-02 04:01:51
【问题描述】:

在下面给出的程序中,我将 alpha 通道添加到 3 通道图像以控制其不透明度。但是无论我给出什么值的 alpha 通道都不会对图像产生影响!谁能解释一下为什么?

import numpy as np
import cv2

image = cv2.imread('image.jpg')
print image

b_channel,g_channel,r_channel = cv2.split(image)
a_channel = np.ones(b_channel.shape, dtype=b_channel.dtype)*10
image = cv2.merge((b_channel,g_channel,r_channel,a_channel))

print image
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

我可以在终端中看到添加了 alpha 通道,并且它的值随着我在程序中的更改而变化,但对图像本身的不透明度没有影响!

我是 OpenCV 的新手,所以我可能会遗漏一些简单的东西。感谢您的帮助!

【问题讨论】:

    标签: python opencv image-processing opacity


    【解决方案1】:

    Alpha 是用于控制图像不透明度的通道。除非您对其执行操作,否则 Alpha 通道通常不会执行任何操作。它本身不会使图像透明。

    Alpha 通常用于删除图像中不重要的区域或将一张图像与另一张图像组合。在第一种情况下,图像通常只是简单地乘以它的 alpha。这有时被称为预乘。在这种情况下,Alpha 通道的暗区会使 RGB 变暗,而亮区则保持 RGB 不变。

    R = R*A 
    G = G*A 
    B = B*A
    

    这是您的代码版本,可以满足您的需求(注意-我转换为 32 位,因为 Alpha 通道的范围为 0 到 1 时更容易使用):

    import numpy as np
    import cv2
    
    i = cv2.imread('image.jpg')
    img = np.array(i, dtype=np.float)
    img /= 255.0
    cv2.imshow('img',img)
    cv2.waitKey(0)
    
    #pre-multiplication
    a_channel = np.ones(img.shape, dtype=np.float)/2.0
    image = img*a_channel
    
    cv2.imshow('img',image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    第二种情况用于尝试将一张图片覆盖在另一张图片上。这是一种合成操作,通常称为“过度”合并或“混合”合并。在这种情况下,有一个前景图像“A”和一个背景图像“B”以及一个可以包含在 RGB 图像中或单独包含的 alpha 通道。在这种情况下,您可以使用以下命令将 A 放在 B 上:

    output = (A * alpha) + (B * (1-alpha))
    

    【讨论】:

    • 感谢您的快速回答和详细解释!我试过你的代码,它工作得很好:)
    【解决方案2】:

    其实,答案很简单。 OpenCV 的 imshow() 函数会忽略 alpha 通道。

    如果您想查看 Alpha 通道的效果,请将您的图像保存为 PNG 格式(因为它支持 Alpha 通道)并在不同的查看器中显示。

    我还为 imshow() here 编写了一个装饰器/增强功能,有助于可视化透明图像。

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2017-05-21
      相关资源
      最近更新 更多