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

Posted zzatp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像处理: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);
cv::destroyAllWindows();
return 0; }
源图片:

 


目标图片:

 混合效果:

 

 

 

以上是关于图像处理:AlphaBlend混合两张图片的主要内容,如果未能解决你的问题,请参考以下文章

Python混合图片操作

Python混合图片操作

Python混合图片操作

OpenCV + CPP 系列图像的加权混合 对比度与亮度

opencv图像处理基础操作之图像的加法和混合

SharpDX/DX11 Alpha 混合