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改成你自己的透明背景图片路径
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(用记事本会有点慢,因为字数太多),如果你的图片大部分都是纯透明的,那么大部分行的数字会一样
----还没写完,后续继续补充----