2.图像的算术运算

目录

         1 图像算术运算的介绍

2 图像算术运算的数学原理

3 图像算术运算代码实现

        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)函数进行计算。其运算规则如下公式所示。

dst = src1 [I]*alpha1+ src2[I]*alpha2+ gamma;

       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的矩阵。

a =\begin{bmatrix} a11 & a12 & a13\\ a21& a22& a23\\ a31 & a32& a33 \end{bmatrix}

b =\begin{bmatrix} b11 & b12 & b13\\ b21& b22& b23\\ b31 & b32& b33 \end{bmatrix}

 在”*“的乘法运算规则中,"*"乘的运算结果为c(3*3),c中的每一个元素都应符合:

cij = ai1\times b1j+ai2\times b2j+ai3\times b3j

在使用函数multiply()函数时,运算结果为c(3*3),c中的每一个元素都应符合:

cij = aij\times bij

        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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别叭叭儿—好好学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值