本次教程我们将概述图像的算数运算,众所周知,数学中有着加减乘除运算,同样的,图像也是如此,它的本质实际上就是一个矩阵,所以图像也存在着加法、减法、位运算等等算数运算。

加法

使用cv2.add()将两个图像相加,可以使用numpy中的矩阵加法来实现。但是在opencv中加法是饱和操作,也就是有上限值,numpy会对结果取模,综上,使用opencv的效果更好,我们来看函数实例:

cv2.add(img1, img2)  # 进行图片的加和

参数说明: cv2.add将两个图片进行加和,大于255的使用255计数.

我们将使用以下两个图片作为实例:

来看代码:import cv2

img1 = cv2.imread("01.jpg")

img2 = cv2.imread("02.jpg")

res = cv2.add(img1,img2)

cv2.imshow("res",res)

cv2.waitKey(0)

cv2.destroyAllWindows()

不难理解,第一幅图像白色部分像素部分为255,黑色部分像素为0,所以和第二幅图像加起来之后白色部分仍然是白色部分,因为加起来的值大于255时,默认取值255.

减法

减法运算就是两幅图像见对象像素的灰度值或彩色分量进行相减,它可以用于目标检测,需要用到函数cv2.subtract(),程序实现:import cv2

img1 = cv2.imread("01.jpg")

img2 = cv2.imread("02.jpg")

res = cv2.subtract(img1,img2)

cv2.imshow("res",res)

cv2.waitKey(0)

cv2.destroyAllWindows()

乘法

图像的乘法运算就是将两幅图像对应的灰度值或彩色分量进行相乘。

乘运算的主要作用是抑制图像的某些区域,掩膜值置为1,否则置为0。乘运算有时也被用来实现卷积或相关的运算,其相关函数为cv2.multiply()。

以下为相关程序代码:import cv2

img1 = cv2.imread("01.jpg")

img2 = cv2.imread("02.jpg")

res = cv2.multiply(img1,img2)

cv2.imshow("res",res)

cv2.waitKey(0)

cv2.destroyAllWindows()

除法

图像除运算就是两幅图像对应像素的灰度值或彩色分量进行相除。简单的出运算可以用于改变图像的灰度级。其相关函数为cv2.divide。

以下为代码部分:import cv2

img1 = cv2.imread("01.jpg")

img2 = cv2.imread("02.jpg")

res = cv2.divide(img1,img2)

cv2.imshow("res",res)

cv2.waitKey(0)

cv2.destroyAllWindows()

图像融合

它实际上本质也是一个加法运算,但是这个加法运算跟普通的并不一样,我们可以理解为是一种加权的运算。

我们用函数来表示一个图像,前提是所有的图像尺寸是一样的,即图像矩阵的行列一样,通道数一样。

我们用 f0(x) 和 f1(x) 来表示输入的图像,用 g(x) 来表示输出图像,α表示比例( 0≤α≤1 ,一般来说,α取0和1没有太大意义),那我们能得到如下图所示的一个公式:

所以图像混合就是将两个图像按照一定的比例转存到另一个图像中。

首先需要看一下函数原型:

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

参数:

src1      第一个输入数组。

alpha   第一个数组元素的权重。

src2      第二个输入数组,其大小和通道号与src1相同。

beta      第二个数组元素的权重。

gamma 标量加到每个和。

dst输出数组,其大小和通道数与输入数组相同。

dtype   输出数组的可选深度;当两个输入数组的深度相同时,可以将dtype设置为-1,这等效于src1.depth()。

此函数可以用以下矩阵表达式进行代替:

dst = src1 * alpha + src2 * beta + gamma;

注意:由参数说明可以看出,被叠加的两幅图像必须是尺寸相同、类型相同的;并且,当输出图像array的深度为CV_32S时,这个函数就不适用了,这时候就会内存溢出或者算出的结果压根不对。

我们来看一下代码:import cv2

img1 = cv2.imread("01.jpg")

img = cv2.imread("02.jpg")

