我认为你更需要的是渐变透明融合而不是Fred的回答中展示的简单阈值透明。
我制作了一个带有透明度渐变的样本图像进行测试。这是一个正常的图像,并在一个像Photoshop一样显示透明度的棋盘上进行混合:
![进入图像描述](https://istack.dev59.com/roiU6.webp)
![进入图像描述](https://istack.dev59.com/qNTP5.webp)
要进行alpha混合,使用以下公式:
result = alpha * Foreground + (1-alpha)*Background
这里的值都是浮点数,范围在0到1之间。
混合黑色和白色背景的代码如下:
import cv2
import numpy as np
im = cv2.imread('GradientAlpha.png', cv2.IMREAD_UNCHANGED)
BGR = im[...,0:3].astype(np.float)/255
A = im[...,3].astype(np.float)/255
bg = np.zeros_like(BGR).astype(np.float)
fg = A[...,np.newaxis]*BGR
bg = (1-A[...,np.newaxis])*bg
res = cv2.add(fg, bg)
res = (res*255).astype(np.uint8)
cv2.imwrite('OverBlack.png', res)
bg = np.zeros_like(BGR).astype(np.float)+1
fg = A[...,np.newaxis]*BGR
bg = (1-A[...,np.newaxis])*bg
res = cv2.add(fg, bg)
res = (res*255).astype(np.uint8)
cv2.imwrite('OverWhite.png', res)
在黑色背景上的效果如下:
![enter image description here](https://istack.dev59.com/I7L3r.webp)
在白色背景上的效果如下:
![enter image description here](https://istack.dev59.com/30nff.webp)
关键词: 图像处理,Python,OpenCV,alpha通道,alpha混合,alpha合成,叠加。