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

相关推荐
HPC_fac1305206781621 分钟前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
安静读书3 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小陈phd3 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
Guofu_Liao4 小时前
大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
人工智能·语言模型·自然语言处理·矩阵·llama
ZHOU_WUYI8 小时前
3.langchain中的prompt模板 (few shot examples in chat models)
人工智能·langchain·prompt
如若1238 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉
老艾的AI世界8 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
DK221518 小时前
机器学习系列----关联分析
人工智能·机器学习
Robot2519 小时前
Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速
人工智能·机器人·微信公众平台
浊酒南街9 小时前
Statsmodels之OLS回归
人工智能·数据挖掘·回归