Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python OpenCV - add alpha channel to RGB image

Tags:

python

opencv

What is the best way to convert RGB image to RGBA in python using opencv?

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)

How to merge them and save to file?

like image 847
Oleg Avatar asked Aug 29 '15 19:08

Oleg


3 Answers

With opencv3, this should work:

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

# 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);
like image 184
kaanoner Avatar answered Oct 04 '22 22:10

kaanoner


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:

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

  • mv – input array or vector of matrices to be merged; all the matrices in mv must have the same size and the same depth.

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))
like image 27
ZdaR Avatar answered Oct 04 '22 22:10

ZdaR


Since OpenCV images are just Numpy arrays, you can do this in one-line, nice and fast with 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():

result = np.dstack((im, alpha))
like image 8
Mark Setchell Avatar answered Oct 04 '22 21:10

Mark Setchell