OpenCV学习笔记(4)——图像上的算术运算
- 学习图像上的算术运算,加法,减法,位运算等
1.图像加法
使用cv2.add()将两幅图像进行加法运算,也可以用numpy运算,直接img+img1。两幅图像的大小和类型必须一致,或者第二个图像可以是一个简单的标量值。
两种操作的本质区别在于OpenCV的加法是一种饱和操作,加到顶后就不在上升了;而Numpy是模操作,具体如下:
import numpy as np
import cv2
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x,y))
print(x+y)
#[[255]]
#[4] 相当于(255+10)%256 = 4
在具体对两幅图像操作时会更加明显。一般来说OpenCV的结果会好一些,因此一般用OpenCV的函数
2.图像混合
即带权加法,可以将两幅图混合给人一种透明或者混合的感觉。具体公式很简单:

具体实现是用cv2.addWeighted(),例程如下:
import numpy as np
import cv2 img1 = cv2.imread('20180705-153550.jpg')
img2 = cv2.imread('20180708-085334.jpg') cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0) dst = cv2.addWeighted(img1, 0.7, img2, 0.3,0)#第一个数字是第一幅图的权值,第二个数字是第二幅图的权值,最后一个是个常数γ值 cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
在使用这个函数时,注意两幅图必须尺寸要相同,否则会报错
3.按位运算
包括按位操作有:AND,OR,NOT,XOR等。提取图片一部分的时候会很有用。比如有要将一个logo的中间部分挖掉放到另一个图里,使用简单的ROI操作是办不到的。
import numpy as np
import cv2 img1 = cv2.imread('5.jpg')
img2 = cv2.imread('2.jpg') #先将背景图中和logo图大小相同的部分挖出来
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
cv2.imshow('roi',roi)
cv2.waitKey(0) img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) #对logo图设置掩码或反掩码,方便后面从背景抠出logo部分,已及从logo图中单独抠出logo
ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)#threshold的用法,第一位为原图(只能是单通道图一般为灰度图),第二个是阈值,大于阈值的像素点取第三位的数字,最后一个是二值化操作类型
mask_inv = cv2.bitwise_not(mask)#按位NOT运算
cv2.imshow('mask',mask)
cv2.imshow('mask_inv',mask_inv)
cv2.waitKey(0) #分别从背景中抠出logo的位置,以及从logo图中抠出logo
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)#自己与自己AND运算,mask的作用在于前面两幅图AND后再与掩码做AND,使原图中掩码为1的像素变为1(全黑)
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
cv2.imshow('bg',img1_bg)
cv2.imshow('fg',img2_fg)
cv2.waitKey(0) dst = cv2.add(img1_bg,img2_fg)%结合背景和logo
img1[0:rows,0:cols] = dst cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows() 最终效果为
OpenCV学习笔记(4)——图像上的算术运算的更多相关文章
- [OpenCV学习笔记3][图像的加载+修改+显示+保存]
正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...
- OpenCV学习笔记(7)——图像阈值
简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...
- OpenCV学习笔记(10)——图像梯度
学习图像梯度,图像边界等 梯度简单来说就是求导. OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian.Sobel,Scharr其实就是求一阶或二阶导. ...
- opencv学习笔记(七)---图像金字塔
图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...
- opencv学习笔记(五)----图像的形态学操作
图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...
- OpenCV学习笔记(3)——图像的基本操作
获取图像的像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 1.获取并修改像素值 先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信 ...
- opencv学习笔记(六)---图像梯度
图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...
- opencv学习笔记3——图像缩放,翻转和阈值分割
#图像的缩放操作 #cv.resize(src,dsize,dst=None,,fx=None,fy=None,interpolation=None) #src->原图像,dsize->目 ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
随机推荐
- iOS去掉字符串中的HTML标签的方法
方法一.NSScanner去除标签 - (NSString *)removeTheHtmlFromString:(NSString *)htmlString { NSScanner * scanner ...
- js 格式化 json 字符串
1.JSON.stringify的三个参数 var json = {"@odata.context":"$metadata#AddTableOne_466281s&quo ...
- 通用mapper将另外一个同名的表生成在同一个实体及mapper中
今天遇见了一个在网上都搜索不到的错误,使用通过mapper生成实体及mapper文件时会将另外一个数据库的同名文件生成在一个实体及mapper中,这样就会造成一个实体和mapper中有两个表的字段,经 ...
- Nginx实用整理
1. nginx 简述 1.1Nginx是轻量级高并发HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:Nginx可以作为一个HTTP服务器进行网站的发布处理,另外N ...
- Java注解demo
# 为了熟悉了解注解,写的一个小demo# demo的主要功能是扫描一个class中的包含我们自定义注解的方法,然后把他们的返回值放到一个map中 public class QQ { public s ...
- Zookeeper常见问题FAQ
Zookeeper 常见问题FAQ 1.Zookeeper设置权限之坑 大家都知道,zookeeper创建节点默认的权限为:world:anyone:crdwa 设置权限时,当不小心设置成只读r,那么 ...
- Mongodb数据模型
描述表关系的方式: 方式一:嵌入式 > db.person.find({name:'zjf'}).pretty() { "_id" : ObjectId("592f ...
- 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块
目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...
- [转]C++引用
引用的概念 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引用,即别名. i ...
- 使用CEfSharp之旅 前后端访问代码
1.引入CEfSharp newget包 2.把平台配置为X86或X64,any cpu不支持此控件 3.引入命名空间 using CefSharp; using CefSharp.WinForms; ...
