2017-06-02 1 views
0

Dans le programme ci-dessous, j'ajoute un canal alpha à une image à 3 canaux pour contrôler son opacité. Mais peu importe la valeur du canal alpha que je donne, il n'y a aucun effet sur l'image! N'importe qui pourrait m'expliquer pourquoi?Réduire l'opacité de l'image en utilisant Opencv en Python

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

Je peux voir dans le terminal que canal alpha est ajoutée et ses changements de valeur que je change dans le programme, mais il n'y a pas d'effet sur l'opacité de l'image elle-même! Je suis novice en OpenCV et il me manque peut-être quelque chose de simple. Merci pour l'aide! Alpha est un canal qui est utilisé pour contrôler l'opacité d'une image.

Répondre

2

Une couche alpha ne fait généralement rien sauf si vous effectuez une action dessus. Cela ne rend pas une image transparente par elle-même. Alpha est généralement utilisé pour supprimer des zones sans importance d'une image ou pour combiner une image avec une autre image. Dans le premier cas, l'image est généralement simplement multipliée par son alpha. On parle parfois de prémultiplication. Dans ce cas, les zones sombres du canal alpha assombrissent le RVB et les zones claires laissent le RVB intact.

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

Voici une version de votre code qui pourrait faire ce que vous voulez (Note- je me suis converti à 32 bits, car il est plus facile d'utiliser les canaux alpha quand ils sont rangés de 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() 

Le deuxième cas est utilisé lorsque vous essayez de superposer une image sur une autre image. Il s'agit d'une opération de composition souvent appelée fusion "over" ou fusion "blend". Dans ce cas, il y a une image de premier plan "A" et une image de fond "B" et un canal alpha qui pourrait être inclus dans les images RVB ou seul. Dans ce cas, vous pouvez placer A sur B en utilisant:

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

Merci pour votre réponse rapide et explication détaillée! J'ai essayé votre code et ça a bien fonctionné :) – Ank