OpenCV每日函数 杂项图像转换模块 (2) blendLinear函数

一、概述

        该函数执行两个图像的线性混合,使用如下公式进行计算最终图像:

        其中weights1是第一张图象对应的权重矩阵。weights2是第二张图象对应的权重矩阵。

        其中src1是第一张图像,src2是第二张图像,按多通道计算。

        dst(i,j) = weights1(i,j) * src1(i,j) + weights2(i,j) * src2(i,j)

二、blendLinear函数

1、函数原型

cv::blendLinear (InputArray src1, InputArray src2, InputArray weights1, InputArray weights2, OutputArray dst)

2、参数详解

src1 它的类型为 CV_8UC(n) 或 CV_32FC(n),其中 n 是正整数。
src2 它与 src1 具有相同的类型和大小。
weights1 它的类型为 CV_32FC1,大小与 src1 相同。
weights2 它的类型为 CV_32FC1,大小与 src1 相同。
dst 如果它的大小和类型与 src1 不同,则会创建它。

三、OpenCV源码

1、源码路径

opencv\modules\imgproc\src\blend.cpp

2、源码代码

void cv::blendLinear( InputArray _src1, InputArray _src2, InputArray _weights1, InputArray _weights2, OutputArray _dst )
{
    CV_INSTRUMENT_REGION();

    int type = _src1.type(), depth = CV_MAT_DEPTH(type);
    Size size = _src1.size();

    CV_Assert(depth == CV_8U || depth == CV_32F);
    CV_Assert(size == _src2.size() && size == _weights1.size() && size == _weights2.size());
    CV_Assert(type == _src2.type() && _weights1.type() == CV_32FC1 && _weights2.type() == CV_32FC1);

    _dst.create(size, type);

    CV_OCL_RUN(_dst.isUMat(),
               ocl_blendLinear(_src1, _src2, _weights1, _weights2, _dst))

    Mat src1 = _src1.getMat(), src2 = _src2.getMat(), weights1 = _weights1.getMat(),
            weights2 = _weights2.getMat(), dst = _dst.getMat();

    if (depth == CV_8U)
    {
        BlendLinearInvoker<uchar> invoker(src1, src2, weights1, weights2, dst);
        parallel_for_(Range(0, src1.rows), invoker, dst.total()/(double)(1<<16));
    }
    else if (depth == CV_32F)
    {
        BlendLinearInvoker<float> invoker(src1, src2, weights1, weights2, dst);
        parallel_for_(Range(0, src1.rows), invoker, dst.total()/(double)(1<<16));
    }
}

四、效果图像示例

        这里的weights1、weights2是大小与输入图像相同的浮点矩阵。可以逐像素处理,不过为了演示方便,这里使用了浮点数进行权重矩阵处理,并且图像统一进行了resize。

均使用0.5
0.05、0.1

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/125275464