opencv保存透明png

我们在处理图片的时候一般只处理RGB三个通道,常规的图片就只有三个通道,但是想要保存为无背景的png图片的时候就发现,直接保存的话图片背景为黑色,无法保存出透明背景的图片。那是因为除RGB外还有一个通道为Alpha通道,Alpha表示透明度,他的取值是0-255,通过设置Alpha的值,我们可以改变图像的透明度。



在用opencv处理图片的时候,想要创建Alpha通道

img = cv2.imread('./image.jpg')

cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)



将img图片转为4通道,增加Alpha通道,但是Alpha通道的值是255,也就是说默认是不透明的,我们要做的是想把rgb值为(0,0,0)的点置位透明,那就是要把四通道值为(0,0,0,255)转换为(0,0,0,0),最常规的方式就是遍历


h = img.shape[0]

w = img.shape[1]

for i in range(w):

        for j in range(h):

            if img[j][i][0] == 0 and img[j][i][1] == 0 and img[j][i][2] == 0:

                img[j][i] = (0, 0, 0, 0)


但是这样做的话就发现图片尺寸大的话就会超慢, 因为要遍历图片中所有的像素点。



这里就要祭出神器numpy来处理矩阵,numpy处理矩阵的速度几乎可以媲美编译过的C语言,在numpy里只需要一句话就完成上面的遍历:

img[np.all(img == [0, 0, 0, 255], axis=2)] = [0, 0, 0, 0]

这句的意思大概是在矩阵的第二维中找到值为[0, 0, 0, 255]的元素,将其置为[0, 0, 0, 0],这里最主要的一点就是numpy中的axis,在numpy中,有很多的函数都涉及到axis,很多函数根据axis的取值不同,得到的结果也完全不同。




那axis怎么理解呢。简单说就是:设axis=i,则numpy沿着第i个下标变化的方向进行操作,具体案例可以参考这篇博客,对numpy中axis更好的理解:https://blog.csdn.net/fangjian1204/article/details/53055219


不理解axis就玩不了numpy。


网友评论

0条评论

发表

网友评论

0条评论

发表

最新评论

推荐文章

彩龙

Copyright © 2008-2019 彩龙社区(http://www.clzg.cn) 版权所有 All Rights Reserved.

免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。

经营许可证编号:滇B2-20090009-7

下载我家昆明APP 下载彩龙社区APP