热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python开方运算符_OpenCVPython常用图像运算:加减乘除幂开方对数及位运算

☞░前往老猿Python博客https:blog.csdn.netLaoYuanPython░一、引言在写该文之前,老猿就图像的一些运算已经单独边学边发了࿰

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░

一、引言

在写该文之前,老猿就图像的一些运算已经单独边学边发了,在写这些文的过程中,发现这些运算函数共同点很多,例如大部分参数一样、部分处理方法一样等,另外还有些函数可以实现相同或近似的效果,因此在前面那些文章的基础上,将其综合为一个整体来发布,更方便大家阅读。

OpenCV中图像存储为矩阵,因此图像的运算其实就是矩阵的运算。图像的运算主要包括图像基础算术运算、图像加权运算(又称为图像融合)、按位运算等类别。这些运算可以直接通过numpy矩阵进行,也可以通过opencv的专用方法进行,但opencv的矩阵运算和numpy矩阵运算还是有些不同。例如在加法处理上,OpenCV加法是饱和运算(超过255即按255),而Numpy加法是模运算(超过255按256取模的结果作为结果)。对加法来说,颜色值越大OpenCV 的结果会更好,因此推荐使用opencv的进行算术运算。本文的内容全部基于OpenCV的方法进行介绍。

二、OpenCV图像运算语法

2.1、图像运算函数列表

OpenCV图像运算包括如下函数:

加法运算:add(src1, src2, dst=None, mask=None, dtype=None)

减法运算:subtract(src1, src2, dst=None, mask=None, dtype=None)

乘法运算:multiply(src1, src2, dst=None, scale=None, dtype=None)

除法运算:divide(src1, src2, dst=None, scale=None, dtype=None)

幂运算:pow(src, power, dst=None)

开方运算:sqrt(src, dst=None)

自然常数e为底的指数函数:exp(src, dst=None)

对数运算:log(src, dst=None)

融合权重加法:addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)

位与运算:bitwise_and(src1, src2, dst=None, mask=None)

位或运算:bitwise_or(src1, src2, dst=None, mask=None)

位异或运算:bitwise_xor(src1, src2, dst=None, mask=None)

位非运算:bitwise_not(src, dst=None, mask=None)

2.2、图像运算常用参数说明

src:输入图像矩阵

src1、src2:两副大小和通道数相等的输入图像或一副输入图像和一个标量(关于标量请参考《OpenCV-Python中的标量Scalar是什么》)

dst:目标图像输出,要求与输入图像大小相同,如果传值则可以直接以实参作为目标图像存储变量,否则可以用函数返回值作为目标图像存储变量,在实参非None传入的情况下,返回值与该实参值相同

scale:缩放因子,图像运算时,先执行src1*scale,再以该乘积进行后续运算

mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0。更多关于掩膜的内容请参考《OpenCV学习02-矩阵的掩膜操作》

dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。在帮助文档中介绍,参数src1和src2可以有不同的图像深度(即图像像素位数,如8位、16位、24位和32位),如可以将16位图像和一个8位图像相加将输出结果保存在32位输出数组中。关于这个参数老猿研究可很长时间,因为认为如果图像深度不一样,意味着图像的通道数也不一样,通道数不一样,意味着数组大小不一样,这样的两个数组无法进行运算。后来机缘契合下自认为理解了,这里说的图像深度不是通道数*8,而是单个通道值表示的位数,即单通道不一定是8位的,也可以是16位、24位或32位的。看如下代码就明白了:

def main():

img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)

img2 = cv2.imread(r'F:\pic\shape2.png')

img = cv2.add(img1,img2,dtype=24)

上述代码将以两种不同表示方法读入两副图像,第一幅图像是以float32来表示图像单通道值,第二幅图像是缺省值uint8来表示图像单通道值,二者机器位数不同,但相加之后转为了24位图像,即单通道为8字节图像。

2.3、部分图像运算函数详解

针对部分重要的图像运算,老猿在前面已经单独进行了介绍,包括:

OpenCV-Python图像的加法运算cv2.add函数详解

OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比

OpenCV-Python图像乘法运算cv2.multiply函数详解及像素值溢出归一化处理

OpenCV-Python图像除法运算cv2.divide函数及图像相除处理

