第二篇:图片添加水印(加 logo)
1. 实验原理
水印原理:
- 图片添加水印是图像叠加的一种应用,分为透明水印和不透明水印。
- 水印的实现通常依赖于像素值操作,将水印图片融合到目标图片中,常用的方法包括:
- 位运算:通过掩码(Mask)将目标区域清空,再将水印叠加到清空的区域。
- Alpha 混合(Alpha Blending):通过加权计算将水印半透明地融合到目标图片。
步骤:
- 将水印图片转为灰度图,并通过阈值处理生成二值化掩码。
- 利用掩码清空背景图像中水印位置的区域。
- 将水印图片嵌入到清空区域,完成水印添加。
2. 实验代码
以下为具体代码实现:
import cv2# 读取背景图像
img = cv2.imread("./background.jpeg")# 读取两个 logo 图像
logo = cv2.imread("./logo.png")# --------------------处理第一个 logo--------------------# 将 logo 转换为灰度图像,用于后续的二值化处理
logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)# 对灰度图像进行二值化处理,生成二值掩码
_, logo_binary = cv2.threshold(logo_gray, # 输入的灰度图像0, # 阈值(自动确定)255, # 二值化后的最大值cv2.THRESH_BINARY_INV # 反阈值化,将前景变为黑色,背景变为白色
)# 定义第一个 logo 的插入位置 (x1, y1)
x1, y1 = 10, 100# 从背景图中截取一个与 logo 大小相同的 ROI(Region of Interest)区域
ROI = img[y1:y1+logo.shape[0], x1:x1+logo.shape[1]]# 使用掩码进行位与运算,将 ROI 中对应 logo 的位置清空
ROI_logo = cv2.bitwise_and(ROI, ROI, mask=logo_binary)# 将清空的 ROI 区域与 logo 图像进行加法操作,完成 logo 的融合
img_logo = cv2.add(ROI_logo, logo)# 将融合后的 logo 替换回背景图的对应位置
img[y1:y1+logo.shape[0], x1:x1+logo.shape[1]] = img_logo# --------------------显示最终结果--------------------# 显示最终结果图像
cv2.imshow('image', img)# 等待用户按键退出窗口
cv2.waitKey(0)# 销毁所有窗口
cv2.destroyAllWindows()
3. 实验现象
实验结果:
- 原始图片:背景图为一个没有水印的图片。
- 水印图像:Logo 被叠加到背景图的指定位置,与背景图的像素融合,看起来像是原始图像的一部分。