Python OpenCV - добавление альфа-канала в RGB-изображение

Каков наилучший способ конвертировать RGB-изображение в RGBA в python с помощью opencv?

Скажем, у меня есть один массив с формой

(185, 198, 3) - it is RGB

а другая - альфа-маска с формой (185, 198)

Как слить их и сохранить в файл?

Ответ 1

Вы можете использовать cv2.merge(), чтобы добавить альфа-канал к данному изображению RGB, но сначала вам нужно разделить изображение RGB на каналы R, G and B, как указано в документации:

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

  • mv - входной массив или вектор матриц для объединения; все матрицы в mv должны иметь одинаковый размер и одинаковую глубину.

И это можно сделать так:

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

Ответ 2

В opencv3 это должно работать:

# 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

Ответ 3

Вот еще один простой пример использования Grabcut, он помогает получить правильный порядок каналов при сохранении изображения на диске vs 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()