OpenCV Mat实现图像四则运算及常用四则运算的API函数

news2024/11/28 14:35:47

       装载有图像数据的OpenCV Mat对象,可以说是一个图像矩阵,可以进行加、减、乘、除运算。特别是加运算特别有用。

       一 与常数的四则运算

           与常数的加运算  示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("3.jpeg");
	if (src1.empty())
	{
		cout << "Open Image Failed!" << endl;
	}
	else
		imshow("src1",src1);

	src1 += 30;
	 imshow("src1 new", src1);
	
	
	waitKey(0);
  
}

示例代码中 src1 +=  30;即为与常数加运算代码,试运行结果如下:

图像亮度变亮了。

        与常数的加运算  示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("3.jpeg");
	if (src1.empty())
	{
		cout << "Open Image Failed!" << endl;
	}
	else
		imshow("src1",src1);

	src1 -= 30; //subtract
	 imshow("src1 new", src1);
	
	
	waitKey(0);
  
}

示例代码中 src1 -=  30;即为与常数加减算代码,试运行结果如下:

图像整体变暗了。

        与常数的乘运算  示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("3.jpeg");
	if (src1.empty())
	{
		cout << "Open Image Failed!" << endl;
	}
	else
		imshow("src1",src1);

	src1 *= 1.2; //Multiply 
	 imshow("src1 new", src1);
	
	
	waitKey(0);
  
}

示例代码中 src1 *=  1.2;即为与常数乘减算代码,试运行结果如下:

图像亮度变亮了。

          与常数的除运算  示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("3.jpeg");
	if (src1.empty())
	{
		cout << "Open Image Failed!" << endl;
	}
	else
		imshow("src1",src1);

	src1 /= 1.5; //divide
	 imshow("src1 new", src1);
	
	
	waitKey(0);
  
}

示例代码中 src1 *=  1.2;即为与常数乘减算代码,试运行结果如下:

图像整体变暗了很多。 

        常用加运算函数

        OpenCV 图像矩阵常用加运算函数有:addWeighted,add,scaleAdd等。

        addWeighted()

        addWeighted()的原型函数如下:

void cv::addWeighted(InputArray  src1,

                                     double      alpha,

                                     InputArray src2,

                                    double       beta,

                                    double      gamma,

                                   OutputArray  dst,

                                   int                 dtype = -1

             )

这个函数是计算两个数组的加权和,其计算方式如下;

其中 I 是数组元素的多维索引。对于多通道阵列,每个通道都是独立处理的。该函数可以用矩阵表达式替换:

参数:

       src1 第一个输入数组。 

       alpha 第一个数组的权重

       src2 第二个输入数组。

       beta 第一个数组的权重

        gamma 添加到每个总和的标量

        dst 输出数组与输入数组具有相同的大小和通道数。

       dtype 输出数组的可选深度;当两个输入数组具有相同的深度时,dtype 可以设置为-1,这相当于 src1.depth()。

     示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	//addWeighted()
	Mat src1 = imread("3.jpeg");
	if (src1.empty())
	{
		cout << "Open Image Failed!" << endl;
		return -1;
	}
	imshow("src1",src1);

	Mat src2 = imread("1.bmp");
	if (src2.empty())
	{
		cout << "Open Image Failed!" << endl;
		return -1;
	}
	imshow("src2", src2);
	
	resize(src2, src2, src1.size());
	Mat dst;
	addWeighted(src1, 1.0, src2, 0.3, 0, dst, -1);
	imshow("dst", dst);
	
	waitKey(0);
  
}

试运行,结果如下:

用addWeighted(),将左边的两张图合成到一起了。

        add()

add()函数的原型如下:

void cv::add(InputArray src1,

                        InputArray  src2,

                        OutputArray dst,

                        InputArray    mask = noArray(),

         int    dtype = -1

        )

