Python图像库PIL(Python Image Library)是python的第三方图像处理库。

PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow。pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3。
PIL那些最常用的特性与用法参考:http://www.effbot.org/imagingbook 库下载链接:http://www.pythonware.com/products/pil/

image介绍 python python中image模块_Image


Image使用前提


在使用Image之前,需要使用pip命令安装pillow

#安装pillow第三方库
pip install -U pillow
#安装之后可以使用下面的命令查看
pip list


Image常见函数用法


#读取图片open()
from PIL import Image #或import Image
with Image.open(filename) as image:
  image.show()

#两种原型
#Image.open(file) ⇒ image 
#Image.open(file, mode) ⇒ image

mode的选择如下图所示,选择时应填字符串类型。

image介绍 python python中image模块_python_02

#显示图片show()
image.show()
#转换图片,当前图像转换为其他模式convert()
image.convert(mode)
#获取图像大小
width,height = image.size
print(image.size)#返回值为宽度和高度的二元组(width, height)
#修改图片大小:图片不变形
image = image.resize((w, h), Image.ANTIALIAS)

#修改图片大小:拉伸、放大缩小
image = image.resize((w, h))
#复制图片
#如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。
image_copy = image.copy()
#从当前的图像中返回一个矩形区域的拷贝
region = image.crop(box) #将image表示的图片对象拷贝到region中,大小为box

#example
#变量box_range是一个四元组,定义了左、上、右和下的像素坐标,用来表示在原始图像中截取的位置坐标
image = Image.open(filename)
box_range = (0,0,100,200) #确定拷贝区域大小
region = image.crop(box_range)
region.show()
#将一张图粘贴到另一张图像上
image_new.paste(image,box)

#example
#变量box_range或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。
image = Image.open(filename)
box_range=[0,0,100,200]
image _crop = image.crop(box_range)
print(image _crop.size,image _crop.mode)
image.paste(image _crop, (100,100)) #等价于(100,100,0,0)
image.paste(image _crop, (400,400,500,500))
image.show()
#旋转,返回一个按照给定角度顺时钟围绕图像中心旋转后的图像拷贝
image.rotate(angle)
image.rotate(angle,filter=NEAREST, expand=0)
#明暗
image = image.point(lambda p: p * 1.3)
#返回一个使用给定滤波器处理过的图像的拷贝
#在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。
from PIL import Image
from PIL import ImageFilter # 调取ImageFilter
imgF = Image.open(filename)
bluF = imgF.filter(ImageFilter.BLUR) #均值滤波
conF = imgF.filter(ImageFilter.CONTOUR) #找轮廓
edgeF = imgF.filter(ImageFilter.FIND_EDGES) #边缘检测
#使用给定的两张图像及透明度变量alpha,插值出一张新的图像
Image.blend(image1,image2, alpha)

#复合类使用给定的两张图像及mask图像作为透明度,插值出一张新的图像
Image.composite(image1,image2, mask)

#合并类使用一些单通道图像,创建一个新的图像
#变量bands为一个图像的元组或者列表,每个通道的模式由变量mode描述。所有通道必须有相同的尺寸。
#变量mode与变量bands的关系:len(ImageMode.getmode(mode).bands)= len(bands)
Image.merge(mode,bands) ⇒ image
#返回当前图像各个通道组成的一个元组
image.split()

#example
#分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)
image = Image.open(filename)
r,g,b = image.split()
print(r.mode)
print(r.size)
print(image.size)

#返回包括每个通道名称的元组
im.getbands()

#以包含像素值的sequence对象形式返回图像的内容
im.getdata()
#生成新的图像
Image.new(mode,size)
Image.new(mode, size,color)

#Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。
#example
#n_im= Image.new("RGB", (128, 128), "#FF0000")
#保存图片
image.save(filepath)

#两种原型
#image.save(outfile,options…)
#image.save(outfile, format, options…) #image.format ⇒ string or None
#PIL.Image 转numpy.array
img = numpy.array(image)

#numpy.array转 PIL.Image
image = Image.fromarray(img.astype('uint8')).convert('RGB')