python(opencv2、PIL)将图片透明背景转换成白色背景的两种方法

您所在的位置:网站首页 jpg怎么把图片底色换成白色 python(opencv2、PIL)将图片透明背景转换成白色背景的两种方法

python(opencv2、PIL)将图片透明背景转换成白色背景的两种方法

2024-01-31 13:33| 来源: 网络整理| 查看: 265

对于急需要用的朋友可以直接用下面的代码 opencv2实现 import cv2 def alpha2white_opencv2(img): sp=img.shape width=sp[0] height=sp[1] for yh in range(height): for xw in range(width): color_d=img[xw,yh] if(color_d[3]==0): img[xw,yh]=[255,255,255,255] return img if __name__=='__main__': img=cv2.imread('haveAlpha.png',-1) img_copy=img.copy() #注意:这里先copy()再传入函数,直接传入img会将原img直接修改掉 whiteback=alpha2white_opencv2(img_copy) cv2.imshow("after",whiteback) cv2.waitKey(0) #haveAlpha.png改成你自己的透明背景图片路径 PIL实现 from PIL import Image def alphabg2white_PIL(img): img=img.convert('RGBA') sp=img.size width=sp[0] height=sp[1] print(sp) for yh in range(height): for xw in range(width): dot=(xw,yh) color_d=img.getpixel(dot) if(color_d[3]==0): color_d=(255,255,255,255) img.putpixel(dot,color_d) img.show() return img if __name__=='__main__': img=Image.open('haveAlpha.png') whiteback=alphabg2white_PIL(img) whiteback.show() #同样的haveAlpha.png改成自己需要处理的透明背景图片

 

下面来讲述一下我是如何处理这些细节的吧

首先,图片有三通道图片RGB和四通道图片RGBA,RGB我们都知道是代表红绿蓝三原色,而RGBA则在此基础上加入了透明度Alpha,Alpha的值会对RGB衍生的颜色造成影响。对于PIL的Image以及opencv2而言,它们都是可以正常的读取这中通道的图片的,这也是我一开始不知道的地方。img=cv2.imread('haveAlpha.png')直接读入图片是三通道的,只有img=cv2.imread('haveAlpha.png',-1)第二个参数为负数,才会将其透明度传入;img=Image.open('haveAlpha.png')直接就是传入四通道的了。但是问题是这两者的show方法显示图片却不能将其自动显示成白背景,而且,即使是读出之后再重新保存,其保存的图片颜色也会变得不正常,我想不出原因是什么,但是我们可以做的是自己把透明的背景变成白色。

对读出来的RGBA图片矩阵写入文件中 opencv2:

import cv2 import numpy as np img=cv2.imread('haveAlpha.png',-1) img=np.reshape(img,(-1,4)) #利用numpy降维,以正常写进txt观察 np.savetxt('opencv2.txt',img)

PIL:  

from PIL import Image import numpy as np I=Image.open('anotherAlpha.png') I=I.convert('RGBA') I_array=np.array(I) I_array=np.reshape(I_array,(-1,4)) np.savetxt("PIL.txt",I_array)

用log viewer等阅读器打开txt(用记事本会有点慢,因为字数太多),如果你的图片大部分都是纯透明的,那么大部分行的数字会一样

----还没写完,后续继续补充----

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3