例如我有如下两张透明、半透明图:

在photoshop中打开如下:

前景:一张四通道的png图,BGR通道的值全为[0,0,200],透明度完全靠alpha通道的不同值来体现。

后景:一张四通道的png图,BGR通道的值全为[200,0,0] ,透明度完全靠alpha通道的不同值来体现。

在画图软件中打开分别如下:左侧为前景,右侧为后景

现在想要把红色的画笔以百分之80的透明度叠加到蓝色的画笔上面。

基本的原理来自于alpha compositing 维基百科:

公式中src代表的就是前景,dst代表后景。RGB为RGB通道,A为Alpha通道。

那么要把前景以某百分比叠加到后景的话,无非就是先对前景的alpha通道做一个更透明化的处理(乘以透明度比例),再叠加到后景上。 代码如下:

def img_float32(img):return img.copy() if img.dtype != 'uint8' else (img/255.).astype('float32')def over(fgimg, bgimg):fgimg, bgimg = img_float32(fgimg),img_float32(bgimg)(fb,fg,fr,fa),(bb,bg,br,ba) = cv2.split(fgimg),cv2.split(bgimg)color_fg, color_bg = cv2.merge((fb,fg,fr)), cv2.merge((bb,bg,br))alpha_fg, alpha_bg = np.expand_dims(fa, axis=-1), np.expand_dims(ba, axis=-1)color_fg[fa==0]=[0,0,0]color_bg[ba==0]=[0,0,0]a = fa + ba * (1-fa)a[a==0]=np.NaNcolor_over = (color_fg * alpha_fg + color_bg * alpha_bg * (1-alpha_fg)) / np.expand_dims(a, axis=-1)color_over = np.clip(color_over,0,1)color_over[a==0] = [0,0,0]result_float32 = np.append(color_over, np.expand_dims(a, axis=-1), axis = -1)return (result_float32*255).astype('uint8')def overlay_with_transparency(bgimg, fgimg, xmin = 0, ymin = 0,trans_percent = 1):'''bgimg: a 4 channel image, use as backgroundfgimg: a 4 channel image, use as foregroundxmin, ymin: a corrdinate in bgimg. from where the fgimg will be puttrans_percent: transparency of fgimg. [0.0,1.0]'''#we assume all the input image has 4 channelsassert(bgimg.shape[-1] == 4 and fgimg.shape[-1] == 4)fgimg = fgimg.copy()roi = bgimg[ymin:ymin+fgimg.shape[0], xmin:xmin+fgimg.shape[1]].copy()b,g,r,a = cv2.split(fgimg)fgimg = cv2.merge((b,g,r,(a*trans_percent).astype(fgimg.dtype)))roi_over = over(fgimg,roi)result = bgimg.copy()result[ymin:ymin+fgimg.shape[0], xmin:xmin+fgimg.shape[1]] = roi_overreturn result

结果:

在photoshop中打开:

在普通图片浏览器中打开:

用opencv实现两张半透明png图片以一定透明度叠加相关推荐

  1. opencv resize_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  2. opencv 取roi_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  3. python相似图片识别_Python+Opencv识别两张相似图片

    Python+Opencv识别两张相似图片 在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话 ...

  4. python图片识别-Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  5. Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  6. php 比对两张图片,Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  7. python识别图片中数字_Python Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  8. python图像检测_Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  9. 图片找茬游戏——使用OpenCV查找两张图像的不同处并标记

    前言 有个小游戏,就是给出两张只有轻微的几处差异的图像,让大家来找出图像中的不同之处,之前曾经玩过,发现游戏明明告诉你有几处不同,但你什么也找不全,比如下面的几组图像,这几组图像每组都有三个不同的地方 ...

最新文章

  1. Google学术搜索方法
  2. Spring MVC的框架组件
  3. 交换技术、覆盖技术、虚拟存储技术的区分
  4. Docker容器间Link单向通信
  5. .net持续集成sonarqube篇之sonarqube安装与基本配置
  6. 04 linux用户群组和权限
  7. 如何选择程序设计语言
  8. 价值100大洋的简体中文汉化补丁下载
  9. java获取method,2.5 反射——Class对象功能_获取Method
  10. spawn-fcgi 启动python 程序失败
  11. Python 实现信息自动配对爬虫排版程序
  12. 基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍
  13. 艾伯维与和铂医药合作开发新冠病毒抗体;欧莱雅发起中国首个美妆科技初创挑战赛 | 美通企业日报...
  14. Python接口自动化测试_悠悠
  15. (转)TeamViewer三种许可证的区别是什么?
  16. matlab历史模拟法计算var,历史模拟法、蒙特卡罗模拟法计算VaR和ES值
  17. java基于微信小程序校园二手闲置商品交易跳蚤市场 uniapp 小程序
  18. 冰箱中的爱马仕没跑了,用COLMO来开启你的美好新春吧
  19. STM32F103C8T6控制电机驱动模块298N驱动电机调速以及正反转(附代码资源包)
  20. c 语言 int 转字符串,C++ 字符串string和整数int的互相转化操作

热门文章

  1. axis监控记录服务器显示画面,AXIS VMS CMS-M 中心管理服务器
  2. IOS UITableView 改变编辑模式下的移动图标
  3. 泰坦尼克号的逻辑回归模型
  4. elasticsearch的master选举
  5. Web前端开发之网站制作流程详细讲解
  6. C语言 实现十进制转二十六进制
  7. 免费图片外链网站收集整理,不再为贴图而发愁!!
  8. 网页计算器 html代码原理,HTML网页之计算器代码
  9. 用HTML制作代码雨源码分享
  10. Delphi使用SpreadSheet