OpenCV 图像像素的算术操作

一、知识点
1、operator+
  (1)、MatExpr operator + (const Mat & a, const Mat & b);
      a、a和b的行数、列数、通道数得相同。
      b、a和b的每个像素的每个通道值分别相加。
  (2)、MatExpr operator + (const Mat & a, const Scalar & s);
      a、若a的通道数和s的标量数相同,则a每个像素的每个通道值和s的每个标量数分别相加。
      b、若a的通道数和s的标量数不同,则a每个像素的前几个通道值和s的前几个标量数分别相加。
  (3)、MatExpr operator + (const Scalar & s, const Mat & a);
      a、若s的标量数和a的通道数相同,则s的每个标量数和a每个像素的每个通道值分别相加。
      b、若s的标量数和a的通道数不同,则s的前几个标量数和a每个像素的前几个通道值分别相加。

2、operator-
  (1)、MatExpr operator - (const Mat & a, const Mat & b);
      a、a和b的行数、列数、通道数得相同。
      b、a和b的每个像素的每个通道值分别相减。
  (2)、MatExpr operator - (const Mat & a, const Scalar & s);
      a、若a的通道数和s的标量数相同,则a每个像素的每个通道值和s的每个标量数分别相减; 
      b、若a的通道数和s的标量数不同,则a每个像素的前几个通道值和s的前几个标量数分别相减。
  (3)、MatExpr operator - (const Scalar & s, const Mat & a);
      a、若s的标量数和a的通道数相同,则s的每个标量数和a每个像素的每个通道值分别相减; 
      b、若s的标量数和a的通道数不同,则s的前几个标量数和a每个像素的前几个通道值分别相减。
     
3、operator*
  (1)、MatExpr operator * (const Mat & a, const Mat & b);
      a、a和b矩阵点乘。
      b、a的列数和b的行数得相同。
      c、a和b的数据类型只能是CV_32FC1、CV_64FC1、CV_32FC2、CV_64FC2中的一种,其它类型如CV_8UC1,编译器会报错。
  (2)、MatExpr operator * (const Mat & a, double s);
      a、a的每个像素的每个通道值分别和s相乘。
  (3)、MatExpr operator * (double s, const Mat & a);
      a、s和a的每个像素的每个通道值分别相乘。
      
4、operator/
  (1)、MatExpr operator / (const Mat & a, const Mat & b);
      a、a和b的行数、列数、通道数得相同。
      b、a和b的每个像素的每个通道值分别相除。
  (2)、MatExpr operator / (const Mat & a, double s);
      a、a的每个像素的每个通道值除以s。
  (3)、MatExpr operator / (double s, const Mat & a);
      a、s除以a的每个像素的每个通道值。
      
5、add()
  (1)、void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);
  (2)、参数说明:
      src1: 第1个输入数组,通常是Mat对象。
      src2: 第2个输入数组,通常是Mat对象。
      dst: 输出数组,src1和src2逐元素相加后的结果。
      mask: 掩码数组,用于指定哪些元素做加法操作。 默认为noArray(),则对所有元素进行操作。
      dtype: 输出数组的数据类型,默认值-1,表示输出数组与输入数组的数据类型相同。
  (3)、src1和src2的每个像素的每个通道值都会独立相加,所以src1和src2的行、列、通道数要相同。
  
6、subtract()
  (1)、void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);
  (2)、参数说明:
      src1: 第1个输入数组,通常是Mat对象。
      src2: 第2个输入数组,通常是Mat对象。
      dst: 输出数组,src1和src2逐元素相减后的结果。
      mask: 掩码数组,用于指定哪些元素做减法操作。 默认为noArray(),则对所有元素进行操作。
      dtype: 输出数组的数据类型,默认值-1,表示输出数组与输入数组的数据类型相同。
  (3)、src1和src2的每个像素的每个通道值都会独立相减,所以src1和src2的行、列、通道数要相同。
      
