2017-06-02 284 views
0

在下面给出的程序中,我将alpha通道添加到3通道图像来控制其不透明度。但是,无论我给出的alpha通道的值如何,都不会影响图像!任何人都能解释我为什么?使用Python中的Opencv降低图像的不透明度

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

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图像中或其自身的α通道。在这种情况下,您可以将A置于B上使用:

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

感谢您的快速回答和详细解释!我试过你的代码,它工作得很好:) – Ank