【openCV学习】16.添加logo小样例

1.任务要求

给一张原图,在其左上角加上如下的logo:

2.思路:

首先要知道的一点是纯黑色的R,G,B三通道的值都为0,不如生成一张纯黑色背景的图片,在其中绘制logo,这样对这张图片和原图进行相加操作,原图加上黑色的部分相当于加上了0,不会发生任何改变。这时候我们需要解决的问题就是在原图中扣出一部分黑色的区域来放我们的logo,这样相加之后logo加上原图黑色的部分相当于加上了0,于是就能完整的显示出我们的logo了。

(1)绘制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]

(2)利用掩码把原图扣出一片黑色的区域

这里用到了与运算,在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的概念因此采用了这种写法。

(3)将扣出黑色区域的原图与logo进行add操作

temp2 = cv2.add(temp,logo)

这样。我们就把logo拼接到了原图相应的位置了

但这里的temp2只是从原图上截取的200*200的小区域,因此我们还需要把这片小区域放回原图:

dog[0:200,0:200] = temp2

如下图所示:

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()

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

owooooow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值