我先放代码和结果,再分析过程。

1.实现代码

# coding=utf-8
import numpy as np
import cv2 as cv def paste_ROI_to_image(image_in, ROI, paste_area):image = image_in.copy()y1, x1, y2, x2 = paste_areaROI = cv.resize(ROI, (x2 - x1 + 1, y2 - y1 +1))   #cv.resize(src, dsize=(width, height))image = image.astype(np.float)ROI = ROI.astype(np.float)# alpha通道alpha_image = image[y1:y2+1, x1:x2+1, 3]/255.0 alpha_ROI = ROI[:,:,3]/255.0alpha = 1 - (1 - alpha_image)*(1 - alpha_ROI)# BGR通道for i in range(3):image[y1:y2+1, x1:x2+1, i] = (image[y1:y2+1, x1:x2+1, i]*alpha_image*(1 - alpha_ROI) + ROI[:,:,i]*alpha_ROI) / alpha image[y1:y2+1, x1:x2+1, 3] = alpha*255image = image.astype(np.uint8)return imageimage = cv.imread('image.jpg', cv.IMREAD_UNCHANGED)  #ROI = cv.imread('ROI.png', cv.IMREAD_UNCHANGED)image_R = paste_ROI_to_image(image, ROI, [50, 0, 206, 117])cv.imwrite('image_R.png', image_R)

结果:

          

image                             ROI                    image_R

代码分析:

(1)先导入使用到的两个模块:numpy和Python-OpenCV(cv2)

(2)定义了一个函数paste_ROI_to_image来完成透明素材的粘贴。函数中,先使用cv.resize函数来调整素材ROI的尺寸,使其和粘贴区域的尺寸是匹配的。x表示图像的列数,y表示图像中的行数。

(3)粘贴透明素材。(原理在后面解释)

(4)显示粘贴结果。

2.粘贴透明素材的原理

首先,透明素材ROI具有透明度是因为它除了有RGB三个颜色通道以外,还有一个alpha通道。包含alpha通道的图像一般存储为png格式。(jpg格式图像是没有alpha通道的,比如程序中的image.jpg图就只有RGB三个颜色通道)我们粘贴透明图像时就利用到了这个透明通道。

使粘贴的效果能够保持透明的效果,其实就是让image和ROI的RGB三个通道进行混合。

那么,怎么混合呢?混合的比例如何知道呢?

alpha通道的值不就给我们一个值吗?alpha通道的值取值范围是0-255。0表示完全透明,255表示完全不透明。

(1)alpha通道:

setp1: 将alpha通道值取值范围由0-255转换到0-1

alpha_image = image[y1:y2+1, x1:x2+1, 3]/255.0

alpha1_ROI = ROI[:,:,3]/255.0

setp2:  计算合成后的图像的透明度:

alpha = 1 - (1 - alpha_image)*(1 - alpha_ROI)

这个公式可以这么理解,剩余透明度(1 - alpha_image) 和(1 - alpha_ROI)混合后,得到的图像透明度。

(2)RGB通道:

image[R,G,B] = (image[R,G,B]*alpha_image*(1 - alpha_ROI) + ROI[R,G,B]*alpha_ROI)    / alpha

这个公式怎么理解呢?其实就是按照透明度来分配image和ROI的RGB混合比例。

ROI是上层,其颜色的透出部分为 ROI[R,G,B]*alpha_ROI,然后按照最后合成图像的透明度分配比例,则ROI提供的RGB值为:

ROI[R,G,B]*alpha_ROI)    / alpha

image是底层,其颜色的透出部分为image[R,G,B]*alpha_image,而由于上层的ROI透过了alpha_ROI,留给image的只有(1 - alpha_ROI), 所以image提供的RGB值为:

image[R,G,B]*alpha_image*(1 - alpha_ROI)  / alpha

(3)合并alpha通道和RGB通道

image[y1:y2+1, x1:x2+1, 3] = alpha*255
              image = image.astype(np.uint8)


可能涉及到的资料

(1)opencv中imread函数的用法。

(2)numpy数据类型转换的注意。

