【问题标题】:OpenCV Watermark Always comes out WhiteOpenCV 水印总是出现白色
【发布时间】:2020-12-29 21:39:04
【问题描述】:

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

这是原图和水印:

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

为什么会发生这种情况,我该怎么做才能得到如下结果?

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

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

【问题讨论】:

  • 结果是白色的,因为您将它们都添加为 1 的权重,这使得结果 > 255(将被剪裁为 255,即白色)。此外,绿色/紫色是相反的颜色,因此即使您将它们平均或其他颜色,它也会是灰色的,而不是紫色的。

标签: python python-3.x opencv image-processing watermark


【解决方案1】:

您要做的是根据 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 具有相同硬件的 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 通道进行广播图片。

【讨论】:

  • 谢谢!我使用的是 4 个通道,只是假设 addWeighted 会使用 alpha,但现在有意义了!
猜你喜欢
  • 2021-12-25
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2021-11-17
相关资源
最近更新 更多