如何叠加两张图片?基本上我有一个没有alpha通道的背景,而且有一个或多个alpha通道需要叠加在彼此之上的图像。
我尝试过以下代码但叠加结果很糟糕:
// create our out image
Mat merged (info.width, info.height, CV_8UC4);
// get layers
Mat layer1Image = imread(layer1Path);
Mat layer2Image = imread(layer2Path);
addWeighted(layer1Image, 0.5, layer2Image, 0.5, 0.0, merged);
我也尝试过使用merge但我在某处读到它不支持alpha通道?
答案 0 :(得分:6)
我不知道这样做的OpenCV函数。但你可以自己实现它。它类似于addWeighted
函数。但是,不是固定权重0.5
,而是根据叠加图像的alpha通道计算权重。
Mat img = imread("bg.bmp");
Mat dst(img);
Mat ov = imread("ov.tiff", -1);
for(int y=0;y<img.rows;y++)
for(int x=0;x<img.cols;x++)
{
//int alpha = ov.at<Vec4b>(y,x)[3];
int alpha = 256 * (x+y)/(img.rows+img.cols);
dst.at<Vec3b>(y,x)[0] = (1-alpha/256.0) * img.at<Vec3b>(y,x)[0] + (alpha * ov.at<Vec3b>(y,x)[0] / 256);
dst.at<Vec3b>(y,x)[1] = (1-alpha/256.0) * img.at<Vec3b>(y,x)[1] + (alpha * ov.at<Vec3b>(y,x)[1] / 256);
dst.at<Vec3b>(y,x)[2] = (1-alpha/256.0) * img.at<Vec3b>(y,x)[2] + (alpha * ov.at<Vec3b>(y,x)[2] / 256);
}
imwrite("bg_ov.bmp",dst);
请注意,我无法使用Alpha通道读取文件,因为显然OpenCV不支持此功能。这就是为什么我从坐标计算出一个alpha值来获得某种渐变。
答案 1 :(得分:0)
最有可能合并的渠道号与输入不同。你可以替换
Mat merged (info.width, info.height, CV_8UC4);
用这个:
Mat merged;
这样您就可以让addWeighted
方法使用正确的参数创建目标矩阵。