7、multiply()
  (1)、void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1);
  (2)、参数说明:
      src1: 第1个输入数组,通常是Mat对象。
      src2: 第2个输入数组,通常是Mat对象。
      dst: 输出数组,src1和src2逐元素相乘后的结果。
      scale: 缩放因子,结果会被此因子缩放,默认值1。
      dtype: 输出数组的数据类型,默认值-1,表示输出数组与输入数组的数据类型相同。
  (3)、src1和src2的每个像素的每个通道值都会独立相乘,所以src1和src2的行、列、通道数要相同。
  
8、divide()
  (1)、void divide(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1);
  (2)、参数说明:
      src1: 第1个输入数组,通常是Mat对象。
      src2: 第2个输入数组,通常是Mat对象。
      dst: 输出数组,src1和src2逐元素相除后的结果。
      scale: 缩放因子,结果会被此因子缩放,默认值1。
      dtype: 输出数组的数据类型,默认值-1,表示输出数组与输入数组的数据类型相同。
  (3)、src1和src2的每个像素的每个通道值都会独立相除,所以src1和src2的行、列、通道数要相同。
  
9、注意: 有些结果数据因超过数据类型的最大范围,会被截断。 如数据类型8U,则数据300就只能被截断为255。
  
10、saturate_cast:
  (1)、template<typename _Tp> 
      _Tp saturate_cast(ArgType v);
  (2)、将一个值v转换为_Tp类型的值,并确保转换过程中值不会超出_Tp取值范围。
  
  
二、示例代码和输出结果:

