引言
为图片添加水印在生活中是一个十分常见的问题,有时候为了达到自己想要的效果,人们往往采用PS的方式。这种方式需要对图片进行P图处理,对于一些PS小白来说,P图的步骤太过于繁琐且容易造成视觉疲劳,因此这里提出一种利用计算机自己生成可见水印图片的方法。
一 可见水印图片构成
通常,以人眼视觉的角度看,图片中水印部分就像是“粘贴”在原图上的,很多添加水印的方法也正是如此,只不过“粘贴”的不单单是水印部分,还有其他的透明部分,从而在“粘贴”水印的同时不影响图片的正常显示效果。而“粘贴”的这层水印图片,一般被叫做蒙版。
假设一张含有水印的图片为I(p),原图为W(p),蒙版为J(p),设水印蒙版的不透明度为α,由于最终图片I(p)的不透明度为1,所以原图W(p)的不透明度就为(1-α)。则对于一张含水印的图片来说有:
I(p)=α*J(p)+(1-α)*W(p) (1)式
根据(1)式,可以知道生成可见水印图片的关键在于如何获取水印蒙版。
二 如何生成水印蒙版
在生活中,水印的样式比较多,这里介绍可见水印覆盖全图的图像生成技术。
2.1 思路方法
在创建蒙版之前,需要先获取原图的尺寸,这样生成的蒙版才可以和原图进行(1)式运算。首先创建一个和原图尺寸一样的矩阵(包括图片的通道数),然后将每个位置的像素值进行初始化,将他们设置为纯白色(对应三个通道的像素值均为255)。
创建完矩阵之后,将指定位置的像素值更改为对应水印位置的像素值,这里以如下水印和原图为例
图2.1.1某品牌水印图
图2.1.2不含水印的图片
2.2 python代码
def GenerateWatermarks(file1,file2): #file1是原图地址,file2是水印地址 watermark = cv.imread(file2) wide = watermark.shape[0] high = watermark.shape[1] img = cv.imread(file1) mask = cv.imread(file1) # 将水印覆盖到蒙版上 for i in range(len(mask)): for j in range(len(mask[i])): mask[i][j] = watermark[i % wide][j % high] # 保存蒙版 cv.imwrite(file2+'_mask.png', mask) |
图2.2.1 全图水印蒙版
三 生成可见水印数据集
得到了水印蒙版之后,利用(1)式的原理,生成新图片,这里介绍opencv中内置的函数addWeighted来实现,具体用法参考如下:Res=cv2.addWeighted(img1,α,img2,1-α,0),其中img1是水印蒙版,α是它的不透明度,img2是原图片,1-α是它的不透明度,0是函数必带参数(水印蒙版和原图片可以交换位置,但是需要注意的是不透明度也需要同时交换位置)。
将得到的水印蒙版和原图片带入到函数中,就可以得到新图片,同时不要忘记使用cv2.write()函数保存得到的图片。将图2.1.2和图2.2.1带入函数,不透明度分别设置为0.5和0.5,得到的可见水印图片如下:
图3.1 可见水印图片
由于两张图片叠加之后原图和水印的显示效果都有所减弱,所以在合并两张图片之前,可以先对水印部分进行增强,然后再将原图的不透明度增大,得到新的显示效果:
图3.2 调整后的可见水印图片
四 总结
可见水印数据集的生成可以总结成以下步骤:读取水印和原图、根据原图生成水印蒙版、将水印覆盖到蒙版上、对蒙版上的水印部分进行增强、叠加原图和蒙版。需要注意的是,水印部分增强和叠加两张图片时没有明确的参数规定,可根据自身要求来确定;同时,添加水印的方式也是多种多样的,不需要拘泥于本文这一种,只要掌握了方法,就可以给图片添加上自己想要的水印效果。