• 学习图像上的算术运算,加法,减法,位运算等

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)——图像上的算术运算的更多相关文章

  1. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  2. OpenCV学习笔记(7)——图像阈值

    简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...

  3. OpenCV学习笔记(10)——图像梯度

    学习图像梯度,图像边界等 梯度简单来说就是求导. OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian.Sobel,Scharr其实就是求一阶或二阶导. ...

  4. opencv学习笔记(七)---图像金字塔

    图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...

  5. opencv学习笔记(五)----图像的形态学操作

    图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...

  6. OpenCV学习笔记(3)——图像的基本操作

    获取图像的像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 1.获取并修改像素值 先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信 ...

  7. opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

  8. opencv学习笔记3——图像缩放,翻转和阈值分割

    #图像的缩放操作 #cv.resize(src,dsize,dst=None,,fx=None,fy=None,interpolation=None) #src->原图像,dsize->目 ...

  9. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

随机推荐

  1. 【版本控制工具】 Git进阶1

    一.Git常用命令 Git中的很多命令与Linux相同(比如修改,查询,编辑,移动等),这里可以参考我之前的一篇文章https://www.cnblogs.com/ywb-articles/p/105 ...

  2. AVAYA_Site_administrator软件简单操作

    AVAYA_Site_administrator软件简单操作 1.配置软件(第一次登录) 点击File>New>Voice System  在弹出对话框随意输入一个名称 下一步,默认选择 ...

  3. MongoDB的优势应用场景和配置

    一:MongoDB的简介: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案 MongoDB是一个介于关系数据库和非关系数据库之间的 ...

  4. java poi

    import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.a ...

  5. ES6学习笔记(对象新增方法)

    1.Object.is() ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===).它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0. ...

  6. Centos 7误删Yum,如何补救???

    1. 查看centos 的版本号 cat /etc/redhat-release 2. 进入阿里云源站地址:http://mirrors.aliyun.com/  找到对应的版本号 3.下载相应的yu ...

  7. qt5--字符串格式拼接

    QString str=QString("x坐标为:%1  y坐标为:%2").arg(i).arg(j);

  8. MySql触发器简介

    MySQL 数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被 My ...

  9. Python 面向对象Ⅴ

    基础重载方法 下表列出了一些通用的功能,你可以在自己的类重写: 运算符重载 Python同样支持运算符重载,实例如下: 以上代码执行结果如下所示: 类属性与方法 类的私有属性 __private_at ...

  10. mysql 递归查找所有子节点

    select dept_id from ( select t1.dept_id,t1.parent_id, if(find_in_set(parent_id, @pids) > 0, @pids ...