您的位置:

探索OpenCV中的addWeighted函数

在计算机视觉和图像处理的领域中,我们常常需要对两个图像进行融合,以达到某种合成效果。OpenCV中提供了addWeighted函数,可以实现两个图像的叠加融合。本文将详细介绍这个函数并提供相应的代码示例。

一、addWeighted介绍

addWeighted函数是OpenCV中用于合成两张图像的函数,其函数原型如下:

void cv::addWeighted(
    InputArray src1,       //第一幅输入图像
    double alpha,          //第一幅图像的权重
    InputArray src2,       //第二幅输入图像
    double beta,           //第二幅图像的权重
    double gamma,          //亮度调整因子
    OutputArray dst,       //输出图像
    int dtype = -1         //输出图像的数据类型
);

其中,src1和src2为输入的两张图像,alpha和beta为权重参数,gamma是亮度调整系数,用于调整融合后图像的整体亮度;dst为输出图像,dtype为输出图像的数据类型。

addWeighted函数的作用是计算出输出图像dst,其中输出图像的像素值由下式计算得出:

其中,src1和src2分别乘以alpha和beta表示了两幅图像各自的权重,gamma则用于调节融合后图像的亮度。

二、使用示例

接下来我们将通过几个实例来演示如何使用addWeighted函数实现图像融合。

1. 简单的图像融合

下面的示例实现了对两幅图像进行简单的加权融合,其中两幅图像分别由原图像和水平翻转后的图像构成,权重分别是0.5和0.5。

Mat src1 = imread("image1.jpg");
Mat src2, flip_src2;
flip(src2, flip_src2, 1);    //水平翻转图像2
Mat dst;
addWeighted(src1, 0.5, flip_src2, 0.5, 0, dst);    //图像融合
imshow("dst", dst);
waitKey(0);

上述代码中,首先读入图像1,并通过flip函数水平翻转图像2,然后将两幅图像进行融合,得到输出图像dst。

2. 对图像添加遮罩

在实际应用中,我们可能需要在一幅图像上添加一些遮罩,以达到特定的效果。下面的示例演示了如何在一张图像上添加一个不透明的矩形遮罩,以达到将图像中心区域变亮的效果。

Mat src = imread("image.jpg");
Mat mask(src.size(), CV_8UC1, Scalar(0));
Rect roi(src.cols/4, src.rows/4, src.cols/2, src.rows/2);
mask(roi) = Scalar(255);
Mat dst;
addWeighted(src, 1.0, src, 0.4, 0, dst, -1, mask);
imshow("dst", dst);
waitKey(0);

上述代码中,我们首先读入图像,并定义一个与其尺寸相同的遮罩mask,将遮罩初始值设为0。然后我们定义了一个矩形roi,用于限制要处理的图像区域。接着,我们将矩形区域在遮罩中对应的像素值设为255,表示该区域是不透明的。最后,我们将图像src与图像src的0.4倍进行加权融合,并输出输出图像dst,mask参数用于指定融合的像素点。

3. 融合彩色图像

下面的例子演示了如何融合彩色图像,其中两幅图像分别由原图像和将原图像转换为灰度图像后再转换为彩色图像得到的图像构成,权重分别是0.5和0.5。

Mat src = imread("image.jpg");
cvtColor(src, src, COLOR_BGR2GRAY);    //转灰度图像
cvtColor(src, src, COLOR_GRAY2BGR);    //转彩色图像
Mat src_gray;
cvtColor(src, src_gray, COLOR_BGR2GRAY);   //转灰度图像
Mat dst;
addWeighted(src, 0.5, src_gray, 0.5, 0, dst);
imshow("dst", dst);
waitKey(0);

上述代码中,我们首先将图像转换为灰度图像,然后通过转换回彩色图像得到一张与原图像尺寸相同的彩色图像。接着,我们又将彩色图像转换为灰度图像,得到一张与原图像尺寸相同的灰度图像,用于和原图像进行融合。最后,我们将原图像和灰度图像进行融合,得到融合后的输出图像dst。

三、总结

addWeighted是一个非常实用的函数,在计算机视觉和图像处理领域有着广泛的应用。本文介绍了addWeighted的函数原型和使用方法,并给出了几个代码示例,希望能够帮助读者更加深入地了解和掌握OpenCV中这个重要的图像处理函数。