一、概述
该函数执行两个图像的线性混合,使用如下公式进行计算最终图像:
其中weights1是第一张图象对应的权重矩阵。weights2是第二张图象对应的权重矩阵。
其中src1是第一张图像,src2是第二张图像,按多通道计算。
二、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。

