学习PIL图像处理库

学习自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_BOTTOMImage.ROTATE_90Image.ROTATE_180Image.ROTATE_270, Image.TRANSPOSE,Image.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)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值