学习自pillow官方文档
读取存储操作
首先要将图片放在和py文件的同一个目录下
from PIL import Image
im = Image.open('timg.jpg') # 打开
im.save('sharp.jpg','jpeg') # 存储,若未指定格式,库使用文件扩展名来发现要使用的文件存储格式。
im.show() # 展示图片
缩略图
缩放一半:
w, h = im.size
im.thumbnail((w//2, h//2)) # 注意里面是个元组
剪切、粘贴、合并图像
要从图像中提取子矩形,使用crop():
一个4元组,定义左,上,右和下像素坐标。
box = (100, 100, 400, 400) # 选定范围
region = im.crop(box) # 取一块子矩形
region = region.transpose(Image.ROTATE_180) # 把取的子矩形旋转180度(还可以旋转90和270度)
im.paste(region, box) # 把子矩形粘贴到原图像中
横向滚动图像:
x, y = im.size
delta = 300 % x # 设置滚动的范围,此处取300
part1 = im.crop((0, 0, delta, y)) # 截取第一部分
part2 = im.crop((delta, 0, x, y)) # 截取剩余部分
im.paste(part1, (x-delta, 0, x, y)) # 将第一部分粘贴到整个图最靠左的位置
im.paste(part2, (0, 0, x-delta, y)) # 将剩余部分粘贴到最靠右位置
im.show()
几何变换
resize():采用传入的元组给出新的图像大小
rotate():逆时针方向旋转图像
out = im.resize((128,128))
out2 = im.rotate(45)
旋转、翻转图像还可以用transpose(method),method可用其中一个:Image.FLIP_LEFT_RIGHT
,Image.FLIP_TOP_BOTTOM
,Image.ROTATE_90
,Image.ROTATE_180
,Image.ROTATE_270
, Image.TRANSPOSE,I
mage.TRANSVERSE
。
transform(size,method, data)也可图像变换,method:Image.EXTENT
(切出矩形子区域), Image.AFFINE
(仿射变换), Image.PERSPECTIVE
(透视变换), Image.QUAD
(将四边形映射到矩形),Image.MESH
(在一次操作中映射多个源四边形)
- 从图像中裁剪一个区域。变量data为指定输入图像中两个坐标点的4元组(x0,y0,x1,y1)。输出图像为这两个坐标点之间像素的采样结果。例如,如果输入图像的(x0,y0)为输出图像的(0,0)点,(x1,y1)则与变量size一样。
-
out2 = im.transform((200,200),Image.EXTENT,(0, 0, 500, 500))
- 对当前的图像进行仿射变换,变换结果体现在给定尺寸的新图像中。变量data是一个6元组(a,b,c,d,e,f)。
-
out2 = im.transform((200,200),Image.AFFINE,(1,2,3,2,1,4))
- 输入图像的一个四边形(通过四个角定义的区域)映射到给定尺寸的长方形。变量data是一个8元组(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四边形的左上,左下,右下和右上四个角。
-
out2 = im.transform((200,200),Image.QUAD, (0,0,0,500,600,500,600,0))
- 对当前图像进行透视变换,产生给定尺寸的新图像。变量data是一个8元组(a,b,c,d,e,f,g,h)。
-
out2 = im.transform((200,200),Image.PERSPECTIVE, (1,2,3,2,1,6,1,2))
图像增强
过滤器:filiter()
im_contour = im.filter(ImageFilter.CONTOUR) # 轮廓滤波
im_detail = im.filter(ImageFilter.DETAIL) # 细节滤波
im_edge_enhance = im.filter(ImageFilter.EDGE_ENHANCE) # 边界增强滤波
im_sharp = im.filter(ImageFilter.SHARPEN) # 锐化滤波
im_gauss = im.filter(ImageFilter.GaussianBlur(radius=2)) # 高斯模糊滤波,radius指定平滑半径
点操作:转换图像的像素值(例如,图像对比度操纵)
out = im.point(lambda i: i*2.2)
增强:ImageEnhance(),调整对比度,亮度,色彩平衡和清晰度
from PIL import Image, ImageEnhance
enh = ImageEnhance.Contrast(im) # 调整图像对比度
enh.enhance(1.3).show("30% more contrast") # enhanve()返回增强的图像
图像序列
支持的序列格式包括FLI / FLC,GIF和一些实验格式。打开序列文件时,PIL会自动加载序列中的第一帧。可以使用seek和tell方法在不同的帧之间移动:
im.seek(1) # 跳到第二帧
try:
while 1:
im.seek(im.tell()+1) # tell()返回当前帧的序号
im.show()
except EOFError:
pass
概念
1.要获取图像中波段的数量和名称,请使用 getbands()
方法。
2.通过mode
属性读取图像的模式。如:
print(im.mode) # 返回一个字符串
3.通过size属性读取图像大小,返回一个二元组。
4.PIL的的坐标系为左上角是(0,0),坐标指的是隐含的像素角; 寻址为(0,0)的像素的中心实际上位于(0.5,0.5)。矩形表示为4元组,例如,覆盖所有800x600像素图像的矩形被写为(0,0,800,600)。