#include <iostream>
#include <opencv2/opencv.hpp>int main()
{cv::Mat m1(3, 3, CV_8UC3, cv::Scalar(20, 40, 30));cv::Mat m2(3, 3, CV_8UC3, cv::Scalar(10, 20, 15));std::cout << "m1:" << std::endl << m1 << std::endl;std::cout << "m2:" << std::endl << m2 << std::endl;cv::Mat m3 = cv::Mat::ones(3, 3, CV_32FC1);cv::Mat m4 = cv::Mat::ones(3, 3, CV_32FC1);m3.at<float>(1, 1) = 30;m4.at<float>(1, 1) = 5;m3.at<float>(0, 2) = 24;m4.at<float>(0, 2) = 6;std::cout << "m3:" << std::endl << m3 << std::endl;std::cout << "m4:" << std::endl << m4 << std::endl;cv::Scalar s1(10, 11, 12);cv::Scalar s2(100, 110, 120);//MatExpr operator + (const Mat & a, const Mat & b);cv::Mat dst1 = m1 + m2;std::cout << "dst1:" << std::endl << dst1 << std::endl;//MatExpr operator + (const Mat & a, const Scalar & s);cv::Mat dst2 = m1 + s1;std::cout << "dst2:" << std::endl << dst2 << std::endl;//MatExpr operator + (const Scalar & s, const Mat & a);cv::Mat dst3 = s1 + m1;std::cout << "dst3:" << std::endl << dst3 << std::endl;//MatExpr operator - (const Mat & a, const Mat & b);cv::Mat dst4 = m1 - m2;std::cout << "dst4:" << std::endl << dst4 << std::endl;//MatExpr operator - (const Mat & a, const Scalar & s);cv::Mat dst5 = m1 - s1;std::cout << "dst5:" << std::endl << dst5 << std::endl;//MatExpr operator - (const Scalar & s, const Mat & a);cv::Mat dst6 = s2 - m1;std::cout << "dst6:" << std::endl << dst6 << std::endl;//MatExpr operator * (const Mat & a, const Mat & b); cv::Mat dst7 = m3 * m4;std::cout << "dst7:" << std::endl << dst7 << std::endl;//MatExpr operator * (const Mat & a, double s);cv::Mat dst8 = m1 * 2;std::cout << "dst8:" << std::endl << dst8 << std::endl;//MatExpr operator * (double s, const Mat & a);cv::Mat dst9 = 2 * m1;std::cout << "dst9:" << std::endl << dst9 << std::endl;//MatExpr operator / (const Mat & a, const Mat & b);cv::Mat dst10 = m3 / m4;std::cout << "dst10:" << std::endl << dst10 << std::endl;//MatExpr operator / (const Mat & a, double s);cv::Mat dst11 = m1 / 10;std::cout << "dst11:" << std::endl << dst11 << std::endl;//MatExpr operator / (double s, const Mat & a);cv::Mat dst12 = 240 / m1;std::cout << "dst12:" << std::endl << dst12 << std::endl;//void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);cv::Mat dst13;cv::add(m1, m2, dst13);std::cout << "dst13:" << std::endl << dst13 << std::endl;//void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1);cv::Mat dst14;cv::subtract(m1, m2, dst14);std::cout << "dst14:" << std::endl << dst14 << std::endl;//void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1);cv::Mat dst15;cv::multiply(m3, m4, dst15);std::cout << "dst15:" << std::endl << dst15 << std::endl;//void divide(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1);cv::Mat dst16;cv::divide(m1, m2, dst16);std::cout << "dst16:" << std::endl << dst16 << std::endl;//saturate_castint dst17 = cv::saturate_cast<uchar>(310);std::cout << "dst17:" << std::endl << dst17 << std::endl;system("pause");return 0;
}输出结果:
m1:
[ 20,  40,  30,  20,  40,  30,  20,  40,  30;20,  40,  30,  20,  40,  30,  20,  40,  30;20,  40,  30,  20,  40,  30,  20,  40,  30]
m2:
[ 10,  20,  15,  10,  20,  15,  10,  20,  15;10,  20,  15,  10,  20,  15,  10,  20,  15;10,  20,  15,  10,  20,  15,  10,  20,  15]
m3:
[1, 1, 24;1, 30, 1;1, 1, 1]
m4:
[1, 1, 6;1, 5, 1;1, 1, 1]
dst1:
[ 30,  60,  45,  30,  60,  45,  30,  60,  45;30,  60,  45,  30,  60,  45,  30,  60,  45;30,  60,  45,  30,  60,  45,  30,  60,  45]
dst2:
[ 30,  51,  42,  30,  51,  42,  30,  51,  42;30,  51,  42,  30,  51,  42,  30,  51,  42;30,  51,  42,  30,  51,  42,  30,  51,  42]
dst3:
[ 30,  51,  42,  30,  51,  42,  30,  51,  42;30,  51,  42,  30,  51,  42,  30,  51,  42;30,  51,  42,  30,  51,  42,  30,  51,  42]
dst4:
[ 10,  20,  15,  10,  20,  15,  10,  20,  15;10,  20,  15,  10,  20,  15,  10,  20,  15;10,  20,  15,  10,  20,  15,  10,  20,  15]
dst5:
[ 10,  29,  18,  10,  29,  18,  10,  29,  18;10,  29,  18,  10,  29,  18,  10,  29,  18;10,  29,  18,  10,  29,  18,  10,  29,  18]
dst6:
[ 80,  70,  90,  80,  70,  90,  80,  70,  90;80,  70,  90,  80,  70,  90,  80,  70,  90;80,  70,  90,  80,  70,  90,  80,  70,  90]
dst7:
[26, 30, 31;32, 152, 37;3, 7, 8]
dst8:
[ 40,  80,  60,  40,  80,  60,  40,  80,  60;40,  80,  60,  40,  80,  60,  40,  80,  60;40,  80,  60,  40,  80,  60,  40,  80,  60]
dst9:
[ 40,  80,  60,  40,  80,  60,  40,  80,  60;40,  80,  60,  40,  80,  60,  40,  80,  60;40,  80,  60,  40,  80,  60,  40,  80,  60]
dst10:
[1, 1, 4;1, 6, 1;1, 1, 1]
dst11:
[  2,   4,   3,   2,   4,   3,   2,   4,   3;2,   4,   3,   2,   4,   3,   2,   4,   3;2,   4,   3,   2,   4,   3,   2,   4,   3]
dst12:
[ 12,   6,   8,  12,   6,   8,  12,   6,   8;12,   6,   8,  12,   6,   8,  12,   6,   8;12,   6,   8,  12,   6,   8,  12,   6,   8]
dst13:
[ 30,  60,  45,  30,  60,  45,  30,  60,  45;30,  60,  45,  30,  60,  45,  30,  60,  45;30,  60,  45,  30,  60,  45,  30,  60,  45]
dst14:
[ 10,  20,  15,  10,  20,  15,  10,  20,  15;10,  20,  15,  10,  20,  15,  10,  20,  15;10,  20,  15,  10,  20,  15,  10,  20,  15]
dst15:
[1, 1, 144;1, 150, 1;1, 1, 1]
dst16:
[  2,   2,   2,   2,   2,   2,   2,   2,   2;2,   2,   2,   2,   2,   2,   2,   2,   2;2,   2,   2,   2,   2,   2,   2,   2,   2]
dst17:
255

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频中的复用器

