我想在已经加载的半透明PNG图片上添加一个填充了纯色的半透明矩形。这是我使用的示例输入图像:
该图像使用标准的cv2.IMREAD_UNCHANGED
标志加载,以便完全保留 Alpha 通道。该输入图像存储在 image
变量中。
以下是迄今为止我所编写的代码:
# get image dimensions
imgHeight, imgWidth = image.shape[:2]
# create empty overlay layer with 4 channels
overlay = np.zeros((imgHeight, imgWidth, 4), dtype = "uint8")
# draw semi-transparent red rectangle
overlay[200:300, 0:imgWidth] = (0, 0, 255, 200)
# extract alpha channel from overlay
alpha = cv2.split(overlay)[3]
# compute mask
mask = (np.multiply(alpha, 1.0 / 255))[:, :, np.newaxis]
# blend input image and overlay
output = cv2.convertScaleAbs(overlay * mask + image * (1 - mask))
这是我得到的结果:
乍一看它看起来还可以接受。我们在输入图像中有一个半透明矩形。然而,仔细观察后,我们可以观察到 alpha 通道混合时的奇怪行为(用箭头标记):
似乎完全没有混合 alpha,这导致原始图像像素只能是完全不透明或完全透明。
也许我的方法并不理想,用于将透明的 PNG 图像与半透明的形状混合。顺便说一下,我确实尝试过 cv2.addWeighted
方法,但结果更糟糕了。
我希望解决方案局限于 OpenCV 和/或 Numpy。非常感谢任何帮助。