1.准备两张图片(一个原图,一个要添加的水印)


2.原理解析
要给一张img添加watermark,我们需要从Img选定一个区域,然后将整个区域扣除,并且粘贴上watermark即可实现水印添加。
2.1具体原理
如下图,从左往右,首先第1张图片是在原图中扣出该水印的形状,黑色部分像素全为0,第二张图片是把watermark中白色的部分全部去除只保留黑色的像素,第三图为前两张图的叠加。

2.2子流程
对水印二值化处理过程如下,从左往右第1张图为水印原图,第2张图 为二值化 处理后的黑白图像,第3张图为 第2张图的取反.

然后我们分别将水印图和原图 对上面得到的 第2和第3张图相与,得到我们想要的部分后叠加即可。具体如下:
将原图 与 第3张图 与运算 得到 mask2(最右边的图)。

将水印图 与 第2张图 与运算 得到 mask1(最右边的图):

然后 将 mask1和mask2叠加 就得到

3.代码实现
import cv2
import numpy as np
#读取原图和 水印图
img=cv2.imread("wallhaven.png")
watermark=cv2.imread("watermark.jpg")
#水印图较大 不利于展示 这里做缩放处理,根据 屏幕显示情况自行 决定是否缩放
watermark=cv2.resize(watermark,None,fx=0.3,fy=0.3,interpolation=cv2.INTER_AREA)
#提取 原图中我们想要添加水印的 区域
#这里区域 可以根据 你的喜好随机 选取 区域 添加
roi=img[100:700,300:900]
#将水印转化为灰度图 方便我们 进行 逻辑 与非操作
watermark_gray=cv2.cvtColor(watermark,cv2.COLOR_BGR2GRAY)
#对水印图进行二值化处理 及生成黑白图
ret,thresh=cv2.threshold(watermark_gray,100,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
not_thresh=cv2.bitwise_not(thresh)
#将水印图中 水印的形状部分像素全部扣出
mark1=cv2.bitwise_and(watermark,watermark,mask=thresh)
#从原图中 扣出水印
mark2=cv2.bitwise_and(roi,roi,mask=not_thresh)
# 两张图叠加 并对 原图 对应区域进行修改
img[100:700,300:900]=cv2.add(mark1,mark2)
cv2.imshow("watermark",watermark)
cv2.imshow("thresh",thresh)
cv2.imshow("not_thresh",not_thresh)
cv2.imshow("mark1",mark1)
cv2.imshow("mark2",mark2)
cv2.imshow("img",img)
cv2.waitKey(0)
最终效果图:

827

被折叠的 条评论
为什么被折叠?



