2017-06-02 232 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

相關問題