目录
1 图像算术运算的介绍
在进行图像处理时有时需要对图像进行加减乘除运算,为了方便进行计算,opencv中封装了对图像进行算术运算的API函数。在opencv中的图像我们可以看作是一个矩阵,因此进行算术运算时的两个矩阵一定是具有相同的数据类型和尺寸。
1.加法运算:opencv中实现的图像加法操作中,可以采用add(intputArray src1,intputArray src2,outputArray dst)函数和”+“进行加法计算。
在进行加法操作时,由于是两个图像相加,所以,有时输出的像数值会出现超过255的情况,而两种加法操作在使用时对这个处理是不太一样的。
利用” +“进行加法计算时,如果像素超出了255,则对255取余,余数为真正的像数值。
利用”add“进行加法计算时,如果像素超出了255,则直接将像素值取为255。
2.带有权值的加法运算:对于采用权值的加法操作,可以采用addWeighted(intputArray src1,double alpha1,intputArray src2,double alpha2,double gamma, outputArray dst)函数进行计算。其运算规则如下公式所示。
3. 减法运算:opencv中实现的图像减法操作中,可以采用subtract(intputArray src1,intputArray src2,outputArray dst)函数和”-“进行减法计算。add函数像素小于0时将进行截断操作。
注意:在使用”*“计算时,输入图像的数据类型必须是CV_32FC1、CV_32FC2、CV_64FC1、CV_64FC2中的一种,不然就会报错。
4. 乘法运算:opencv中实现的图像减法操作中,可以采用multiply(intputArray src1,intputArray src2,outputArray dst)函数和”*“进行乘法计算。
在进行乘法操作时,两种方法的运算方式是不同的,具体运算将在下一节介绍。
5.除法运算:opencv中实现的图像减法操作中,可以采用divid(intputArray src1,intputArray src2,outputArray dst)函数和”/“进行除法计算。
2 图像算术运算的数学原理
在opencv中的图像我们可以看作是一个矩阵,因此对图像进行算术运算时应符合矩阵算术运算规则。接下来以图像的乘法为例,讲解图像运算得数学原理。
假设图像a和图像b是3*3的图像,我们可以看作是一个3*3的矩阵。
在”*“的乘法运算规则中,"*"乘的运算结果为c(3*3),c中的每一个元素都应符合:
在使用函数multiply()函数时,运算结果为c(3*3),c中的每一个元素都应符合:
3 图像算术运算代码实现
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat a = (Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
Mat b = (Mat_<int>(3, 3) << 9, 8, 7, 6, 5, 4, 3, 2, 1);
//加法操作
Mat c = a + b;
Mat d;
add(a, b, d);
带权值的加法操作
Mat e;
addWeighted(a, 0.8, b, 0.3, 50, e);
减法操作
Mat f = a - b;
Mat g;
add(a, b, g);
Mat a1 = (Mat_<double>(3, 3) << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
Mat b1 = (Mat_<double>(3, 3) << 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
乘法操作
Mat h = a1 * b1;
Mat i;
multiply(a, b, i);
除法操作
Mat j = a / b;
Mat k;
multiply(a, b, k);
cout << " +:" << c << endl;
cout << " 加法:" << d << endl;
cout << "带权值 加法:" << e << endl;
cout << " -:" << f << endl;
cout << " 减法:" << g << endl;
cout << " *:" << h << endl;
cout << " 乘法:" << i << endl;
cout << " /:" << g << endl;
cout << " 除法:" << k << endl;
return 0;
}