h, w, _ = img1.shape

img2 = cv2.resize(img, (w,h), interpolation=cv2.INTER_AREA)

alpha = 0.7

beta = 1-alpha

gamma = 0

img_add = cv2.addWeighted(img1, alpha, img2, beta, gamma)

cv2.imshow('img_add',img_add)

cv2.waitKey()

cv2.destroyAllWindows()

效果:

此函数最大的缺陷就是需要两张图片尺寸必须完全一样,所以在实验时必须要注意。

按位运算

我们在学习数电时想必都学过逻辑运算,OpenCV中也有相关的运算。与或非这些想必就不必再多讲了,我们可以通过代码实验来熟悉:

与运算:import cv2

img1 = cv2.imread("01.jpg")

img2 = cv2.imread("02.jpg")

res = cv2.bitwise_and(img1,img2)

cv2.imshow("res",res)

cv2.waitKey()

cv2.destroyAllWindows()

或运算:import cv2

img1 = cv2.imread("01.jpg")

img2 = cv2.imread("02.jpg")

res = cv2.bitwise_or(img1,img2)

cv2.imshow("res",res)

cv2.waitKey()

cv2.destroyAllWindows()

可以看到,跟加法运算基本上类似。

非运算:import cv2

img1 = cv2.imread("01.jpg")

img2 = cv2.imread("02.jpg")

res = cv2.bitwise_not(img1,img2)

cv2.imshow("res",res)

cv2.waitKey()

cv2.destroyAllWindows()

非运算在之后的学习中是非常有帮助的,它的以用来对二值化图像进行取反,然后方便进行形态学操作。

异或运算:import cv2

img1 = cv2.imread("01.jpg")

img2 = cv2.imread("02.jpg")

res = cv2.bitwise_xor(img1,img2)

cv2.imshow("res",res)

cv2.waitKey()

cv2.destroyAllWindows()

关于图像的所有的基本运算就介绍到这里。

现在带大家做一个好玩的小项目,题目是:

用OpenCV完成一个幻灯片演示一幅图转成另一幅图,并在图像之间进行平滑过渡。

实际上,我们使用刚刚的线性加权函数就可以完成,我们只需要定义一个变量a,然后让其值小于一,变量的值依次递增。这样总体进行分析的话,第一幅图图像的加权值为a,第二幅图像的加权值为1-a,那么在一个循环里面它们会进行动态过渡,我们来看一下代码:import cv2 as cv

img1 = cv.imread('01.jpg')

img2 = cv.imread('02.jpg')

l, h = img1.shape[0:2]

img2_R = cv.resize(img2, (h, l))

a=0

cv.namedWindow('ppt',True)

dst = cv.addWeighted(img1, a, img2_R, 1-a, -1)

cv.imshow('ppt', dst)

cv.waitKey(0)

while a<1.0:

dst = cv.addWeighted(img1, a, img2_R, 1-a, -1)

cv.imshow('ppt', dst)

cv.waitKey(100)

a+=0.02

cv.waitKey(0)

cv.destroyAllWindows()

按下esc键开始幻灯片放映,由于效果为动态,此处不便展示,大家请自己实验,还是很有意思的。

