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

装载有图像数据的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(),

intdtype = -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

相关推荐
凯子坚持 c6 分钟前
StreamingLLM:无需训练即可支持无限上下文的推理技术
人工智能
Tfly__6 分钟前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
LLWZAI6 分钟前
让朱雀AI检测无法判断的AI公众号文章,当创作者开始与算法「躲猫猫」
大数据·人工智能·深度学习
nLsUCWFJR18 分钟前
(Matlab)基于贝叶斯优化卷积双向长短期记忆网络(CNN-BiLSTM)回归预测
opencv
深圳市九鼎创展科技19 分钟前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
HELLO程序员24 分钟前
Claude Code 2.1 发布:2026 年 AI 智能体开发的范式革命
人工智能
DFCED28 分钟前
OpenClaw部署实战:5分钟搭建你的专属AI数字员工(附避坑指南)
人工智能·大模型·agent·openclaw
Java新手村29 分钟前
基于 Vue 3 + Spring Boot 3 的 AI 面试辅助系统:实时语音识别 + 大模型智能回答
vue.js·人工智能·spring boot
Junlan2738 分钟前
Cursor使用入门及连接服务器方法(更新中)
服务器·人工智能·笔记
robot_learner43 分钟前
OpenClaw, 突然走红的智能体
人工智能