图像混合
线性混合操作
g(x) = (1 -
α
\alpha
α)
f
0
f_0
f0(x) +
α
\alpha
α
f
1
f_1
f1(x)
其中
α
\alpha
α表示两种图片融合的比例,其中g(x)表示融合之后图片的像素点,
f
0
f_0
f0(x)和
f
1
f_1
f1(x)表示背景和前景的像素值,
α
\alpha
α的取值为0-1之间
cv::addWeighted
功能
将两幅大小,类型都相同的图片线性混合
dst(I) = saturate(src1(I)
α
\alpha
α + src2(I)
β
\beta
β +
γ
\gamma
γ)
函数原型
void cv::addWeighted(inputArray src1,
double alpha,
inputArray src2,
double beta,
double gamma,
OutputArray dst,
int dtype = -1)
参数
src1:输入图像Mat
alpha:输入图像src1的alpha值
src2:输入图像Mat
beta:输入图像src2的alpha值
gamma:gamma值
dst:输出混合图像
例
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui_c.h>
#include<math.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src1, src2, dst;
src1 = imread("D://cvproject/windows.jpg");
src2 = imread("D://cvproject/linux.jpg");
if (src1.empty() || src2.empty())
{
printf("could not load image...\n");
return -1;
}
double alpha = 0.5;
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
{
addWeighted(src1, alpha, src2, 1-alpha, 0.0, dst);
namedWindow("input1", CV_WINDOW_AUTOSIZE);
namedWindow("input2", CV_WINDOW_AUTOSIZE);
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("input1", src1);
imshow("input2", src2);
imshow("output", dst);
waitKey(0);
}
else
{
printf("The size of images is not same...\n");
return -1;
}
return 0;
}
自己简单复现一下这个函数
Mat dst(src1.size(), src1.type());
for (int row = 0; row < src1.rows; row++)
{
for (int col = 0; col < src1.cols; col++)
{
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha*src1.at<Vec3b>(row, col)[0] + (1 - alpha)*src2.at<Vec3b>(row, col)[0]);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha*src1.at<Vec3b>(row, col)[1] + (1 - alpha)*src2.at<Vec3b>(row, col)[1]);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha*src1.at<Vec3b>(row, col)[2] + (1 - alpha)*src2.at<Vec3b>(row, col)[2]);
}
}
结果与api一致