叠加在 4 通道图像上

Posted

技术标签:

【中文标题】叠加在 4 通道图像上【英文标题】:Overlay on 4 channel image 【发布时间】:2014-09-26 07:42:24 【问题描述】:

我有一个带有 4 个通道的图像,我需要将它覆盖在一堆图片上。在具有 3 个通道的图片上,叠加效果很好,但在具有 alpha 通道的图片上,图片的背景变为黑色。

原图:http://img.blog.csdn.net/20130610074054484

叠加图:http://imgur.com/mlVAN0A

这是进行叠加的代码:

void overlayImage(const cv::Mat &background, const cv::Mat &foreground, 
              cv::Mat &output, cv::Point2i location)

    background.copyTo(output);

    for(int y = std::max(location.y , 0); y < background.rows; ++y)
    
        int fY = y - location.y;
        if(fY >= foreground.rows)
            break;

        for(int x = std::max(location.x, 0); x < background.cols; ++x)
        
            int fX = x - location.x; 
            if(fX >= foreground.cols)
                break;

            double opacity = ((double)foreground.data[fY * foreground.step + fX * foreground.channels() + 3]) / 255.;

            for(int c = 0; opacity > 0 && c < output.channels(); ++c)
            
                unsigned char foregroundPx = foreground.data[fY * foreground.step + fX * foreground.channels() + c];
                unsigned char backgroundPx = background.data[y * background.step + x * background.channels() + c];
                output.data[y*output.step + output.channels()*x + c] =
                backgroundPx * (1.-opacity) + foregroundPx * opacity;
            
        
    

【问题讨论】:

已经看过Adding (blending) two images using OpenCV? 是的,我有。无论如何,谢谢。highgui的imshow的实现无法正确显示任何透明图像。如果我在最终图像上调用 imshow(叠加后),则背景为黑色。如果我在最终图像上调用 imwrite,图像看起来不错。 【参考方案1】:

这是因为您使用 1-opacity 作为背景图像。如果前景图像的不透明度为 0,则背景像素的不透明度将为 1,而不是之前的 0。

您必须计算两个图像的结果不透明度,这两个图像也可以为 0。

克劳斯

【讨论】:

我在某些时候对图像进行编码和解码,问题是当我调用解码时,第二个参数是 CV_LOAD_IMAGE_ANYCOLOR 而不是 CV_LOAD_IMAGE_UNCHANGED。谢谢克劳斯和多比。现在可以关闭答案了。

以上是关于叠加在 4 通道图像上的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 4 上 IOS 4 中拍摄照片和叠加图像的正确比例?

python-opencv-图像的叠加

在悬停时显示隐藏图像叠加 Bootstrap 4.2

在 SKSpriteNode 上叠加两个纹理

在一个网页上的多个图像上使用叠加层

无法在传单上使用图像叠加插件查看光栅图像(多波段卫星图像)