OpenCV水印总是白色

OpenCV Watermark Always comes out White

我想在我的图片上加一个紫色水印,但由于某种原因它总是显示为白色。我正在使用 cv2.addWeighted。它在这张图片上几乎看不见,但我也需要它来处理大部分白色图片。

原图和水印如下:

这是 cv2.addWeighted(img_bottom_right, 1, watermark, 1, 0) 之后的结果(在右下角):

为什么会这样,我该怎么做才能像下面这样?

我通过检查紫色并复制像素而不是添加来制作最后一个,这是非常低效的。

我用另一个徽标进行了测试,看看是否是这个问题,但结果也很褪色。

您要做的是根据 PNG 的 Alpha 通道在两个图像之间进行混合。徽标越不透明,您就需要更多徽标,而透明度越高,您就需要更多图像。这可以简单地用操作 img1 * alpha + img2 * (1 - alpha) 来表示。一方面,这似乎类似于 cv.addWeighted(),您可以在其中指定 beta = 1 - alpha。但是 cv.addWeighted() 有一个常量 alpha/beta,其中 PNG 图像中的每个像素都有一个 alpha 值。因此您只需要手动计算它而不是将其传递给函数。

如果您使用 cv.IMREAD_UNCHANGED 读入您的徽标图像,那么您将得到一个四通道 BGRA 图像,其中第四个通道是 alpha 通道(透明度)。如果您随后将该图像设置为与您希望添加水印的图像相同的大小,那么您的代码可以看起来像这样(mark 是具有与 [=17= 相同的 h/w 的 4 通道图像]):

colormark = mark[..., :3]
alpha = mark[..., 3:] / 255
marked = np.uint8(img * (1 - alpha) + colormark * alpha)

小注:我使用 alpha = mark[..., 3:] 而不是 mark[..., 3],因此 alpha 通道形状是 (h, w, 1) 而不是 (h, w),这只允许进行数学运算针对 3 通道图像进行广播。