Python:PIL(一)——简介

学习总结自:PIL官方文档

PIL(Python Image Library)是Python的一个图像处理库。

1、简介

PIL库中最重要的类是Image

①从文件中加载Image——open方法

from PIL import Image
im=Image.open('文件路径')

成功后,该函数返回Image对象。

你可以通过一系列Image属性检查该文件的内容:

print(im.format,im.size,im.mode)

如果文件没打开,则会抛出OSError异常。

所以,安全的文件打开方式为:

try:
    with Image.open('Test.jpg') as im:
        im.show()
except OSError:
    pass

 

②显示Image对象

当我们有了一个Image对象,就可以对其进行一系列的操作和处理,例如,我们通过show方法打开

im.show()

2、一些常用操作

1)读写图像

①从图像文件读取

第一部分

PIL支持很多Image文件格式。如果想读取Image文件,就用Image.open()方法。我们不需要关注图像类型,只需要调用该方法就可以,它会自动识别图像文件格式。

如果想将Image对象保存为图像文件,就用Image.save()方法。保存文件时,路径名就变得很重要了。除非已经指定格式(通过第二个参数指定),否则该库会用路径中的扩展名作为存储格式。

 

②从之前打开的文件中读取

也可以从一个类文件(file-like)对象中打开一幅图像,该对象必须实现了file.read、file.seek、file.tell方法,并以二进制的模式打开了:

from PIL import Image
with open('Test.jpg','rb') as fp:#此时的fp就是file-like对象
    im=Image.open(fp)

 

③从二进制数据中读取

from PIL import Image
import io
im=Image.open(io.BytesIO(buffer))

 

2)将一个图片文件转化为JPEG格式

读取任意类型的图像文件,并将之保存为JPEG类型

复制代码
import os,sys
from PIL import Image

for infile in sys.argv[1:]:
    f,e=os.path.splitext(infile)
    outfile=f+'.jpg'
    if infile != outfile:
        try:
            with Image.open(infile) as im:
                im.save(outfile)
        except OSError:
            print('cannot convert',infile)
复制代码

3)创建JPEG缩略图

复制代码
import os,sys
from PIL import Image

size=(128,128)
for infile in sys.argv[1:]:
     outfile=os.path.splitext(infile)[0]+'.thumbnail'
     if infile!=outfile:
        try:
            with Image.open(infile) as im:
                im.thumbnail(size)
                im.save(outfile,'JPEG')
            except OSError:
                print('cannot create thumbnail for',infile)
复制代码

4)识别某文件夹中图片文件,打印它们的信息

复制代码
import sys
from PIL import Image

for infile in sys.argv[1:]:
    try:
        with Image.open(infile) as im:
            print(infile,im.format,f'{im.size}x{im.mode}')
    except OSError:
         pass
复制代码

5)裁剪、粘贴、融合

①从Image中裁剪一小块区域:crop

box=(100,100,400,400)
region=im.crop(box)#提取box所在矩形区域的图像

②处理该小块图像,并粘贴回原图:paste

将该小块图像翻转180°,并粘贴回去

region=region.transpose(Image.ROTATE_180)
im.paste(region,box)

粘贴时,region必须和box的尺寸一致。

6)波段分割与融合:split、merge

r,g,b=im.split()
im=Image.merge('RGB',(b,g,r))

7)几何变换:resize、rotate、transpose

resize:尺寸变形

rotate:顺时针旋转,参数是角度;旋转整幅图像,但是保留原始框架

transpose:旋转,可以将整个框架给旋转

x,y=im.size
#长宽缩小两倍
new_size=(x/2,y/2)
new_im=im.resize(new_size)

#旋转
new_im=im.rotate(45)
new_im=im.transpose(Image.ROTATE_90)

 8)颜色变换:convert

Python允许用convert()方法将Image实现色彩模式转化,'L'模式是灰度图像

im=im.convert('L')

9)图像增强

①滤波:Filter

使用模块ImageFilter中的Filter()方法和一些预定义的增强滤波器

im=im.filter(ImageFilter.DETAIIL)

②像素操作:point

point()可以实现对每个像素点的像素值实行修改;

该方法接收一个函数,对每个像素值都用该方法进行处理;

比如下文代码,就是将每个像素值提高为原来的1.2倍:

im=im.point(lambda i: i *1.2)

如果我们同时采用point()paste()方法,就能实现对图像的选择性修改。

③波段处理:split+point+merge

复制代码
im_R,im_G,im_B=im.split()
#筛选出R<100的区域,作为蒙版
mask=im_R.point(lambda i:i<100 and 255)
#处理G波段的所有像素值
out=im_G.point(lambda i:i*0.7)

#把处理好的G波段用之前的mask进行蒙版处理
#相当于保留r<100部分的G,除去r>100部分的G
im_G.paste(out,None,mask)

#波段重建
im=Image.merge(im.mode,(im_R,im_G,im_B))
复制代码

④一段用于创建mask的语句

imout=im.point(lambda i: expression and 255)
#制作一个符合expression的mask

 

ImageEnhance模块中有很多图像增强类与方法

⑤对比度:ImageEnhance.Contrast

from PIL import ImageEnhance

enh=ImageEnhance.Contrast(im)
enh.enhance(1.3).show('30% more contrast')

⑥动画

当我们打开一个动画图片(典型的如GIF)后,PIL自动加载第一帧,我们可以用seektell方法在不同帧间移动:

复制代码
from PIL import Image
with Image.open('Test.gif') as im:
    im.seek(1)#跳到第一帧
    
    #对第一帧的修改
    #....
    try:
        while(1):
            im.seek(im.tell()+1)
            #对每一帧的修改
    except EOFError:
        pass #结束时
复制代码

当动画访问到最后一帧之后,再用seek,就会抛出EOFError

逐帧处理:ImageSequence.Iterator

from PIL import ImageSequence
for frame in ImageSequence.Iterator(im):
    #逐帧处理语句

 

posted @   ShineLe  阅读(1566)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示