目录

前言

一、加

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相关推荐

  1. 【opencv4.3.0教程】11之调整图像边缘(copyMakeBorder 与 borderInterpolate)

    目录 前言 一.调整边缘 1.调整的目的 2.调整的方式 1.BORDER_CONSTANT 2.BORDER_REPLICATE 3.BORDER_REFLECT 4.BORDER_WRAP 5.B ...

  2. 【opencv4.3.0教程】08之图像掩膜(Mask)操作与执行时间

    目录 一.前言 二.温故知新--像素基本操作 1.获取像素指针 2.像素范围处理 3.读写像素 三.图像掩膜操作 1.怎么理解掩膜Mask 2.掩膜实现 3.API-filter2D 四.执行时间 一 ...

  3. 【opencv4.3.0教程】13之调整图像的亮度与对比度

    目录 前言 一.亮度与对比度 1.什么是亮度和对比度 2.亮度和对比度调整原理 3.亮度和对比度调整代码实现 4.API-convertScaleAbs 二.伽马校正 1.伽马校正引入 2.伽马校正原 ...

  4. 【opencv4.3.0教程】06之基础结构3之Scalar_结构详解

    目录 一.前言 二.温故知新--Rect_ 1.定义与成员变量 2.构造函数 3.常用方法 三.Scalar_ 1.定义 1.构造函数 2.基本操作 3.使用时的数据类型 2.常用方法 1.加法及加赋 ...

  5. 【opencv4.3.0教程】09之转换颜色空间(cvtColor)及类型(convertTo)

    目录 前言 一.转换颜色空间 1.什么是颜色空间 2.颜色空间有哪些 1.BGR系列 2.灰度空间 3.HSV系列 4.其他 3.API--cvtColor 4.颜色空间转换代码ColorConver ...

  6. 【opencv4.3.0教程】05之基础结构2之矩形结构Rect_详解

    目录 一.前言 二.温故知新 1.基础结构都有啥 2.Point_ 3.Size_ 三.Rect_ 1.定义 1.构造函数 2.基本操作 3.成员变量 4.使用时的数据类型 2.常用方法 1.定义中的 ...

  7. 【opencv4.3.0教程】07之像素基本操作 1 获取像素指针及控制像素范围

    目录 一.前言 二.温故知新--基本数据类型 1.最基本之Mat类 2.四大天王之Point_.Size_.Rect_.Scalar_ 3.各大分堂主 三.像素及相关概念 1.像素 2.灰度图与彩图 ...

  8. 【opencv4】opencv视频教程 C++ 6、图像混合、线性混合、混合权重相加addWeighted()、混合加add()、混合乘multiply()

    上一讲:[opencv4]opencv视频教程 C++ 5.读写图像imread.imwrite.读写像素at<>().修改像素值.ROI区域选择(图像裁剪)Rect.Vec3b与Vec3 ...

  9. Qt Creator5.12配置OpenCV4.3.0和opencv_contrib扩展包(亲测有效)

    本文结构 第一部分 只安装Qt Creator和配置OpenCV 1.Qt Creator5.12.2下载与安装 2.Cmake下载与安装 3.OpenCV下载 4.编译OpenCV 5.测试Qt程序 ...

  10. Java OpenCV-4.0.0 图像处理11 自定义图像滤波(降噪) 算子

    @[TOC](Java OpenCV-4.0.0 图像处理11 自定义图像滤波(降噪) 算子) Java OpenCV-4.0.0 自定义图像线性滤波(降噪) package com.xu.image ...

最新文章

  1. K8s, Kafka事件溯源架构模式和用例示例
  2. 非法关机 mysql_一次非法关机造成mysql数据表损坏的例子
  3. numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)
  4. Python编程核心内容 ---- Function(函数)
  5. ffmpeg (四):ffmpeg, ffplay, ffprobe用法
  6. webuploader横向按钮样式
  7. 图像处理之opencv---mat、cvmat、IplImage之间的转换
  8. 戴尔笔记本安装win10系统步骤
  9. excel 分组统计
  10. SPI,UART,I2C都有什么区别,及其各自的特点
  11. linux网卡加vlan标签,如何在 CentOS/RHEL 系统中使用带 VLAN 标记的以太网卡
  12. LeeCode 算法(Java实现)系列汇总
  13. SQL 多个字段的值拼接成Josn
  14. 解决百度云非限速版本被封下载问题
  15. 计算机实践教程采莲趣事,计算机基础作业采莲趣事
  16. 新药开发相关计算机辅助设计,研究称:药物开发将步入计算机辅助设计时代
  17. 【数据】【自动化交易】Python编写策略模拟股票交易
  18. cmpp发送超长短信息1
  19. 通信原理与MATLAB(十三):AMI的编解码
  20. python基本操作之字典

热门文章

  1. Win10锁屏壁纸图片保存
  2. html markdown写笔记,谈谈为知笔记的Markdown功能
  3. 了解5G技术与未来5G面临的问题
  4. 华为交换机不同VLAN间通信的两种主流解决方案,一分钟快速掌握
  5. CCNA-静态路由实验
  6. qt多级菜单_Qt高仿电脑管家界面(二):点击按钮弹出菜单
  7. linux调色软件,达芬奇电影级调色软件 DaVinci Resolve Lite v10.1(Win/Mac/Linux)
  8. 【时间序列】IJCAI 2021丨时间序列相关研究论文汇总
  9. AR涂涂乐⭐七、(end)取消“识别成功”提示面片、加入太阳系及其交互功能、退出按钮设置
  10. 常见的影视cms及安装环境说明