【opencv4.3.0教程】12之图像的加add、减subtract、乘multiply、除divide

2023-12-11 20:33

本文主要是介绍【opencv4.3.0教程】12之图像的加add、减subtract、乘multiply、除divide,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

一、加

1、介绍

2、API

3、代码实战

二、减

1、介绍

2、API

3、代码实战

三、乘

1、介绍

2、API

3、代码实战

四、除

1、介绍

2、API

3、代码实战

五、原图与掩膜图像的加减乘除


前言

要说这加减乘除,大家肯定不陌生,从小学学数学开始,我们就接触了这四个基本的四则运算。那图像的加减乘除又是什么呢?它能实现什么样的效果呢?让我们走进今天的文章,来学习一下吧!

一、加

1、介绍

我们从加说起:

加实现了计算两个数组或一个数组和一个scalar的每个元素的和的功能。

输入数组和输出数组都可以具有相同或不同的深度。例如,可以将16位无符号数组添加到8位有符号数组,并将总和存储为32位浮点数组。输出数组的深度由dtype参数确定。在上面的第二和第三种情况下,以及在第一种情况下,当两个输入图像的深度相同时,可以将dtype设置为默认值-1。这时候,输出图像和输入图像的深入相同。

2、API

加的API如下:

void add(InputArray src1, InputArray src2, OutputArray dst,InputArray mask = noArray(), int dtype = -1
);

具体的参数如下:

(1)InputArray类型的src1 ,第一个输入数组或scalar。

(2)InputArray类型的src2 ,第二个输入数组或scalar。

(3)OutputArray类型的dst ,输出图像,图像的尺寸、通道数和输入图像相同。

(4)InputArray类型的mask,可选操作掩码-8位单通道数组,指定要更改的输出数组元素。

(5)int类型的dtype,输出数组的可选深度。

3、代码实战

我们使用两个图像来做一下实战。

	Mat ZWJ = imread("./image/YT_ZWJ1.png");Mat ZM = imread("./image/YT_ZM1.png");if (!ZWJ.data && !ZM.data){cout << "ERROR : could not load image.\n";return -1;}imshow("张无忌", ZWJ);imshow("赵敏", ZM);Mat YT_new;add(ZWJ, ZM, YT_new);imshow("倚天屠龙记-add", YT_new);

得到的结果如下,左边的两幅图是原图,后面的图是利用前两幅图加得到的。

我想大家应该还记得我们之前讲到的图像混合,如果我们使用图像混合得到的结果是什么样的呢?

二、减

1、介绍

讲完加,自然就应该说一下减:

减实现了计算两个数组或一个数组和一个scalar的每个元素的差的功能。

减法和加法只是加减运算不同,其他都是一样的。让我们走进API看一下吧

2、API

减的API如下:

void subtract(InputArray src1, InputArray src2, OutputArray dst,InputArray mask = noArray(), int dtype = -1
);

具体的参数如下:

(1)InputArray类型的src1 ,第一个输入数组或scalar。

(2)InputArray类型的src2 ,第二个输入数组或scalar。

(3)OutputArray类型的dst ,输出图像,图像的尺寸、通道数和输入图像相同。

(4)InputArray类型的mask,可选操作掩码-8位单通道数组,指定要更改的输出数组元素。

(5)int类型的dtype,输出数组的可选深度。

3、代码实战

我们使用两个图像来做一下实战。

	Mat ZWJ = imread("./image/YT_ZWJ1.png");Mat ZM = imread("./image/YT_ZM1.png");if (!ZWJ.data && !ZM.data){cout << "ERROR : could not load image.\n";return -1;}imshow("张无忌", ZWJ);imshow("赵敏", ZM);Mat YT_new;subtract(ZWJ, ZM, YT_new);imshow("倚天屠龙记-subtract", YT_new);

得到的结果如下,左边的两幅图是原图,后面的图是利用前两幅图加得到的。

因为后面的图片是被减的,所以在最终图像上,会取反(255减原值)。

三、乘

1、介绍

第三个要说明的是乘:

乘实现了计算两个数组的按元素缩放的乘积的功能。

两个数组相乘,对应位置上的元素相乘,得到该位置上的值。

2、API

乘的API如下:

void multiply(InputArray src1, InputArray src2, OutputArray dst,double scale = 1,int dtype = -1
);

