前言:因为我不是做图像处理,只是工作中用到一些图像得基础知识,所以这里简单整理下常见得图像基础操作。
图像混合blending
参考和内容
内容
- 学习图像得基础处理:透明度
学习图像得基础处理:混合
目标:自己都实现一下所有功能
参考
- RGB颜色混合(Blend) : 详细描述了图像处理中 ,透明度 和 混合得过程。
- Porter-Duff 模型 和 官方porterduff.html
- Pre-multiplied Alpha blending
图像得透明度
我们知道 常见的图像 格式 RGB或YUV,都是表示了色彩的属性,但实际上在使用中,还有一个 图像的透明度-alpha,我们通常用 ARGB,AYUV 来表示。
Linux 内核头文件 drm_fourcc.h 中列举了当前常见得所有图像格式
ARGB从表面看比RGB多了个A,也是一种色彩模式,是在RGB的基础上添加了Alpha(透明度)通道。透明度也是以0到255表示的,所以也是总共有256级,透明是0,不透明是255。代码编程中也是以16进制方式表示,如:0xff-ff0000。 透明度对照表 。
alpha不代表透明度? 在 什么是Alpha通道 中描述了,alpha没有透明度得意思, 真正让图片变透明的不是Alpha 实际是Alpha所代表的数值(透明度)和其他数值做了一次运算。
透光率(1-a): 接下来的很多公式里,你会看到大量的(1-a),为什么要用1减去透明度?得到的是什么呢?实际上在做这些算法的时候,研究人员尽量模拟光线的特性来设计,例如,光线穿透一些具有透明度的物体,一部分光会投射过去,剩下一部分反射回来,被我们看到。
*假设有两块有颜色的玻璃,一块红色,一块绿色,红色的玻璃透明度alpha = 0.2 ,则这块玻璃的透光率为80%,因为有80%的光透过去了,只有20%能被我们的眼睛接收,所以透明度为0.2,若alpha = 0,则透光率为100%,所有光线都透过去了,我们就看不到了,另一块绿色玻璃的透明度是0.6,则透光率是40%。现在,将两块玻璃叠放到一起,用一束太阳光照射后,光线先穿过红色玻璃,有80%的光透过去了,再经过绿色玻璃,有 80 40% = 32%的光透过去了,也就是两块玻璃叠加后,总的透光率为32%,所以透明度为0.68.
**
半透明算法: 混合算法目前在常用到的算法是AlphaBlend。
计算公式如下:假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,
设B图象的透明度为alpha(取值为0-1,1为完全透明,0为完全不透明).
Alpha混合公式如下:
R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。 改变这个 alpha 值可以得到一个渐变的效果。
图像得混合
Porter-Duff中定义了核心公式:
在 Porter-Duff 模型 和 官方porterduff.html 中提供了各类图像混合得 因子 和 结果 在不同情况下得结果。
