import cv2
import numpy as np
#绘制logo
img = cv2.imread('D:\\123.PNG') #读取需要加水印的图片
logo = np.zeros((200,200,3),np.uint8) #创建logo(其实是包括logo在内的一片区域)
logo[130:180,30:170] = (0,0,255) #真正的绘制了logo
logo[20:150,70:130] = (255,0,0) #真正的绘制了logo
mask = np.zeros((200,200),np.uint8) #为掩码制作区域,尺寸必然与logo区域一致,解释见原文
mask[130:180,30:170] = 255 #掩码中logo真正占的区域,必然与logo真正的尺寸一致,解视见原文
mask[20:150,70:130] =255 #掩码中logo真正占的区域,必然与logo真正的尺寸一致,解视见原文
m = cv2.bitwise_not(mask) #这一步之前的掩码区域是,黑色的背景值为0,logo在掩码中的区域为白色值为1
#这段代码是通过非操作,使得背景值都变为1,logo占的区域变为0,为后续做铺垫
roi = img[0:200,0:200] #读取原图中打水印的区域,尺寸必然与mask尺寸一致,因为bitwise_and要求图片尺寸一致
tmp = cv2.bitwise_and(roi,roi, mask = m) #tmp temporary临时变量 与操作也就是求交集
#此时m中logo在掩码中占的区域值都为0,与原图进行与操作也就是取交集自然得到空集,也就是0
#这步完成后,就得到了一个包含取出的原图区域且logo需要占有的区域值为0的结果,这样在将logo加入进去,就不会影响logo真实的色彩
#如果抛弃这些步骤,直接画好logo,通过add或者addweighted操作,都会使加入图片的logo色彩不是我们想要的颜色
dst = cv2.add(tmp,logo) #dst destination目标 将tmp与logo加起来,也就得到了加好logo的原图的一部分
img[0:200,0:200] = dst #直接赋值,将原图中x范围0~200;y范围:0~200;尺寸为200x200的区域 赋dst的值,也就是将dst这个图加进了原图中
cv2.imshow('logo' , logo)
cv2.imshow('musk' , mask)
cv2.imshow('m',m)
cv2.imshow('roi',roi)
cv2.imshow('tmp' , tmp)
cv2.imshow('img',img)
cv2.waitKey(0)
#有不懂的兄弟尽管问我,就当让我复习了,还有就是第21行这段代码不太好理解,在原文中都有解答,也可以评论提问!
这段代码进行了详细的标注,对每行内容进行了解释,相信就算是一个新手也能看懂一二
这张图片是每个窗口的运行效果图
有想复刻,或者有问题的马友可以评论提问,就当让我复习了,一定知无不答,本人近期活跃于CSDN,回复效率高👍
最后献上一张图,激励各位马友
添加的色彩为(255,255,200)不谢