美文网首页
添加图片水印

添加图片水印

作者: 欠我的都给我吐出来 | 来源:发表于2020-06-02 10:41 被阅读0次

本质是将logo图片主体部分贴到需要打水印的图片上。分两种情况具体分析:logo图片是不透明图片;logo图片自带透明度alpha通道。

一、 不透明logo图片的水印添加(或者说是图片叠加)

一般的jpg图片是三信道RGB图片(red,green,blue),如果是专门的水印图片,一般是png格式保存的,图片是四通道保存的,即在RGB三个通道的基础上添加alpha通道信息。对于三信道的这种不透明的图片,有两种处理方式:

1. 可以通过给不带透明度通道的图片添加透明度通道,进而将问题转为自带透明度alpha通道的水印添加方式。添加通道的部分可以参考下面的博客做法:https://blog.csdn.net/guduruyu/article/details/71440186

2. 如果logo比较简单,也可以直接按照水印叠加的原理进行处理。水印的添加实际上就是两张图片叠加,其中需要添加水印的图片在下方,水印图片在上方,水印的主体部分应该是水印上的主图部分图片,水印的其他背景部分应该保持透明。

我们的logo长这样(随手用QQ截图画的,仅做参考使用) ,那么白色的logo应该是希望被印在图片上的,黑色的部分应该是透明效果。


1.png

最终的结果应该是这样的:

2.png

那么主要可以分为三个步骤:

1. 读取图片image,读取水印图片logo,将水印图片灰度二值化mask


scr_Image = cv2.imread(r"C:\Users\14192\Desktop\image.jpg")

logo = cv2.imread(r"C:\Users\14192\Desktop\logo.jpg")

mask =cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)

2. 观察mask的数组分布,发现其背景部分和logo部分分隔明显(打印或者debug可以看),设置100为mask区别背景和主体之间的阈值,那么当像素低于100时,输出图片的对应位置像素不做改变,高于100时,输出图片对应位置的像素应该是logo对应位置的像素

3.png

height = scr_Image.shape[0]

width = scr_Image.shape[1]

# 以下是copyTo的算法原理:

# 先遍历每行每列(如果不是灰度图还需遍历通道,可以事先把mask图转为灰度图)

for row in range(mask.shape[0]):

  for col in range(mask.shape[1]):

    if mask[row, col]>100:

      scr_Image[row, col] = logo[row,col]

cv2.imwrite("dst_image.jpg", scr_Image)

二、logo图片自带透明度alpha通道

网上很多方法,直接使用即可。

https://www.linuxidc.com/Linux/2019-05/158638.htm

相关文章

网友评论

      本文标题:添加图片水印

      本文链接:https://www.haomeiwen.com/subject/aeoyzhtx.html