图像处理:AlphaBlend混合两张图片

使用vs2017新建一个项目

混合A,B两张图的基础算法:

outColor = srcColor * srcAlpha + destColor * (1 - srcAlpha)

输出颜色 = 源颜色 * 源混合因子 + 目标颜色 * ( 1 - 源混合因子 ) 

这里scrAlpha从源图的Alpha通道获取

代码如下:

// alphablendimg.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 读取两张图片
    Mat destImg = imread("backGround.jpg", -1);
    Mat srcImg = imread("foreGroundAsset.png", -1);
    // 取出A图片的Alpha值
    Mat bgra[4];
    split(srcImg, bgra);
    Mat outImage = Mat::zeros(destImg.size(), CV_8UC3);
    

    // 逐像素混合 A,B两张图的r,g,b颜色,混合公式 outColor = srcAlpha*srcColor + (1-scrAlpha)*destColor
    unsigned char* fptr = reinterpret_cast<unsigned char*>(srcImg.data);
    unsigned char* bptr = reinterpret_cast<unsigned char*>(destImg.data);
    unsigned char* aptr = reinterpret_cast<unsigned char*>(bgra[3].data);
    unsigned char* outImagePtr = reinterpret_cast<unsigned char*>(outImage.data);

    int numberOfPixels = srcImg.rows * srcImg.cols * srcImg.channels();
    int i, j;
    for (j = 0; j < numberOfPixels;)
    {
        float srcAlpha = (*aptr)/255.0;

        *outImagePtr = (*fptr)*srcAlpha + (*bptr)*(1 - srcAlpha); // Blue
        outImagePtr++;fptr++;bptr++;
        *outImagePtr = (*fptr)*srcAlpha + (*bptr)*(1 - srcAlpha); // Green
        outImagePtr++;fptr++;bptr++;
        *outImagePtr = (*fptr)*srcAlpha + (*bptr)*(1 - srcAlpha); // Red
        outImagePtr++;fptr++;bptr++;

        fptr++; // 跳过Alpha通道
        j += 4;

        aptr++;
    }

    imshow("alpha blended image", outImage);
    waitKey(0);
    return 0;
}
源图片:

目标图片:

 混合效果:

 

猜你喜欢

转载自www.cnblogs.com/zzatp/p/9099599.html