带alpha通道的图像合成(Python语言)相关推荐

  1. 使用IconWorkshop制作带alpha通道的位图

    使用IconWorkshop制作带alpha通道的位图 引自:http://www.cnblogs.com/liqilei/archive/2011/01/26/1945787.html 最近在项目中 ...

  2. android,ETC1压缩纹理带alpha通道

    天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行指乱其所为,所以动心忍性,曾益其所不能. --<孟子> 1,ETC纹理. opengl2.0的所有android机器支持ET ...

  3. opencv-python读取透明图片(既带alpha通道)

    opencv-python读取透明图片 透明图(alpha图) cv2 cv2.imread() 透明图(alpha图) 透明图是PS抠图中常用到的图片形式,能保存为png以及gif格式,相比于普通的 ...

  4. UE4带Alpha通道透明效果贴图的相关问题

    镂空效果(黑色部分透明):UE4中,一张贴图同时显示color与opacity, 问题一:最初贴图只呈现颜色,应该透明的区域是黑色的 修改步骤如下: ps中魔棒选中黑色区域-反选-右键存储选区-生成a ...

  5. Unity播放带Alpha通道的视频【WebM+Video Player】(替代播放GIF方案)

    在Unity中播放GIF或者动态效果,可以通过Video Player播放带透明通道的WebM视频来实现. 制作带Alpha的MOV视频 制作带Alpha通道的MOV视频有多重方式,如AE.PR.PS ...

  6. 带alpha通道四通道的图片转成rgb三通道

    查看第四通道数值范围,若最大值为255,则归一化到1,再与前三通道相乘,得到叠加透明度的结果

  7. python语言浮点数可以不带小数部分吗_关于Python语言的浮点数类型,以下选项中描述错误的是 ( )_学小易找答案...

    [单选题]关于Python赋值语句,以下选项中不合法的是 ( ) [简答题]2014年22JAVA_B场参考答案.doc [单选题]下面代码的输出结果是 ( ) d ={" 大海 " ...

  8. 留个档,C# AlphaBlend,带Alpha通道的图片的叠加

    网上大部分的算法,都写的太文本化,看起来贼累 留个档,核心算法 bg是 被盖的图层, add是上层的图层 private Color AlphaBlend(Color bg, Color add) { ...

  9. Unity Editor下判断图片是否带alpha通道

    核心代码: //texPath为图片路径 texImporter = TextureImporter.GetAtPath(texPath) as TextureImporter; if (texImp ...

最新文章

  1. python utf 8_python写utf-8文件的问题
  2. python话雷达图-python使用matplotlib绘制雷达图
  3. GHOST_XP详细制作过程
  4. 如何为你的回归问题选择最合适的机器学习方法?
  5. android 横向stepview,Android 流程指示器 StepView
  6. 西瓜书+实战+吴恩达机器学习(九)监督学习之k近邻 K-Nearest Neighbor
  7. 微信「扫码支付」被诉侵犯专利权;苹果回应“iOS 13 频繁提醒 App 定位”;Python 2 退休 | 极客头条...
  8. java jdbc_详解Java基础知识——JDBC
  9. mysql 数据库编码怎么看_mysql查看数据库编码
  10. 用自定义IHttpModule实现URL重写 1
  11. 酷派Y60-C1刷官方ROM
  12. 微信小程序下拉刷新真机没效果_微信小程序下拉刷新上拉加载的两种实现方法...
  13. CDH安装过程中出现:主机 cdh04 上的内存被调拨过度。总内存分配额是 4.0 艾字节 个字节,但是 RAM 只有 62.8 吉字节 个字节(其中的 12.6 吉字节 个字节是保留给系统使用的)。
  14. Android更换字体
  15. Warshall算法C语言实现
  16. HUSKY导航——从无到有
  17. java阶梯算法_上楼梯算法的java实现(转)
  18. 买服务器不做网站需要备案吗,买服务器需要备案吗
  19. 关于工作和生活的点滴心得
  20. w7点击计算机图标没反应,点击win7系统桌面上的图标没有反应怎么办?

热门文章

  1. 静电场点电荷matlab,基于MATLAB的点电荷的静电场模拟
  2. TCP/IP高频考点之一个数据包的流浪日记
  3. [BZOJ1911] [Apio2010]特别行动队
  4. Linux命令行修改配置(待续)
  5. 不同区域多机房、多台设备、微信云平台集中监控管理方案
  6. 今晚“狼来了”|思一独角兽的狼人杀攻略
  7. 理解电路:从电报机到门电路
  8. 详解HMM模型原理 及 实现(之四:matlab实现曲线分类)
  9. setsockopt()和getsockopt()
  10. LAYOUT BGA布线规则