对于急需要用的朋友可以直接用下面的代码
- 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(用记事本会有点慢,因为字数太多),如果你的图片大部分都是纯透明的,那么大部分行的数字会一样
----还没写完,后续继续补充----