Каков наилучший способ конвертировать RGB-изображение в RGBA в python с помощью opencv?
Скажем, у меня есть один массив с формой
(185, 198, 3) - it is RGB
а другая - альфа-маска с формой (185, 198)
Как слить их и сохранить в файл?
Каков наилучший способ конвертировать RGB-изображение в RGBA в python с помощью opencv?
Скажем, у меня есть один массив с формой
(185, 198, 3) - it is RGB
а другая - альфа-маска с формой (185, 198)
Как слить их и сохранить в файл?
Вы можете использовать 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))
В 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
Вот еще один простой пример использования 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()