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