在数字图像处理领域,为图片添加水印是一项常见的任务,它既可以用于版权保护,也可以用于品牌宣传。
图片添加水印的基本原理是将一个较小的图像(水印)嵌入到另一个较大的图像(原图)中。这个过程通常涉及以下几个步骤:
- 读取图像:首先,我们需要读取原图和水印图像。
- 水印预处理:为了更好地将水印融合到原图中,我们可能需要对水印图像进行一些预处理,如转换为灰度图、二值化等。
- 计算掩膜:通过二值化处理,我们可以得到一个水印图像的掩膜,这个掩膜将用于确定水印图像中的哪些部分应该被保留,哪些部分应该被忽略。
- 图像融合:最后,我们使用图像融合技术将水印图像和原图结合起来,生成带有水印的新图像。
实验代码
下面是使用OpenCV库为图片添加水印的完整代码:
import cv2# 1. 读取原图
image_np = cv2.imread("bgc.jpeg")# 检查原图是否成功加载
if image_np is None:print("Error: Original image not found.")exit()# 2. 读取水印图,包含alpha通道
logo = cv2.imread("./tm1.png", cv2.IMREAD_UNCHANGED)# 分离BGR和Alpha通道
b, g, r, a = cv2.split(logo)# 合并BGR通道为灰度图
gray_logo = cv2.merge((b, g, r))
gray_logo = cv2.cvtColor(gray_logo, cv2.COLOR_BGR2GRAY)# 3. 水印图二值化,得到logo的掩膜(有效区域为白,背景为黑)
ret, mask_logo = cv2.threshold(gray_logo, 10, 255, cv2.THRESH_BINARY)
mask_logo_inv = cv2.bitwise_not(mask_logo)# 4. 根据掩膜在原图上添加水印
rows, cols = logo.shape[:2]
roi = image_np[0:rows, 0:cols]# 在原图的ROI上使用掩膜“挖空”
img_masked = cv2.bitwise_and(roi, roi, mask=mask_logo_inv)# 只取水印的非透明部分
logo_rgb = logo[:, :, :3]# 使用掩膜和alpha通道合并水印和原图
dst = cv2.add(img_masked, cv2.bitwise_and(logo_rgb, logo_rgb, mask=mask_logo))# 更新原图
image_np[0:rows, 0:cols] = dst# 5. 显示并保存结果
cv2.imshow("Watermarked Image", image_np)
cv2.waitKey(0)
cv2.destroyAllWindows()# 保存添加水印后的图像
cv2.imwrite("watermarked_image.png", image_np)
实验现象
- 原图显示:首先,代码会读取并显示原图,这是一张未经任何处理的原始图像。
- 水印图处理:接着,代码会读取并处理水印图像,包括转换为灰度图和二值化处理。处理后的水印图像将用于生成掩膜。
- 掩膜显示:代码会显示生成的掩膜图像,这是一个二值化后的图像,其中水印的有效区域为黑色,背景为白色。
- 水印添加:使用掩膜和原图进行图像融合,将水印添加到原图中。这个过程会根据掩膜来确定水印图像中的哪些部分应该被保留到最终图像中。
- 结果显示:最后,代码会显示添加水印后的图像,并可以选择将其保存到磁盘上。
注意事项
- 水印图像的选择:水印图像应该是一个较小的图像,这样它才不会过于突兀地覆盖原图。
- 阈值的调整:在进行二值化处理时,阈值的选择非常重要。如果阈值设置得太高或太低,都可能导致水印图像的部分内容丢失或保留过多的背景信息。
- 图像融合的方式:本文使用了简单的
cv2.add
函数进行图像融合。在实际应用中,还可以根据需求选择其他融合方式,如加权融合、透明度融合等。