5

如何叠加两个图像?本质上,我有一个没有 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);

我也尝试过使用合并,但我在某处读到它不支持 alpha 通道?

4

2 回答 2

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 值以获得某种渐变。

于 2012-05-21T06:38:54.853 回答
0

合并的通道数很可能与输入不同。你可以更换

Mat merged (info.width, info.height, CV_8UC4);

有了这个:

Mat merged; 

这样,您将让该addWeighted方法使用正确的参数创建目标矩阵。

于 2012-05-20T21:54:58.203 回答