用opencv实现两张半透明png图片以一定透明度叠加
例如我有如下两张透明、半透明图:
在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图片以一定透明度叠加相关推荐
- opencv resize_利用OpenCV 识别两张相似的图片
Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...
- opencv 取roi_利用OpenCV 识别两张相似的图片
Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...
- python相似图片识别_Python+Opencv识别两张相似图片
Python+Opencv识别两张相似图片 在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话 ...
- python图片识别-Python+Opencv识别两张相似图片
在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...
- Python+Opencv识别两张相似图片
在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...
- php 比对两张图片,Python+Opencv识别两张相似图片
在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...
- python识别图片中数字_Python Opencv识别两张相似图片
在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...
- python图像检测_Python+Opencv识别两张相似图片
在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...
- 图片找茬游戏——使用OpenCV查找两张图像的不同处并标记
前言 有个小游戏,就是给出两张只有轻微的几处差异的图像,让大家来找出图像中的不同之处,之前曾经玩过,发现游戏明明告诉你有几处不同,但你什么也找不全,比如下面的几组图像,这几组图像每组都有三个不同的地方 ...
最新文章
- Google学术搜索方法
- Spring MVC的框架组件
- 交换技术、覆盖技术、虚拟存储技术的区分
- Docker容器间Link单向通信
- .net持续集成sonarqube篇之sonarqube安装与基本配置
- 04 linux用户群组和权限
- 如何选择程序设计语言
- 价值100大洋的简体中文汉化补丁下载
- java获取method,2.5 反射——Class对象功能_获取Method
- spawn-fcgi 启动python 程序失败
- Python 实现信息自动配对爬虫排版程序
- 基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍
- 艾伯维与和铂医药合作开发新冠病毒抗体;欧莱雅发起中国首个美妆科技初创挑战赛 | 美通企业日报...
- Python接口自动化测试_悠悠
- (转)TeamViewer三种许可证的区别是什么?
- matlab历史模拟法计算var,历史模拟法、蒙特卡罗模拟法计算VaR和ES值
- java基于微信小程序校园二手闲置商品交易跳蚤市场 uniapp 小程序
- 冰箱中的爱马仕没跑了,用COLMO来开启你的美好新春吧
- STM32F103C8T6控制电机驱动模块298N驱动电机调速以及正反转(附代码资源包)
- c 语言 int 转字符串,C++ 字符串string和整数int的互相转化操作