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的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
随机推荐
- openCV3 Python编译指南
这里主要对openCV官网的<Installation in Linux>文档进行了翻译和解释 原文见:https://docs.opencv.org/3.4.1/doc/tutorial ...
- nginx服务学习第一章
一.ubuntu系统安装nginx服务 # apt-get install nginx 二.nginx.config配置文件详解 配置文件结构: 全局块(全局变量) events{ } http{ h ...
- MP4 ISO基础媒体文件格式 摘要 1
目录 Object-structured File Organization 1 File Type Box (ftyp) Box Structures File Structure and gene ...
- Maven 技巧知多少
Maven是一种帮助我们快速构建项目的小工具,它可以解决我们在项目过程中手动导包造成的版本不一致的问题,以及找包困难等问题,同时通过Maven创建的项目都有固定的目录格式,使得约定优于配置,我们通过固 ...
- HTML5 App的代码注入攻击
原文链接 摘要 基于HTML5的手机app(译者注:以下简称HTML5 app)越来越流行了, 在大多数情况下它比native应用更容易适配不同的移动操作系统.它开发起来很方便,可以使用标准的web技 ...
- Zookeeper服务注册与发现原理浅析
了解Zookeeper的我们都知道,Zookeeper是一种分布式协调服务,在分布式应用中,主要用来实现分布式服务的注册与发现以及分布式锁,本文我们简单介绍一下Zookeeper是如何实现服务的注册与 ...
- 通俗易懂的例子解释 IAAS、SAAS、PAAS 的区别
你一定听说过云计算中的三个“高大上”的你一定听说过云计算中的三个“高大上”的概念:IaaS.PaaS和SaaS,这几个术语并不好理解.不过,如果你是个吃货,还喜欢披萨,这个问题就好解决了!好吧,其实你 ...
- C++ list用法总结
头文件 #include<list> 声明一个int型的list:list a: 1.list的构造函数 list<int>a{1,2,3} list<int>a( ...
- springboot + mybatis sql日志
#mapper sql日志 替换成你的mapper接口所在的包名 logging.level.com.example.dao=debug
- 智能指针之shared_ptr基本概述
1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象. 2.类似于vector,智能指针也是模板.创建智能指针: shared_ptr<string> ...