具体的参数如下:

(1)InputArray类型的src1 ,第一个输入数组或scalar。

(2)InputArray类型的src2 ,第二个输入数组或scalar,尺寸和类型要与src1一致。

(3)OutputArray类型的dst ,输出图像,尺寸和类型要与src1一致。

(4)double类型的scale,可选比例因子。

(5)int类型的dtype,输出数组的可选深度。

3、代码实战

我们使用两个图像来做一下实战。

	Mat ZWJ = imread("./image/YT_ZWJ1.png");Mat ZM = imread("./image/YT_ZM1.png");if (!ZWJ.data && !ZM.data){cout << "ERROR : could not load image.\n";return -1;}imshow("张无忌", ZWJ);imshow("赵敏", ZM);Mat YT_new;multiply(ZWJ, ZM, YT_new, 0.05);imshow("倚天屠龙记-multiply", YT_new);

得到的结果如下,左边的两幅图是原图,后面的图是利用前两幅图加得到的。

大家能够发现,我们使用了一个较小的比例因子,这是因为图像中最大的像素为255,而一幅图像中很常见像素值比较大,相乘就会超过255,最后导致整个图像就是几乎全白的,没有太大研究的意义,所以我们要添加一个比例因子,让其按比例缩放,就能看到更加真实的效果了。

四、除

1、介绍

最后要讲的就是除:

除实现了计算执行两个数组或标量按数组的每个元素的除法的功能。

在除中,要考虑的问题如下:

首先,除法可能是一个float数据和Mat的除,这个时候,计算的是float和Mat中每个数值的除;如果是两个Mat除,那就是对应位置做除法。

其次,除数Mat中可能会存在0,这个位置求出的值直接取零。

根据上面第一点,我们就能知道,有两种计算情况,那在实现中,会有两个除函数。

2、API

除的API如下:

void divide(InputArray src1, InputArray src2, OutputArray dst,double scale = 1,int dtype = -1
);void divide(double scale, InputArray src2,                         OutputArray dst, int dtype = -1
);

具体的参数如下:

(1)InputArray类型的src1 ,第一个输入数组或scalar。

(2)InputArray类型的src2 ,第二个输入数组或scalar,尺寸和类型要与src1一致。

(3)OutputArray类型的dst ,输出图像,尺寸和类型要与src1一致。

(4)double类型的scale,scalar因子。

(5)int类型的dtype,输出数组的可选深度。

3、代码实战

我们使用两个图像来做一下实战。

	Mat ZWJ = imread("./image/YT_ZWJ1.png");Mat ZM = imread("./image/YT_ZM1.png");if (!ZWJ.data && !ZM.data){cout << "ERROR : could not load image.\n";return -1;}imshow("张无忌", ZWJ);imshow("赵敏", ZM);Mat YT_new;divide(ZWJ, ZM, YT_new,100);imshow("倚天屠龙记-divide", YT_new);divide(10000, ZWJ, YT_new);imshow("张无忌-divide", YT_new);divide(10000, ZM, YT_new);imshow("赵敏-divide", YT_new);

得到的结果如下:

五、原图与掩膜图像的加减乘除

如果我们有一幅图像,我们先做掩膜操作,然后计算原图像与其掩膜图像的加减乘除,看一下效果吧!

	Mat YT = imread("./image/YiTian1.jpg");if (!YT.data){cout << "ERROR : could not load image.\n";return -1;}imshow("倚天屠龙记", YT);Mat kernel = (Mat_<char>(3, 3) << 0, -1,  0, -1,  5, -1, 0, -1,  0);Mat YT_mask;filter2D(YT, YT_mask, YT.depth(), kernel);imshow("倚天屠龙记-mask", YT_mask);Mat YT_new;add(YT, YT_mask, YT_new);imshow("倚天屠龙记-add", YT_new);subtract(YT, YT_mask, YT_new);imshow("倚天屠龙记-subtract", YT_new);multiply(YT, YT_mask, YT_new, 0.01);imshow("倚天屠龙记-multiply", YT_new);divide(YT, YT_mask, YT_new, 100);imshow("倚天屠龙记-divide", YT_new);

得到的结果如下。

原图
掩膜操作

 

这篇关于【opencv4.3.0教程】12之图像的加add、减subtract、乘multiply、除divide的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482025

相关文章

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.