Python OpenCV – agrega canal alfa a la imagen RGB

¿Cuál es la mejor manera de convertir una imagen RGB a RGBA en python usando opencv?

Digamos que tengo una matriz con forma

(185, 198, 3) - it is RGB 

y la otra es máscara alfa con forma (185, 198)

¿Cómo fusionarlos y guardarlos en archivo?

Puede usar cv2.merge() para agregar el canal alfa a la imagen RGB dada, pero primero debe dividir la imagen RGB en R, G and B canales R, G and B , según la documentación :

Python: cv2.merge (mv [, dst])

  • mv – matriz de entrada o vector de matrices a fusionar; Todas las matrices en mv deben tener el mismo tamaño y la misma profundidad.

Y esto se puede hacer como:

 b_channel, g_channel, r_channel = cv2.split(img) alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 50 #creating a dummy alpha channel image. img_BGRA = cv2.merge((b_channel, g_channel, r_channel, alpha_channel)) 

Con opencv3, esto debería funcionar:

 # First create the image with alpha channel rgba = cv2.cvtColor(rgb_data, cv2.COLOR_RGB2RGBA) # Then assign the mask to the last channel of the image rgba[:, :, 3] = alpha_data 

Aquí hay otro ejemplo simple que usa Grabcut, que ayuda a obtener el orden correcto de los canales al guardar la imagen en el disco en comparación con la pyplot .

 from matplotlib import pyplot as plt import numpy as np import cv2 img = cv2.imread('image.jpg') mask = np.zeros(img.shape[:2], np.uint8) bgdModel = np.zeros((1,65), np.float64) fgdModel = np.zeros((1,65), np.float64) rect = (50, 50, 450, 290) # Grabcut cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT) r_channel, g_channel, b_channel = cv2.split(img) a_channel = np.where((mask==2)|(mask==0), 0, 255).astype('uint8') img_RGBA = cv2.merge((r_channel, g_channel, b_channel, a_channel)) cv2.imwrite("test.png", img_RGBA) # Now for plot correct colors : img_BGRA = cv2.merge((b_channel, g_channel, r_channel, a_channel)) plt.imshow(img_BGRA), plt.colorbar(),plt.show()