OpenCV-Python图像融合cv2.addWeighted权重加法函数详解

OpenCV-Python图像位与运算bitwise_and函数详解

2.4、其他图像运算函数简介

幂运算:pow(src, power, dst=None),对图像的每个通道值计算power参数对应的幂作为结果图像的通道值,如果power为整数,则直接计算幂值,如果power为浮点数,则取通道值的绝对值参与计算,即:

开方运算:sqrt(src, dst=None),对图像的每个通道值开方作为结果图像的通道值,即:dst(I)=sqrt(src1(I))

自然常数e为底的指数函数:exp(src, dst=None),以e为底对图像的每个通道值作为幂值计算结果图像的通道值,即:

对数运算:log(src, dst=None),计算图像的每个通道值的自然对数作为结果图像的通道值,即:dst(I)=ln(src(I))

位或运算:bitwise_or(src1, src2, dst=None, mask=None),计算两副图像每个通道值或一图像通道值与一个标量的按位或的结果作为结果图像的通道值

位异或运算:bitwise_xor(src1, src2, dst=None, mask=None),计算两副图像每个通道值或一图像通道值与一个标量的按位异或的结果作为结果图像的通道值

位非运算:bitwise_not(src, dst=None, mask=None),将src图像的每个通道值按位取反作为结果图像的值。

三、相关函数的作用分析

图像的减法、除法以及异或都可以用于分析图像的差异点,但减法和异或更准确 ;

加法、权重加法以及图像或运算都可以用于合并图像,但由于运算方法与差异,效果会有不同,针对不同图像的融合选择哪种方法与图像数据及应用的目标相关;

图像的自乘、幂运算都可以用于调整图像的对比度;

非运算及异或运算可以将图像的一部分图像的视觉效果提高;

图像乘法、位与都可以用于提取图像的感兴趣部分或者屏蔽某些部分,在这方面的功能与图像掩码的效果相同,只是实现方式不同;

通过阈值处理、图像求反、与处理等可以提取图像中的结构特征

四、按位运算的简单案例

前面部分图像运算函数详解中举例介绍了图像加减乘除权重加及位与的相关功能,在此补充一个简单的按位运算的案例。代码如下:

import numpy as np

import cv2

def main():

img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)

img2 = cv2.imread(r'F:\pic\shape2.png')

resultImgAnd = cv2.bitwise_and(img1, img2)

resultImgOr = cv2.bitwise_or(img1, img2)

resultImgXor = cv2.bitwise_xor(img1, img2)

resultImgNot = cv2.bitwise_not(img1)

resultImgXorScalar = cv2.bitwise_xor(img1, (255,255,255,255))

cv2.imshow('img1',img1)

cv2.imshow('img2', img2)

cv2.imshow('resultImgAnd', resultImgAnd)

cv2.imshow('resultImgOr', resultImgOr)

cv2.imshow('resultImgXor', resultImgXor)

cv2.imshow('resultImgNot', resultImgNot)

cv2.imshow('resultImgXorScalar', resultImgXorScalar)

cv2.waitKey(0)

main()

运行显示的图片截屏:

五、小结

本文详细介绍了OpenCV-Python图像的加减乘除幂开方对数及位运算相关的函数及语法,并总结了相关函数的作用。OpenCV中图像存储为矩阵,因此图像的运算其实就是矩阵的运算。图像的运算主要包括图像基础算术运算、图像加权运算(又称为图像融合)、按位运算等类别。这些运算可以直接通过numpy矩阵进行,也可以通过opencv的专用方法进行,但opencv的矩阵运算是饱和运算,其运算效果比纯粹的矩阵运算效果更好。

更多OpenCV-Python介绍请参考专栏《OpenCV-Python图形图像处理 》

专栏网址:https://blog.csdn.net/laoyuanpython/category_9979286.html

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用 》(https://blog.csdn.net/laoyuanpython/category_9607725.html)专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》 (https://blog.csdn.net/laoyuanpython/category_10232926.html)详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、《使用PyQt开发图形界面Python应用专栏目录 》(https://blog.csdn.net/LaoYuanPython/article/details/107580932)。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》(https://blog.csdn.net/laoyuanpython/category_9831699.html)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学OpenCV!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░



推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
author-avatar
我2你1生1世你知到_164
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有