简体   繁体   English

python OpenCV - 添加 alpha 通道到 RGB 图像

[英]python OpenCV - add alpha channel to RGB image

What is the best way to convert RGB image to RGBA in python using opencv?使用 opencv 在 python 中将 RGB 图像转换为 RGBA 的最佳方法是什么?

Let's say I have one array with shape假设我有一个具有形状的数组

(185, 198, 3) - it is RGB

and the other is alpha mask with shape (185, 198)另一个是形状为(185, 198)的 alpha 蒙版

How to merge them and save to file?如何合并它们并保存到文件?

With opencv3, this should work:使用 opencv3,这应该可以工作:

Python Python

# 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

C++ C++

# First create the image with alpha channel
cv::cvtColor(rgb_data, rgba , cv::COLOR_RGB2RGBA);

# Split the image for access to alpha channel
std::vector<cv::Mat>channels(4);
cv::split(rgba, channels);

# Assign the mask to the last channel of the image
channels[3] = alpha_data;

# Finally concat channels for rgba image
cv::merge(channels, 4, rgba);

You may use cv2.merge() to add the alpha channel to the given RGB image, but first you need to split the RGB image to R, G and B channels, as per the documentation :您可以使用cv2.merge()将 alpha 通道添加到给定的 RGB 图像,但首先您需要根据文档将 RGB 图像拆分为R, G and B通道:

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

  • mv – input array or vector of matrices to be merged; mv – 要合并的矩阵的输入数组或向量; all the matrices in mv must have the same size and the same depth. mv 中的所有矩阵必须具有相同的大小和相同的深度。

And this can be done as:这可以通过以下方式完成:

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

Here is an another simple example using Grabcut, it helps to get the right order of channels when saving the image on disk vs pyplot .这是另一个使用 Grabcut 的简单示例,它有助于在将图像保存在磁盘与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()

Since OpenCV images are just Numpy arrays, you can do this in one-line, nice and fast with Numpy.由于 OpenCV 图像只是 Numpy 数组,因此您可以使用 Numpy 在一行中完成此操作,又好又快。 So here is the setup code:所以这是设置代码:

import numpy as np

# We'll synthesise a random image and a separate alpha channel full of 128 - semitransparent
im    = np.random.randint(0,256,(480,640,3), dtype=np.uint8)
alpha = np.full((480,640), 128, dtype=np.uint8)

And here is the solution which is simply to stack the alpha channel onto the image in the "depth" axis, hence dstack() :这是解决方案,它只是将 alpha 通道堆叠到“深度”轴上的图像上,因此dstack()

result = np.dstack((im, alpha))

I'll post here my answer in C++ since it may be helpful to others (there are already enough answers in python):我将在 C++ 中发布我的答案,因为它可能对其他人有帮助(python 中已经有足够的答案):

  std::vector<cv::Mat> matChannels;
  cv::split(mat, matChannels);
  
  // create alpha channel
  cv::Mat alpha(...);
  matChannels.push_back(alpha);

  cv::merge(matChannels, dst);
import cv2
import numpy as np
import skimage.exposure



path_input_image="./input_image.png"


input_image = cv2.imread(path_input_image2, cv2.IMREAD_UNCHANGED)


input_image_alphachann = np.full((input_image.shape[0],input_image.shape[1]), 128, dtype=np.uint8)

output_image = np.dstack((input_image, input_image_alphachann))


print(input_image.shape)
print(output_image.shape)
#(400, 200, 3); 3 channell rgb
#(400, 200, 4); 4c channel rgba



print(input_image.dtype)
print(output_image.dtype)
# uint8




path_output_image=path_input_image+'.alpha.png'
cv2.imwrite(path_output_image, output_image)

如何在打开的简历中添加Alpha Cheel或将其透明度值设置为255

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM