【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

相关文章

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自