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
繁體地址,請注明出處:http://hk.pswp.cn/web/82225.shtml
英文地址,請注明出處:http://en.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;改工…