&#x1f3ac; 什么是复用器&#xff08;Muxer&#xff09;&#xff1f; 复用器&#xff08;muxer&#xff09;是负责把音频、视频、字幕等多个媒体流打包&#xff08;封装&#xff09;成一个单一的文件格式的组件。 &#x1f4a1; 举个形象的例子&#xff1a; 假设你有两样东…

数据库安全性

一、计算机安全性概论 &#xff08;一&#xff09;核心概念 数据库安全性&#xff1a;保护数据库免受非法使用导致的数据泄露、更改或破坏&#xff0c;是衡量数据库系统的关键指标之一&#xff0c;与计算机系统安全性相互关联。计算机系统安全性&#xff1a;通过各类安全保护…

【Linux网络编程】网络层IP协议

目录 IP协议的协议头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 IP协议的协议头格式 4位版本号 &#xff1a;指定IP协议的版本&#xff0c;对于IPv4&#xff0c;版本号就是4。 4位首部长度&#xff1a;表名IP协议报头的长度&#xff0c;单…

“候选对话链”(Candidate Dialogue Chain)概念

目录 一、定义与形式 二、生成过程详解 1. 语言模型生成&#xff08;LLM-Based Generation&#xff09; 2. 知识图谱支持&#xff08;KG-Augmented Generation&#xff09; 3. 策略调控&#xff08;Policy-Driven Planning&#xff09; 三、候选对话链的属性 四、候选对…

Unity中的JsonManager

1.具体代码 先贴代码 using LitJson; using System.IO; using UnityEngine;/// <summary> /// 序列化和反序列化Json时 使用的是哪种方案 有两种 JsonUtility 不能直接序列化字典 ligJson可以序列化字典 /// </summary> public enum JsonType {JsonUtilit…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Split Landing Page(拆分展示页)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— SplitLandingPage 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 在这篇文章中&#xff0c;我们将实现一个交互式的左右面板…

机器学习-ROC曲线​​ 和 ​​AUC指标

1. 什么是ROC曲线&#xff1f;​​ ROC&#xff08;Receiver Operating Characteristic&#xff0c;受试者工作特征曲线&#xff09;是用来评估​​分类模型性能​​的一种方法&#xff0c;特别是针对​​二分类问题​​&#xff08;比如“患病”或“健康”&#xff09;。 ​…

Docker容器创建Redis主从集群

利用虚拟机中的三个Docker容器创建主从集群&#xff0c;容器信息&#xff1a; 容器名角色IP映射端口r1master192.168.150.1017001r2slave192.168.150.1017002r3slave192.168.150.1017003 启动多个redis实例 新建一个docker-compose文件来构建主从集群&#xff1a; 文件内容&…

手写ArrayList和LinkedList

项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tear-collection-series 基于b站up生生大佬&#xff1a;https://www.bilibili.com/video/BV1Kp5tzGEc5/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 LinkedList package com…

每日c/c++题 备战蓝桥杯(Cantor 表)

