本质是将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. 读取图片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对应位置的像素

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通道
网上很多方法,直接使用即可。
网友评论