• Python图像处理库——PIL


      PIL全称Python Image Library,是python官方的图像处理库,包含各种图像处理模块。Pillow是PIL的一个派生分支,包含与PIL相同的功能,并且更灵活。python3.0之后,PIL不再更新,pillow代替了它原有的地位。Pillow的官方文档:

      https://pillow.readthedocs.io/en/stable/reference/index.html

      在调用pillow时,代码依然是写成PIL,模块导入方式如下:

    from PIL import Image,ImageFilter 

      下面介绍基本用法。

    Image

      Image是pillow最基本的模块,包含用于保存图像对象的类。

    图像导入、旋转、显示、保存

    from PIL import Image
    img = Image.open('1.jpg')
    img = img.rotate(45)
    img.show()
    img.save('r.jpg')

      图像导入后保存为Image对象,该对象自带各种函数,包括图像处理操作、显示、保存等功能,大部分操作返回的依然是Image对象。需要注意的是,open函数执行的时候并没有立即把图像像素数据导入,仅仅是对图像文件添加占用标记,直到图像真正需要用于计算时,才会把像素数据导入。以上代码结果如下:

    Numpy.array与Image之间的转换

    Image到array

    import numpy as np
    from PIL import Image
    
    img = Image.open('1.jpg') 
    a = np.array(img)
    print(a.shape, a.dtype) 

      对于读取的图像,在Image对象中,图像默认以RGB模式保存,且各个像素值默认用 8bit 的无符号整型来存,不论图像以什么类型保存。因此转换为array后dtype是uint8,不像matplotlib,png是float32,而jpg是uint8。其它图像模式看官方文档:

      https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes

    array到Image

    import numpy as np
    from PIL import Image
    
    a = np.random.random([256,256,3])*255
    a = np.array(a,dtype = np.uint8)
    img = Image.fromarray(a)
    img.show()

      array必须先将数据类型转换到uint8才能转换成Image,否则会出错,尽管文档中写着能有限地支持浮点类型。

    图像模式转换

    from PIL import Image
    
    img = Image.open('1.jpg').convert('1')
    img.show()

      以上代码将Image模式从RGB转换为1,也就是黑白两色。效果如下:

      图像转换后,Image对象所对应的像素值以及对应的数据类型也就变了。显示的时候,Pillow会以对应的模式来显示。可以做如下实验,先将图像转变为YCbCr模式,然后分别直接显示和转变成array后在matplotlib中显示,代码如下:

    import numpy as np
    import matplotlib.pyplot as plt
    from PIL import Image
    
    img = Image.open('1.jpg').convert('YCbCr')
    img.show() # 直接显示
    img = np.array(img)  
    plt.imshow(img)# matplotlib中显示
    plt.axis('off')
    plt.show()

      两个效果分别如下:

      可以看出,pillow 对转换成 YCbCr 模式的图像能以对应的模式显示,而因为 matplotlib 是以RGB模式来显示的,因此 YCbCr 模式的图像会呈现右图效果。

    图像缩放

    等比例缩放

    from PIL import Image 
    
    size = 80,80
    img = Image.open('1.jpg') 
    img.thumbnail(size) 
    img.show()

      按等比例缩小图像,长宽都小于等于size。需要注意的是,这个操作是直接作用与原对象上,返回为None。而通常的操作则是返回处理得到的新对象,原对象不改变,比如上面的rotate。所以这个函数的实现有点问题,和其它的特性不同,容易导致出错,最好少用。

    直接缩放

    img = img.resize([128,128],Image.BICUBIC,box = (10,50,1200,1000))

      三个参数分别表示:目标大小 (宽,高),采样方式,用于缩放的图像区域。

    图像混合

    无透明通道

    from PIL import Image 
     
    img1 = Image.open('1.jpg') 
    img2 = Image.open('2.jpg') 
    img = Image.blend(img1,img2,0.5)
    img.show()

      将两张图像按$alpha : (1-alpha)$的透明度混合,$alpha$可以不在$(0,1)$内,结果像素值会裁剪到合理范围内。显示结果如下:

    有透明通道

    img = Image.alpha_composite(img1,img2)

      其中两张图像必须都有$alpha$通道。

    自定义混合

    import numpy as np
    from PIL import Image 
     
    img1 = Image.open('1.jpg') 
    img2 = Image.open('2.jpg')  
    mask = np.ones([img1.size[1],img1.size[0]],dtype=np.uint8)
    mask[:,img1.size[0]//2:] *= 175
    mask[:,:img1.size[0]//2] *= 80
    mask = Image.fromarray(mask)  
    img = Image.composite(img1,img2,mask)
    img.show() 

      composite函数使用mask对两张图像进行混合,从而不同的位置可以定义不同的透明度,以上代码效果如下:

    单像素处理

    from PIL import Image
    import numpy as np
    img = Image.open('1.jpg') 
    img = Image.eval(img, lambda x : x*np.random.rand()*2)
    img.show()

      eval第二个参数传入对单一像素的操作,这个操作会作用在整张图像的每个像素值上。效果如下:

    旋转、镜像

    from PIL import Image
    
    img = Image.open('1.jpg') 
    img = img.transpose(1)
    img.show()

      transpose 有0~6共7个输入,代表图像7个旋转、镜像方向,加上原图,一共8个方向。

    ImageFilter

      这个模块用于图像的滤波处理。用法也是基于Image模块。基本用法如下:

    from PIL import Image,ImageFilter
    
    img = Image.open('1.jpg')
    img = img.filter(ImageFilter.GaussianBlur(5))  
    img.show()

      将ImageFilter的函数作为参数输入filter中。还有很多种滤波方式,不一一列举。

    其它模块

      ImageEnhance:用于图像增强,如锐化、增亮。

      ImageGrab:用于截屏或读取剪贴板获取图像。

      ImageDraw:用于绘制简单的线条和标记。

      还有很多模块,但感觉用起来还不如numpy+matplotlib方便,不在此记录,有需要请看官方文档。

  • 相关阅读:
    cancel-ng-swipe-right-on-child
    css.day.05.eg
    css.day05
    css.day04.eg
    css.day04
    css.day03.eg
    css.day03
    css.day02.eg
    九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)(转)
    阿里巴巴笔试题选解
  • 原文地址:https://www.cnblogs.com/qizhou/p/14557014.html
Copyright © 2020-2023  润新知