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

相关推荐
weixin_4462608511 小时前
ORCA-bench:大模型智能体能否胜任线上故障值守?
人工智能
fthux11 小时前
装闭 RenoPit 源码解析(13):生成AI装修闭坑PDF报告
人工智能·ai·pdf·开源·github
独行侠影a11 小时前
Mojo:专为AI而生的“Python++”,能否真正挑战CUDA与C++的统治地位?
大数据·人工智能·深度学习
zzzzzz31011 小时前
别让大模型直接碰业务:我在 Spring Boot 里给 AI 操作加了一道“可拒绝的闸门”
人工智能·spring boot·spring
2601_9609067211 小时前
一致行动人合计持股比例变动超过1%整数倍
人工智能·逻辑回归·爬山算法·散列表·启发式算法·广度优先
蓝鲨硬科技12 小时前
任利锋的“造物”野心,让AI 3D进入“可制造”时代
人工智能·3d·制造
暗黑小白12 小时前
Agent 运行时与 Harness:从教科书循环到生产级运行时
人工智能
烂蜻蜓12 小时前
AI入门教程(十七):AI安全进阶——越狱、注入、对抗与防护
人工智能·ai
小K讲AI营销12 小时前
存储定价权重构:用“产能分配“框架重估 DRAM+46%、NAND+65%
人工智能