Cantor 表的探究与实现 在数学中&#xff0c;有理数的可枚举性是一个令人惊叹的结论。今天&#xff0c;就让我们一起深入探讨这个经典问题&#xff0c;并分享一段精心编写的代码&#xff0c;揭开这一数学奥秘的神秘面纱。 问题背景 在 19 世纪末&#xff0c;伟大的数学家康托…

解决idea与springboot版本问题

遇到以下问题&#xff1a; 1、springboot3.2.0与jdk1.8 提示这个包org.springframework.web.bind.annotation不存在&#xff0c;但是pom已经引入了spring-boot-starter-web 2、Error:Cannot determine path to tools.jar library for 17 (D:/jdk17) 3、Error:(3, 28) java: …

Notepad++找回自动暂存的文件

场景&#xff1a; 当你没有保存就退出Notepad&#xff0c;下次进来Notepad会自动把你上次编辑的内容显示出来&#xff0c;以便你继续编辑。除非你手动关掉当前页面&#xff0c;这样Notepad就会删除掉自动保存的内容。 问题&#xff1a; Notepad会将自动保存的文件地址,打开Note…

yolov12毕设前置知识准备 1

1 什么是目标检测呢&#xff1f; 目标检测&#xff08;Object Detection&#xff09;主要用于识别图像或视频中特定类型物体的位置&#xff0c;并标注其类别。 简单来说&#xff0c;就是让计算机像人类一样 “看懂” 图像内容&#xff0c;不仅能识别出物体&#xff08;如人、…

unix/linux source 命令,其内部结构机制

要理解 source (或 .) 命令的内部结构机制,我们需要戴上“操作系统”和“解释器设计”的眼镜,深入到 Shell 如何管理其状态以及如何执行命令的层面。 虽然我们无法直接看到 Shell 内部的 C 代码(除非我们去阅读 Bash 或 Zsh 的源码),但我们可以基于其行为和操作系统的原理…

计算机网络学习20250528

地址解析协议ARP 实现IP地址和Mac地址的转换 ARP工作原理&#xff1a; 每台主机或路由器都有一个ARP表&#xff0c;表项&#xff1a;<IP地址&#xff0c;Mac地址&#xff0c;TTL>&#xff08;TTL一般为20分钟&#xff09; 主机产生ARP查询分组&#xff0c;包含源目的IP地…

【Rust】Rust获取命令行参数以及IO操作

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

微服务中引入公共拦截器

本文使用的微服务版本为springcloudAlbaba :2021.0.4.0 微服务工程&#xff0c;一般公共的东西都放入一个工程&#xff0c;别的微服务都会引入这个工程&#xff0c;比如common-service,那么就可以在这个工程编写一个拦截器&#xff1a;&#xff0c;比如&#xff1a; public cla…

Linux SLES 系统的/var/log/下的常见文件及其作用

在 SUSE Linux Enterprise Server&#xff08;SLES&#xff09; 系统中&#xff0c;/var/log/ 目录是系统日志的集中地&#xff0c;存储了各种服务、内核、系统消息的日志。以下是一些在 /var/log/ 下常见的日志文件及其功能&#xff1a; &#x1f4c2; 常见日志文件及功能 文…

oracle goldengate同步SQL server到SQL server的实时数据同步

参考文档 https://docs.oracle.com/en/middleware/goldengate/core/19.1/oggmp/oracle-goldengate-classic-sql-server.html#GUID-948C5BEE-E7A0-4CE2-BE09-F83145677D18 https://docs.oracle.com/en/middleware/goldengate/core/21.3/ggcab/other-programs-and-settings-sql-…

语音转文字工具

平时工作和学习比较忙&#xff0c;可能没时间听讲座&#xff0c;只能看回放&#xff0c;回访也很长&#xff0c;这时&#xff0c;我们可以借助语言转文字&#xff0c;通过阅读文字快速了解讲座的重点&#xff0c;今天给大家分享一个本人经常用的语言转文字工具&#xff0c;改工…