叠加在 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 通道图像上的主要内容,如果未能解决你的问题,请参考以下文章