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

对于急需要用的朋友可以直接用下面的代码

  • 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(用记事本会有点慢,因为字数太多),如果你的图片大部分都是纯透明的,那么大部分行的数字会一样
python(opencv2、PIL)将图片透明背景转换成白色背景的两种方法_第1张图片

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

 

你可能感兴趣的:(Python,图像处理)