如何解决OpenCV 水印总是出现白色
我正在尝试在我的图像上添加紫色水印,但由于某种原因它总是显示为白色。我正在使用 cv2.addWeighted。它在这张图片上几乎看不到,但我也需要它来处理大部分白色图片。
这是原始图像和水印:
这是在 cv2.addWeighted(img_bottom_right,1,watermark,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
是与 img
具有相同 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 通道图像。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。