四、openCV4.9.0教程 addWeighted函数

一、addWeighted函数  

       Weight [ˈweɪt] 权重。通过改变权重使两个Mat融合在一起
void addWeighted(InputArray src1, double alpha,

                             InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)

第一个参数:InputArray src1,表示需要加权的第一个数组,常常填一个Mat

第二个参数:double alpha,表示第一个数组的权重

第三个参数:InputArray src2,表示第二个数组,需要和第一个数组拥有相同的尺寸和通道数

第四个参数:double beta,第二个数组的权重值,值为1-alpha

第五个参数:double gamma,一个加到权重总和上的标量值。

第六个参数:OutputArray dst,输出的数组,和输入的两个数组拥有相同的尺寸和通道数

                      dst = src1[I] * alpha + src2[I] * beta + gamma

第七个参数:int dtype,输出阵列的可选深度,有默认值-1。当两个输入数组具有相同深度时,这个参数设置为-1(默认值),即等同于src1.depth()。

二、注意事项

        alpha 相当于增加图像的对比度,gamma相当于增加图像的亮度。

        执行addWeighted函数相当于是对其中的一个图像执行下面的操作  对每个像素乘alpha再加beta,但不能超过255 所以要用saturate_cast<uchar>

 /// 执行运算 new_image(i,j) = alpha*image(i,j) + beta

    for( int y = 0; y < image.rows; y++ )
    {
        for( int x = 0; x < image.cols; x++ )
        {
            for( int c = 0; c < 3; c++ )
            {
                new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
            }
        }
    }

三、示例代码

        1、利用addWeighted融合两个不同的图像。

    Mat m1 = imread("axlix.jpg");
	Mat m2 = imread("axlix2.jpg");
	if (m1.empty() || m2.data == 0) {
		cout << "文件打不开" << endl;
	}
	if (m1.size() != m2.size()) {
		cout << "两幅图尺寸不一样" << m1.size()<<"  ---" << m2.size() << endl;
		resize(m2, m2, m1.size());
	}
	Mat mo = Mat(m1.size(), m1.type());
	addWeighted(m1, 0.8, m2, 0.6, 50, mo);
	imshow("mo", mo);

          2、利用addWeighted设置图像的亮度和对比度。

        其中alpha  beta是图像的对比度 gamma是亮度    

  void myCV:: addWeightedtest()是myCV类的成员函数, static void on_lightness(int b, void* userdata)和 static void on_contractness(int b, void* userdata)都设置为静态方法,不属于myCV类。

 static void on_lightness(int b, void* userdata) {
	 Mat image = *((Mat*)userdata);
	 Mat dst = Mat::zeros(image.size(), image.type());
	 Mat m = Mat::zeros(image.size(), image.type());
	 addWeighted(image, 1.0, m, 0.0, (b-50)*2, dst);
	 imshow("亮度对比度调整", dst);
 }

 static void on_contractness(int b, void* userdata) {
	 Mat image = *((Mat*)userdata);
	 Mat dst = Mat::zeros(image.size(), image.type());
	 Mat m = Mat::zeros(image.size(), image.type());
	 double contrastv = b / 100.0;
	 addWeighted(image, contrastv, m, 0.0, 0, dst);
	 imshow("亮度对比度调整", dst);
 } 

void myCV::addWeightedtest()
{
    namedWindow("亮度对比度调整", WINDOW_AUTOSIZE);
    static    Mat src = imread("axlix.jpg");
    int value = 50;
    int contractvalue = 100;
    int maxvalue = 100;
    int maxvalue2 = 200;
    createTrackbar("亮度调整:", "亮度对比度调整", &value, maxvalue, on_lightness, &src);
    createTrackbar("对比度调整:", "亮度对比度调整", &contractvalue, 200, on_contractness, &src);
}

 四、在改变亮度和对比度的作用上相当于convertTo这个函数

        src.convertTo(src, src.type(), 2.0, 50);

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值