使用Python中的Opencv降低图像的不透明度

时间:2017-06-02 04:01:51

标签: python opencv image-processing opacity

在下面给出的程序中,我将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的新手,所以我可能会遗漏一些简单的东西。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

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

Alpha通常用于移除图像的不重要区域或将一个图像与另一个图像合并。在第一种情况下,图像通常简单地乘以其alpha。这有时被称为预乘。在这种情况下,alpha通道的暗区域会使RGB变暗,亮区域会使RGB保持不变。

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

以下是您的代码版本可能会执行您想要的操作(注意 - 我转换为32位,因为当它们的范围从0到1时,它更容易使用Alpha通道):

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()

尝试将图像覆盖在另一个图像上时使用第二种情况。这是一个合成操作,通常被称为" over"合并或"混合"合并。在这种情况下,有一个前景图像" A"和背景图像" B"和一个可以包含在RGB图像中或单独使用的alpha通道。在这种情况下,您可以使用以下方法将A放在B上:

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

答案 1 :(得分:1)

实际上,答案很简单。 OpenCV的fib2函数将忽略Alpha通道。

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

我还为1 here写了一个装饰器/增强功能,可帮助可视化透明图像。