Guardar PNG transparente como JPEG sobre fondo blanco
Digamos que tengo una imagen BGRA como numpy
matriz que se parece mucho a esto:
[[[233 228 230 128]
[233 228 230 128]
[233 228 230 0]
...
[164 160 159 65]
[199 197 196 65]
[255 255 254 120]]
Eso parece bastante sencillo: tres canales de color + un alfa que controla la transparencia de los píxeles. Guardar esa matriz numpy en formato PNG da como resultado una imagen que es semitransparente como debería ser.
Sin embargo, al guardarlo como JPEG, el canal alfa se elimina por completo y todos los píxeles son completamente opacos.
Como JPEG no admite transparencia alfa, me gustaría que mi imagen semitransparente (la matriz numpy de arriba) se guarde en un fondo blanco. De esa forma, parecería que los píxeles seguirían siendo semitransparentes.
¿Cómo puedo superponer la matriz numpy semitransparente sobre un fondo completamente blanco? Estoy usando principalmente numpy y OpenCV.
Respuestas
Creo que está buscando más una combinación alfa graduada que el umbral alfa más simple que la respuesta de Fred demuestra muy bien.
Hice una imagen de muestra con un gradiente alfa en el medio con fines de prueba. Aquí está como una imagen normal y compuesta sobre un tablero de ajedrez para mostrar la transparencia como lo hace Photoshop:


Para hacer una mezcla alfa, usa la fórmula:
result = alpha * Foreground + (1-alpha)*Background
donde los valores son todos flotantes escalados en el rango 0..1
El código para mezclar sobre fondo negro y luego blanco es el siguiente:
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image, including gradient alpha layer
im = cv2.imread('GradientAlpha.png', cv2.IMREAD_UNCHANGED)
# Separate BGR channels from A, make everything float in range 0..1
BGR = im[...,0:3].astype(np.float)/255
A = im[...,3].astype(np.float)/255
# First, composite image over black background using:
# result = alpha * Foreground + (1-alpha)*Background
bg = np.zeros_like(BGR).astype(np.float) # black background
fg = A[...,np.newaxis]*BGR # new alpha-scaled foreground
bg = (1-A[...,np.newaxis])*bg # new alpha-scaled background
res = cv2.add(fg, bg) # sum of the parts
res = (res*255).astype(np.uint8) # scaled back up
cv2.imwrite('OverBlack.png', res)
# Now, composite image over white background
bg = np.zeros_like(BGR).astype(np.float)+1 # white background
fg = A[...,np.newaxis]*BGR # new alpha-scaled foreground
bg = (1-A[...,np.newaxis])*bg # new alpha-scaled background
res = cv2.add(fg, bg) # sum of the parts
res = (res*255).astype(np.uint8) # scaled back up
cv2.imwrite('OverWhite.png', res)
Eso le da a esto sobre el negro:

Y esto sobre blanco:

Palabras clave : procesamiento de imágenes, Python, OpenCV, alfa, combinación alfa, composición alfa, superposición.
En Python OpenCV Numpy, puede separar el canal alfa de la imagen. Entonces, si imgA es la imagen con canal alfa. Luego, separe la imagen rgb (img) y el canal alfa (alfa)
img = imgA[:,:,0:3]
alpha = imgA[:,:,3]
Luego establezca el color de img en blanco donde el alfa es negro
img[alpha == 0] = (255,255,255)