我们平时接触的最多的图片格式除了jpg,还有一种就是带透明通道的png图。png这种带透明通道的图像因为有透明度,因此,它可以方便的和背景图像进行叠加和组合。
彩色的jpg图像是RGB三通道,而png是ARGB四通道(A就是Alpha,图像处理这块叫透明度)。在opencv中,png也是点阵数据,每个位置在内存中排列为BGRA。
比如下面一张png图像,位深是32,也就是说每个位置是4个字节。我们这个图像虽然是png的,但是现在它的透明通道都是255,所以我们可以清楚看到背景不是空的,而是白色。让我们通过代码把它的白色背景扣掉吧。
代码其实比较简单了,因为这个图颜色比较纯。就是遍历每个位置,然后判断这个位置如果RGB值都是255,就是白色,我们就把这个位置的Alpha通道设置为0,就是全透明了。
需要注意的是opencv读取图像默认会变成RGB图,所以imread函数第二个参数需要传值IMREAD_UNCHANGED,让它读图时保持原有图像的类型(同理加载单通道灰度图也得设置)。
处理保存后我们可以看到,是不是背景透明了。
Alpha通道是有透明度的,所以我们可以再设置下这个图的红色部分,让它变成半透明。
把前面的代码略加改造,多一个红色区域的判断,然后把对应位置的Alpha通道设置成125(256的一半,所以是半透明,也就是透明度50%)。
之前文章我也用过这个图。。因为红色不够红,所以它这块大部分红色通道值是254,不是255。。。。
整完后效果就是这样了:
这个放在这里图比较小,对比不够真切,我们可以用Photoshop打开对比看的更清楚。
把3.png作为上面图层,叠加到另外一个图像,就是那种经常说的图像合成了。
当然这个原图因为颜色不纯。我这个是写代码单纯判断一个颜色,都没有做阈值范围,所以抠图稀烂。。。我就是从代码技术分析下原理,大家不要在意这个图放上去的细节。。。



