Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Most Efficient Alpha Blending

Hi-

I am trying to take a 4 channel image with an alpha channel and superimpose it on another 4 channel image. The background image has no data in it's alpha channel. The only alpha data that is of concern is associated with the foreground image. The following is a code snippet that does the math pixel by pixel. It works but is incredibly slow. What is the best way to speed this up or do the blending more efficiently somehow else? I am using OpenCV 3.0 (just updated).

    std::vector<cv::Mat> channels;
    split(sceneFinal, channels);

    //flip the alpha channel
    bitwise_not(channels[3], channels[3]);

    uchar rF, gF, bF, rB, gB, bB;
    for (int i = 0; i < sceneFinal.rows; ++i)
    {
        cv::Vec4b* pixelFore = sceneFinal.ptr<cv::Vec4b>(i); // pointer to row to foreground pixels
        cv::Vec4b* pixelBack = dst.ptr<cv::Vec4b>(i); // pointer to row of background pixels

        for (int j = 0; j < sceneFinal.cols; ++j)
        {
            uchar pixelAlpha = channels[3].at<uchar>(i,j); // alpha vlaue at this pixel
            double alphaVal = (int)pixelAlpha / 255.0;

            rF = pixelFore[j][2];
            gF = pixelFore[j][1];
            bF = pixelFore[j][0];

            rB = pixelBack[j][2];
            gB = pixelBack[j][1];
            bB = pixelBack[j][0];

            pixelBack[j][2] =  (rF * alphaVal) + (rB * (1.0 - alphaVal));
            pixelBack[j][1] = (gF * alphaVal) + (gB * (1.0 - alphaVal));
            pixelBack[j][0] = (bF * alphaVal) + (bB * (1.0 - alphaVal));


        }
    }