您的当前位置:首页正文

Python图像处理库——PIL

2024-05-21 来源:汇智旅游网
Python图像处理库——PIL

  PIL全称Python Image Library,是python官⽅的图像处理库,包含各种图像处理模块。Pillow是PIL的⼀个派⽣分⽀,包含与PIL相同的功能,并且更灵活。python3.0之后,PIL不再更新,pillow代替了它原有的地位。Pillow的官⽅⽂档:  在调⽤pillow时,代码依然是写成PIL,模块导⼊⽅式如下:

from PIL import Image,ImageFilter

  下⾯介绍基本⽤法。

Image

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

图像导⼊、旋转、显⽰、保存

from PIL import Imageimg = 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 npfrom PIL import Imageimg = Image.open('1.jpg') a = np.array(img)

print(a.shape, a.dtype)

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

array到Image

import numpy as npfrom PIL import Image

a = np.random.random([256,256,3])*255a = 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 pltfrom 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()

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

有透明通道

img = Image.alpha_composite(img1,img2)

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

⾃定义混合

import numpy as npfrom 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:] *= 175mask[:,:img1.size[0]//2] *= 80mask = Image.fromarray(mask)

img = Image.composite(img1,img2,mask)img.show()

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

单像素处理

from PIL import Imageimport 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 Imageimg = 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⽅便,不在此记录,有需要请看官⽅⽂档。

Processing math: 100%

因篇幅问题不能全部显示,请点此查看更多更全内容