python加法程序结果图片_OpenCV-Python系列之图像上的算术运算相关推荐

  1. python编写程序 计算1_《Python程序设计》——第1章 计算与问题求解简介 1.1 计算与Python简介-阿里云开发者社区...

    本节书摘来自华章计算机<Python程序设计>一书中的第1章,第1.1节,作者:[美]戴维 I.施奈德(David I. Schneider)著,更多章节内容可以访问云栖社区"华 ...

  2. 如何用python编写程序_如何进行Python程序的编写

    一.使用Python自身提供的交互式解释器 在Linux.Windows.Mac OS的命令行窗口或Shell窗口,执行python命令,启动Python交互式解释器.交互式解释器会等待用户输入Pyt ...

  3. python应用程序发布_关于Python的应用发布技术

    收集如何 将Py应用打包发布的各种技巧: 1.1. 工具 工欲善其事,必先利其器.python是解释型的语言,但是在windows下如果要执行程序的话还得加个python shell的话,未免也太麻烦 ...

  4. python 运行程序代码_一些python程序

    <从问题到程序:用Python学编程和计算>--1.2 Python语言简介 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 ...

  5. python opencv压缩图片_OpenCV Python 缩放图片

    By 凌顺 2019年9月12日 本示例使用的OpenCV版本是:4.1.1 运行Python的编辑器:Jupyter notebook 示例目的 使用OpneCV的cv2.resize()函数对图片 ...

  6. python opencv视频处理教程_OpenCV+Python详细教程-图片+视频(一)-Go语言中文社区...

    环境 Python3以上的版本+OpenCV+PyCharm 图片 目标 读入,显示,保存图像 对应的函数:cv2.imread(),cv2.imshow(),cv.imwrite() 1.1读取图像 ...

  7. python画简便的图片-用python简单处理图片(5):图像直方图

    我们先来看两个函数reshape和flatten: 假设我们先生成一个一维数组: vec=np.arange(15) print vec 显示为: [ 0 1 2 3 4 5 6 7 8 9 10 1 ...

  8. python爬取论坛图片_[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  9. python使用opencv如何保存图片_OpenCV Python 保存图片

    本示例使用的OpenCV版本是:4.1.1 运行Python的编辑器:Jupyter notebook 示例目的 通过无损和有损的方式进行图片保存. 实现代码 1,加载图片 import cv2 # ...

  10. 一位Python老程序员,给Python初学者的建议,希望你们少走弯路!

    Python要学多久可以学会,达到精通呢? 任何知识都是基础入门比较快,达到通晓的程序是需求时日的,这是一个逐渐激烈的进程. 通晓任何一门编程语言,都需求通过大量的实践来积累经验,解决遇到的各种疑难问 ...

最新文章

  1. ggplot2设置坐标轴范围_Matplotlib入门-2-坐标轴axis/axes设置
  2. [react-router] React-Router怎么获取URL的参数?
  3. C++重载流插入运算符与流提取运算符
  4. shopxo首页的新闻头条栏:如何隐藏或关闭?
  5. 灰度董事总经理:BTC突破2万美元并不令人惊讶
  6. CListCtrl 使用(转)
  7. MySQL-快速入门(12)备份、还原
  8. python编程:从入门到实践_《Python编程:从入门到实践》【PDF】
  9. K线技术指标实现详解—KDJ
  10. 怎么对文件夹名称进行编号排序
  11. pow函数php,PHP pow( )用法及代码示例
  12. Windows Server 2019 配置DHCP
  13. SAP DELETE ADJACENT DUPLICATES FROM语句的深入研究及应用
  14. Android 逆向之smali
  15. 如何制作一个自己的四足机器人
  16. 2017 我所分享的技术文章总结(下)
  17. 雷军在北京大学的演讲
  18. Google封杀赛门铁克Root证书
  19. 社工获取ip tips
  20. 怎样看 计算机类b0809,计算机类(B0809、A0812、A0854)为什么是神?

热门文章

  1. F - 小希的迷宫 (并查集)
  2. php管理系统模板,自定义模块后台模板
  3. slam十四讲第十讲:找不到 g2o_viewer
  4. java unit scanner_Java输入输出常用类Scanner
  5. python可以替代java吗_Python 并非最好的编程语言,它无法取代 C/C++ 和 Java
  6. 江小白包装设计原型_江小白的跨界营销,系列设计很“牛啤”!
  7. 生成指定范围的随机数_JAVA 获取随机数的方式以及应用案例
  8. java listbook,java,_Java泛型问题,在编译时,提示警告: 需要: ListT 找到: ListBookDetails,java - phpStudy...
  9. PPT扩展展示时,PPT展示界面背景色有时候突然变成黑底?如何解决?
  10. 新中国成立60周年重要科技成果知识竞赛试题