1.任务要求
2.思路:
首先要知道的一点是纯黑色的R,G,B三通道的值都为0,不如生成一张纯黑色背景的图片,在其中绘制logo,这样对这张图片和原图进行相加操作,原图加上黑色的部分相当于加上了0,不会发生任何改变。这时候我们需要解决的问题就是在原图中扣出一部分黑色的区域来放我们的logo,这样相加之后logo加上原图黑色的部分相当于加上了0,于是就能完整的显示出我们的logo了。
创建一张200*200的纯黑色图片,把其中(20,20)到(120,120)的部分变成红色,(80,80)到(180,180)的部分变成绿色,这样就绘制出来了我们的logo
#先生成一张纯黑的图片,在这张图片上绘制logo
logo = np.zeros((200,200,3),np.uint8)
#再绘制logo
logo[20:120,20:120] = [0,0,255]
logo[80:180,80:180] = [0,255,0]
这里用到了与运算,在256进制下,0(黑色)与上任何数都是0,255(白色)与上任何数都是原来的数。因此我们想生成这样的一张图片:
用这张图片与原图相与,白色的部分还是原图,黑色的部分都被与成了黑色的。
"""生成掩码"""
mask = np.zeros((200,200),np.uint8)
mask[20:120,20:120] = 255
mask[80:180,80:180] = 255
mask_ = cv2.bitwise_not(mask)
"""利用掩码把背景图切割出来一篇黑色区域,刚好能放下logo"""
roi = dog[0:200,0:200]#取出原图左上角相应大小的图片
#所有的位运算函数,都有一个缺省的参数为mask,作用为当作掩码,在相应的位运算的结果上在跟mask进行一次相应的位运算
#这里不能写成 cv2.bitwise_and(roi,mask_)因为roi是三通道的,而mask_是一通道的,不能进行与运算
#但是把mask_当作源码,系统会自动解决通道不相同的问题
temp = cv2.bitwise_and(roi,roi,mask=mask_)
上面的问题引入了之前使用的位运算函数没提及的参数:掩码mask,这个参数是缺省的,加入这个参数后,在进行相应的位运算后,结果还会与mask在进行一次相应的运算才得到最后的结果。
这里不能直接cv2.bitwise_and(roi,mask_)因为roi是三通道的,而mask_是一通道的,不能进行与运算。
实际上可以在创建mask的时候直接创建成三通道的,这样就可以直接与roi进行与操作了,这里为了引出mask的概念因此采用了这种写法。
但这里的temp2只是从原图上截取的200*200的小区域,因此我们还需要把这片小区域放回原图:
3.完整代码:
import cv2
import numpy as np
dog = cv2.imread("image/dog.png")#660 500
"""生成logo"""
#先生成一张纯黑的图片,在这张图片上绘制logo
logo = np.zeros((200,200,3),np.uint8)
#再绘制logo
logo[20:120,20:120] = [0,0,255]
logo[80:180,80:180] = [0,255,0]
"""生成掩码"""
mask = np.zeros((200,200),np.uint8)
mask[20:120,20:120] = 255
mask[80:180,80:180] = 255
mask_ = cv2.bitwise_not(mask)
"""利用掩码把背景图切割出来一篇黑色区域,刚好能放下logo"""
roi = dog[0:200,0:200]#取出原图左上角相应大小的图片
#所有的位运算函数,都有一个缺省的参数为mask,作用为当作掩码,在相应的位运算的结果上在跟mask进行一次相应的位运算
#这里不能写成 cv2.bitwise_and(roi,mask_)因为roi是三通道的,而mask_是一通道的,不能进行与运算
#但是把mask_当作源码,系统会自动解决通道不相同的问题
temp = cv2.bitwise_and(roi,roi,mask=mask_)
"""利用add操作,把logo和temp进行相加,最后还原到原图上面去"""
temp2 = cv2.add(temp,logo)
dog[0:200,0:200] = temp2
#cv2.imshow("logo",logo)
#cv2.imshow("mask_",mask_)
#cv2.imshow("temp",temp)
#cv2.imshow("temp2",temp2)
cv2.imshow("new_dog",dog)
cv2.waitKey(0)
cv2.destroyAllWindows()