I want to convert PNG and GIF images to JPEG using openCV, the alpha channel should be converted to white color. is there any way to achive this ?
in RGBA images, alpha channel represent how background will effect in image. so you have an equation (not code) like this:
out = (bg * (1 - alpha)) + (image * alpha)
where out is final image and image is R,G and B channel of our RGBA image and bg is background image. here we have 0 <= alpha <= 1.
for your case, you want your background to be a plane white image so the calculation is very simple from this point. you can do something like this:
B, G, R, A = cv2.split(image)
alpha = A / 255
R = (255 * (1 - alpha) + R * alpha).astype(np.uint8)
G = (255 * (1 - alpha) + G * alpha).astype(np.uint8)
B = (255 * (1 - alpha) + B * alpha).astype(np.uint8)
image = cv2.merge((B, G, R))
and if you don't like this split and merge stuff (like me) you can use this implimentation:
bg = np.array([255, 255, 255])
alpha = (image[:, :, 3] / 255).reshape(image.shape[:2] + (1,))
image = ((bg * (1 - alpha)) + (image[:, :, :3] * alpha)).astype(np.uint8)
in first line i make background image, in second line i compute the alpha value between 0 and 1 and reshape it to make it 3-D array (it is necessary for multiplication) and the last line is the formula of alpha.
Using Open CV, you can open the image in RGB format, i.e, when you are doing an cv2.imread give the second parameter as 1 instead of -1. -1 opens the image in whatever be the original format of the image , i.e, it would retain the transparency. Keeping that parameter as 1 you can open it in RGB format. After that you can do an cv2.imwrite to save the RGB image without transparency. You can mention the file format as .jpg
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With