Alpha图像混合

举报
风吹稻花香 发表于 2021/06/05 01:11:21 2021/06/05
【摘要】   使用python进行PNG图像和JPEG图像的通道混合 图像通道介绍如何利用OpenCV实现?结语&下一章预告   图像通道介绍 图像在计算机中是以数字矩阵形式存储的,我们常见的图像是JPEG格式,后缀为JPEG或者JPG,此种图像对应的矩阵有三个通道,代表着每个像素有R红,G绿,B蓝三个颜色分量。另一种常见的无损压缩图像格式为PNG...

 

使用python进行PNG图像和JPEG图像的通道混合

 

图像通道介绍

图像在计算机中是以数字矩阵形式存储的,我们常见的图像是JPEG格式,后缀为JPEG或者JPG,此种图像对应的矩阵有三个通道,代表着每个像素有R红,G绿,B蓝三个颜色分量。另一种常见的无损压缩图像格式为PNG,不同于JPEG,此格式的图像在计算机中有四个通道,第四个通道Alpha代表透明度。本文要做的就是将一个PNG图像的前景(RGB通道部分叠加到另一个背景图像上,类似于PS的抠图操作)

如何利用OpenCV实现?

下面来看下代码实现部分,首先是python的实现:


  
  1. import numpy as np
  2. import cv2
  3. foreGroundImage = cv2.imread("foreGroundAsset.png",-1)
  4. ## 先将通道分离
  5. b,g,r,a = cv2.split(foreGroundImage)
  6. #得到PNG图像前景部分,在这个图片中就是除去Alpha通道的部分
  7. foreground = cv2.merge((b,g,r))
  8. #得到PNG图像的alpha通道,即alpha掩模
  9. alpha = cv2.merge((a,a,a))
  10. background = cv2.imread("backGround.jpg")
  11. #因为下面要进行乘法运算故将数据类型设为float,防止溢出
  12. foreground = foreground.astype(float)
  13. background = background.astype(float)
  14. cv2.imwrite("alpha.jpg",alpha)
  15. #将alpha的值归一化在0-1之间,作为加权系数
  16. alpha = alpha.astype(float)/255
  17. cv2.imshow("alpha",alpha)
  18. cv2.waitKey(0)
  19. #将前景和背景进行加权,每个像素的加权系数即为alpha掩模对应位置像素的值,前景部分为1,背景部分为0
  20. foreground = cv2.multiply(alpha,foreground)
  21. background = cv2.multiply(1-alpha,background)
  22. outImage = foreground + background
  23. cv2.imwrite("outImage.jpg",outImage)
  24. cv2.imshow("outImg",outImage/255)
  25. cv2.waitKey(0)

同样,给出C++的实现代码:


  
  1. #include opencv2/opencv.hpp
  2. using namespace cv;
  3. using namespace std;
  4. int main()
  5. {
  6. // 读图像
  7. Mat foreground = imread("puppets.png");
  8. Mat background = imread("ocean.png");
  9. Mat alpha = imread("puppets_alpha.png");
  10. // 为做乘法不溢出,将格式转换为32F的,代表32维浮点数
  11. foreground.convertTo(foreground, CV_32FC3);
  12. background.convertTo(background, CV_32FC3);
  13. // 将alpha掩模的值归一化在0-1之间
  14. alpha.convertTo(alpha, CV_32FC3, 1.0/255); //
  15. // 保存合成图像
  16. Mat ouImage = Mat::zeros(foreground.size(), foreground.type());
  17. // 前景乘以alpha
  18. multiply(alpha, foreground, foreground);
  19. // 背景乘以1-alpha
  20. multiply(Scalar::all(1.0)-alpha, background, background);
  21. // 相加
  22. add(foreground, background, ouImage);
  23. // 显示图像
  24. imshow("alpha blended image", ouImage/255);
  25. waitKey(0);
  26. return 0;
  27. }
  •  

结果示意:
PNG图像

背景JPEG图像
alpha掩模,即为程序中的alpha=cv2.merge((a,a,a))
合成图像

结语&下一章预告

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/101555935

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。