其原理如下: 

        示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("1.jpeg");
	if (src1.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src1", src1);

	Mat src2 = imread("2.bmp");
	if (src2.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src2", src2);
	resize(src2, src2, src1.size());
	Mat dst;
	add(src1, src2, dst);
	imshow("dst", dst);

	waitKey(0);

}

试运行,结果如下:

        

用Add同样实现了图像合成。 

        scaleAdd()

        scaleAdd()函数的原型如下:

void cv::scaleAdd(InputArray src1,

                                double alpha,

                                InputArray src2,

                              OutputArray dst

                                )

其原理如下:

示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("1.jpeg");
	if (src1.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src1", src1);

	Mat src2 = imread("2.bmp");
	if (src2.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src2", src2);
	resize(src2, src2, src1.size());
	Mat dst;
	//add(src1, src2, dst);
	scaleAdd(src1, 0.7, src2, dst);
	imshow("dst", dst);

	waitKey(0);

}

试运行,结果如下:

     减运算函数subtract()

subtract的·原型如下:

其原理如下:

示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("1.jpeg");
	if (src1.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src1", src1);

	Mat src2 = imread("2.bmp");
	if (src2.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src2", src2);
	resize(src2, src2, src1.size());
	Mat dst;
	//add(src1, src2, dst);
	//aleAdd(src1, 0.7, src2, dst);
	subtract(src1, src2, dst);
	
	imshow("dst", dst);

	waitKey(0);

}

试运行,结果如下:

        乘运算multiply()

multiply()函数的原型如下:

其原理如下:

示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("1.jpeg");
	if (src1.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src1", src1);

	Mat src2 = imread("2.bmp");
	if (src2.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src2", src2);
	resize(src2, src2, src1.size());
	Mat dst;
	//add(src1, src2, dst);
	//aleAdd(src1, 0.7, src2, dst);
	//subtract(src1, src2, dst);
	multiply(src1, src2, dst,0.01);
	
	imshow("dst", dst);

	waitKey(0);

}

试运行,结果如下:

         除运算divide()

divide()函数的原型如下:

其原理如下:

示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src1 = imread("1.jpeg");
	if (src1.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src1", src1);

	Mat src2 = imread("2.bmp");
	if (src2.empty())
	{
		cout << "Cann't open the Image" << endl;
		return -1;
	}
	imshow("src2", src2);
	resize(src2, src2, src1.size());
	Mat dst;
	//add(src1, src2, dst);
	//aleAdd(src1, 0.7, src2, dst);
	//subtract(src1, src2, dst);
	//multiply(src1, src2, dst,0.01);
	divide(src1, src2, dst, 70);
	
	imshow("dst", dst);

	waitKey(0);

}

试运行,结果如下:

本文就介绍到这里,示例代码及所用到的图片已上传到CSDN,如果需要自己查看试运行效果,可以去下载,链接为:https://download.csdn.net/download/billliu66/89469718

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

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

相关文章

Google Adsense----Wordpress插入谷歌广告

1.搭建个人博客,绑定谷歌search consol,注册adsense 详细可以参考这个视频b站视频 2.将个人博客网站关联到Adsense 在adsense里新加网站,输入你的博客网址,双击网站 将这段代码复制到header.php的里面 在wordpress仪表盘的外观-主题文件编辑器,找到header.php将代码复制,…

有玩家在2011年的MacBook上成功运行了Windows XP 还安装了触摸屏

我们已经在许多不同的设备上看到过 Windows XP 正在运行。这个古老的操作系统于 2001 年正式推出&#xff0c;现在已经老到其最后一次软件更新是在近十年前。一位好奇的玩家试图在 2011 年的触摸屏 MacBook 上为 Windows XP 打造了一个新家&#xff0c;复古技术探索者 Michael …

vmware虚拟机安装ubuntu20.04

1.下载Ubuntu 20.04的ISO镜像 Index of /ubuntu-releases/ 2.安装VMware 3.创建新的虚拟机&#xff1a;打开VMware&#xff0c;选择“创建新的虚拟机”或通过文件菜单新建虚拟机。 4.选择典型&#xff0c;然点点击下一步&#xff1a; 5.选择稍后安装操作系统&#xff1a; 6.…

LLC开关电源开发:第四节,LLC软件设计报告

LLC源代码链接 数控全桥LLC开发板软件设计报告  1. LLC硬件及软件框架2. LLC软件设计2.1 工程文件说明2.2 LLC中断设计2.2.1 20us中断2.2.2 5ms中断 2.3 LLC状态机设计2.3.1 初始化状态2.3.2 空闲状态2.3.3 软启动状态2.3.4 正常运行状态2.3.5 故障状态 2.4 环路设计2.4.1 环路…

1095 解码PAT准考证(测试点3)

solution 测试点3超时&#xff1a;命令为3时&#xff0c;用unordered_map而非map&#xff0c;否则会超时 #include<iostream> #include<string> #include<algorithm> #include<unordered_map> using namespace std; const int maxn 1e4 10; struct…

实战|YOLOv10 自定义目标检测

引言 YOLOv10[1] 概述和使用自定义数据训练模型 概述 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10&#xff0c;通过优化模型结构并去除非极大值抑制&#xff08;NMS&#xff09;环节&#xff0c;提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领…

Appium + Python App自动化第一个脚本

今天跟大家讲解一个Appium和Python App自动化的脚本。 【1】打开你的夜神模拟器&#xff08;或者连接你的手机&#xff09; 【2】打开桌面的Appium 【3】下载你要测的App的apk文件&#xff0c;放到桌面 【4】拖动你的apk安装包到夜神模拟器里&#xff0c;然后模拟器会提示你…

pyinstaller, cx_Freeze打包 pyqt 桌面应用-实操

1 pyinstaller 打包成 exe 参考这个连接&#xff0c; 写的比较全面&#xff1a; https://blog.csdn.net/qq_48979387/article/details/132359366 唯一发现一个错误是增加资源文件时候的分隔符(-add-data SOURCE:DEST)&#xff0c; 按照自己环境的实际的情况来&#xff1a; $…

CS162 Operating System-lecture2

A tread is suspended or no longer executing when its state’s not loaded in registers the point states is pointed at some other thread .so the thread that’s suspended is actually siting in memory and not yet executing or not executing at all with some thi…

探索Linux的奇妙世界:第二关---Linux的基本指令1

1. xshell与服务器的连接 想必大家在看过上一期视频时已经搭建好了Linux的环境了并且已经下好了终端---xshell了吧?让我来带大家看一看下好了是什么样子的: 第一次登陆会让你连接你的服务器,就是我们买的云服务器,买完之后需要把公网地址ip复制过来进行链接,需要用户名和密码连…

Node.js 渲染三维模型并导出为图片

Node.js 渲染三维模型并导出为图片 1. 前言 本文将介绍如何在 Node.js 中使用 Three.js 进行 3D 模型渲染。通过结合 gl 和 canvas 这两个主要依赖库&#xff0c;我们能够在服务器端实现高效的 3D 渲染。这个方法解决了在服务器端生成和处理 3D 图形的需求&#xff0c;使得可…

intouch的报警怎么发到企业微信机器人

厂务报警通知系列博客目录 intouch的报警怎么发到微信上 intouch的报警怎么发到邮件上 intouch的报警怎么发到短信上 intouch的报警怎么发到企业微信机器人 intouch的报警怎么发到飞书机器人 intouch的报警怎么用语音通知到手机用户 创建企业微信群机器人 打开企业微信客…

idea导入项目右侧maven不显示的解决办法

不显示情况&#xff1a; 原因可能是读取项目出错&#xff0c;未正确加载pom文件造成的。 解决方案一&#xff1a; 关闭idea在项目目录中删除.idea文件夹重新打开项目&#xff0c;重新加载。 解决犯案二&#xff1a; 直接在pom文件中右键选择add as maven project。 解决方案三…

【会议征稿,JPCS出版】第三届电力系统与能源技术国际学术会议(ICPSET 2024,7月5-7)

第三届电力系统与能源技术国际学术会议&#xff08;ICPSET 2024&#xff09;将于2024年7月5-7日在杭州举办。由浙江水利水电学院电机产业学院主办&#xff0c;AEIC学术交流中心承办&#xff0c;湖州市南浔创新研究院、南浔区科技局&#xff08;科协&#xff09;协办 。会议主要…

2024年全国青少信息素养大赛python编程复赛集训第九天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…

基于SpringBoot+Vue大学生网络教学平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

LeetCode26. 删除有序数组中的重复项题解

LeetCode26. 删除有序数组中的重复项题解 题目链接&#xff1a; https://leetcode.cn/problems/remove-duplicates-from-sorted-array 题目描述&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一…

Android记录3--ExpandableListView使用+获取SIM卡状态信息

布局文件&#xff1a; /SIM_Card_Demo/res/layout/inbox.xml <LinearLayout xmlns:android“http://schemas.android.com/apk/res/android” xmlns:tools“http://schemas.android.com/tools” android:layout_width“match_parent” android:layout_height“match_par…

终于找到了免费的云服务器

今天朋友推荐了一个免费的云服务器&#xff1a;“阿贝云” 我最喜欢的是它的"免费虚拟主机"“免费云服务器”&#xff0c;省了我好多钱&#xff0c;我的使用感受是用起来经济实惠省心&#xff0c;不要钱的东西谁不喜欢呢&#xff0c;对于普通开发者来说&#xff0c;…