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

相关推荐
qq_43696218几秒前
AI数据分析的利器:解锁BI工具的无限潜力
人工智能·数据挖掘·数据分析·ai数据分析
热水养鲨鱼7 分钟前
Java实现HTML转PDF(deepSeekAi->html->pdf)
人工智能·pdf·html
灏瀚星空9 分钟前
Python在AI虚拟教学视频开发中的核心技术与前景展望
人工智能·python·音视频
qyresearch_12 分钟前
全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)
大数据·人工智能
豆芽8191 小时前
图解YOLO(You Only Look Once)目标检测(v1-v5)
人工智能·深度学习·学习·yolo·目标检测·计算机视觉
算力云1 小时前
深度剖析!GPT-image-1 API 开放对 AI 绘画技术生态的冲击!
人工智能·openai图像生成模型·gpt-image-1
孤寂码农_defector1 小时前
AI 人工智能模型:从理论到实践的深度解析⚡YQW · Studio ⚡【Deepseek】【Chat GPT】
人工智能
北上ing1 小时前
从FP32到BF16,再到混合精度的全景解析
人工智能·pytorch·深度学习·计算机视觉·stable diffusion
小奕同学A1 小时前
数字化技术的五个环节:大数据、云计算、人工智能、区块链、移动互联网
大数据·人工智能·云计算
Eric.Lee20212 小时前
数据集-目标检测系列- F35 战斗机 检测数据集 F35 plane >> DataBall
人工智能·算法·yolo·目标检测·计算机视觉