我想添加一个半透明矩形填充一个纯色到一个已经加载的半透明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。任何帮助都将不胜感激
正如unlut指出的,这确实是一个重复。为了防止有人无意中发现,马克·塞切尔的回答非常有效:
alpha混合的简单操作: https://learnopencv.com/alpha-blending-using-opencv-cpp-python/
相关问题 更多 >
编程相关推荐