OpenCV之通过位运算实现图像的叠加(Python实现)

在这里插入图片描述)在这里插入图片描述
我们如何将这个logo加到右边图片里呢?

如果使用cv.add()那么颜色肯定加深 如果使用cv.addWeight()又会出现透明, 那怎么办呢?

我们可以使用位运算,然后运用掩码的性质就可以得到了。

我们可以首先将logo的颜色空间进行转换,转换成灰度图像,然后使用阀值函数,将我们的logo提取出来,然后将其他部分变为黑色,即像素值为0。

这部分代码为:

 img2gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 颜色空间的转换
 ret, mask = cv.threshold(img2gray, 20, 255, cv.THRESH_BINARY)# 掩码 黑色
 cv.namedWindow("image", cv.WINDOW_AUTOSIZE)
 cv.imshow("image", mask)

在这里插入图片描述
然后我们得到它相反的图像,使用cv.bitwise_not,得到
在这里插入图片描述
那么我们接下来就可以嵌入了,首先我们得原图像还原,那么只需要使用

img1_bg = cv.bitwise_and(img, img, mask=mask)

得到在这里插入图片描述
因为mask的性质就是非0的地方保留原样,其余为0

接下来我们利用mask_inv去取得messi那张图的背景部分。

代码为:

img2_fg = cv.bitwise_and(roi, roi, mask=mask_inv)

这样得到
在这里插入图片描述
那么最后只需要使用cv.add即可

完整代码

import cv2 as cv
import numpy as np


if  __name__ == "__main__":
    img = cv.imread("E:/OpenCv/logo.jpg") #LOGO
    img1 = cv.imread("E:/OpenCv/messi5.jpg") #MESSI
    # look(img)
    rows, cols, channels = img.shape
    roi = img1[0:rows, 0:cols] #获得messi的ROI
    img2gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 颜色空间的转换
    ret, mask = cv.threshold(img2gray, 20, 255, cv.THRESH_BINARY)# 掩码 黑色
    mask_inv = cv.bitwise_not(mask)# 掩码取反 白色
    # #取mask中像素不为的0的值,其余为0
    img1_bg = cv.bitwise_and(img, img, mask=mask)
    img2_fg = cv.bitwise_and(roi, roi, mask=mask_inv)
    dst = cv.add(img1_bg, img2_fg)
    img1[0:rows, 0:cols] = dst
    cv.namedWindow("image", cv.WINDOW_AUTOSIZE)
    cv.imshow("image", mask)
    cv.imshow("mask_inv", mask_inv)
    cv.imshow("img1_bg", img1_bg)
    cv.imshow("img2_fg", img2_fg)
    cv.imshow("image", img1)
    cv.waitKey()
    cv.destroyAllWindows()

最后效果为:

在这里插入图片描述
哈哈,很开心,学新的东西。

全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
AAA专业长城贴瓷砖刘大爷:这样的简历我会直接丢进垃圾桶,花里胡哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务