opencv中图像叠加/图像融合/按位操作的实现


Posted in Python onApril 01, 2020

一、图像叠加:cv2.add

res=cv2.add(img1, img2) 或者res=cv2.add(img1, 标量值)

参数说明: cv2.add将两个图片对应位置的像素的值相加,或者将每个像素的值加上一个标量值,大于255的像素值就设置成255。

有一点需要注意的是,如果是两张图片相加,那么一定要注意两者的尺寸和通道数必须是一样的;如果是标量值,这个值既可以是整数也可以是浮点数,加合适的标量值一般是为了提高亮度。

import cv2

img1 = cv2.imread('1.jpg')
img2 = cv2.imread('2.jpg')
print(img1.shape)
print(img2.shape)
#输出: (1039, 750, 3)
   #(1050, 700, 3)
   
img2.resize((img1.shape[0],img1.shape[1],3))
print(img2.shape)
#输出:(1039, 750, 3)

res=cv2.add(img1,img2)#或者res=cv2.add(img1,10)

上面说了,cv2.add会把超过255的值设置为255,但是numpy里的加法进行的是模运算,请看下面的例子:

import cv2
import numpy as np

x = np.uint8([250])
y = np.uint8([10])

print( cv2.add(x,y) ) # 250+10 = 260 => 255
print( x+y )     # 250+10 = 260 % 256 = 4

输出:
[[255]]
[4]

二、图像融合:cv2.addWeighted

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst

dst = src1 * alpha + src2 * beta + gamma

src1 ? 第一张图片
alpha ? 第一张图片的权重
src2 ? 与第一张大小和通道数相同的图片
beta ? 第二张图片的权重
gamma ? 加到每个总和上的标量,相当于调亮度
dst ? 输出

当然,这里也要注意图片尺寸要一样

import cv2
import numpy as np

img1 = cv2.imread('1.jpg')
img2 = cv2.imread('2.jpg')
#统一图片大小
img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0]))

dst = cv2.addWeighted(img1,0.5,img2,0.5,0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv中图像叠加/图像融合/按位操作的实现

opencv中图像叠加/图像融合/按位操作的实现

opencv中图像叠加/图像融合/按位操作的实现

你可以根据需要自己调整两个图片的权重,以达到不同的显示效果

三、图像的按位操作:cv2.bitwise_and

'''
注意,src1和src2的形状要保持一致,一般都是同一张图像,
关键是在于mask,mask必须得是8-bit单通道array,尺寸也要和src相同
'''
bitwise_and(src1, src2[, dst[, mask]]) -> dst

如果将两幅图片直接相加会改变图片的颜色,如果用图像混合,则会改变图片的透明度,所以我们需要用按位操作。首先来了解一下掩膜(mask)的概念:掩膜是用一副二值化图片对另外一幅图片进行局部的遮挡,看下图就一目了然了:(此处参考了 原文链接)

opencv中图像叠加/图像融合/按位操作的实现

所以我们的思路就是把原图中要放logo的区域抠出来,再把logo放进去就行了:

import cv2
import numpy as np

img1 = cv2.imread('lena.jpg')
img2 = cv2.imread('opencv-logo-white.jpg')

# 把logo放在左上角,所以我们只关心这一块区域
rows, cols = img2.shape[:2]
roi = img1[:rows, :cols]

# 创建掩膜
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

# 保留除logo外的背景
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
dst = cv2.add(img1_bg, img2) # 进行融合
img1[:rows, :cols] = dst # 融合后放在原图上

cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv中图像叠加/图像融合/按位操作的实现

opencv中图像叠加/图像融合/按位操作的实现

opencv中图像叠加/图像融合/按位操作的实现

其实看到这,很多人会有一些疑问,包括我自己刚开始的时候也是有疑问:

为什么要用两个roi进行与运算,roi&roi不还是roi本身吗?

mask和roi尺寸也一样,而且我们想要在roi中去除的区域在mask中对应位置的像素值正好也为0,为什么不让roi和mask两者直接相与呢?

这两个问题在我查资料的时候是这么说的,仅供参考:

  • 因为mask是单通道的array,这是规定的,而roi是三通道,所以两者不能直接相与。
  • 于是先利用roi和roi相与得到roi本身,而mask可以控制相与之后输出数据的某些元素发生变化,而相与之后的输出就是roi,所以此时相当于直接对roi进行操作,使roi中和mask中像素值为0的像素点对应的像素点的像素值也为0,也即变成黑的,这就达到了我们想要的效果。

到此这篇关于opencv中图像叠加/图像融合/按位操作的实现的文章就介绍到这了,更多相关opencv 图像叠加/图像融合/按位操作内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
跟老齐学Python之正规地说一句话
Sep 28 Python
Python中使用strip()方法删除字符串中空格的教程
May 20 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
Python中的字符串替换操作示例
Jun 27 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
解决python 读取excel时 日期变成数字并加.0的问题
Oct 08 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
Python语言规范之Pylint的详细用法
Jun 24 Python
Python爬虫基础之简单说一下scrapy的框架结构
Jun 26 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 Python
Django数据库操作之save与update的使用
Apr 01 #Python
django model通过字典更新数据实例
Apr 01 #Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 #Python
python 日志 logging模块详细解析
Mar 31 #Python
django迁移文件migrations的实现
Mar 31 #Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 #Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 #Python
You might like
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
php使用websocket示例详解
2014/03/12 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
JS 毫秒转时间示例代码
2013/09/22 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
Python实现partial改变方法默认参数
2014/08/18 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
python实现简单登陆流程的方法
2018/04/22 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
资产评估专业学生的自我鉴定
2013/11/14 职场文书
酒店副总岗位职责
2013/12/24 职场文书
运动会方阵口号
2014/06/07 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL