关于pil在python中是什么的信息

发布时间:2022-11-14

本文目录一览:

  1. python中pil如何导入?
  2. python:PIL图像处理
  3. Python:这有可能是最详细的PIL库基本概念文章了

python中pil如何导入?

PIL是Python的第三方图像处理库,我们可以使用cmd中的pip install pillow命令安装PIL库。下面我们就来看一下如何导入PIL库。 Python中可以使用import导入PIL模块: 主要有以下两种导入方法:

  • import 模块名1 [as 别名1], 模块名2 [as 别名2], ...:使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。
  • from 模块名 import 成员名1 [as 别名1], 成员名2 [as 别名2], ...:使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。

python:PIL图像处理

PIL (Python Imaging Library) Python图像处理库,该库支持多种文件格式,提供强大的图像处理功能。 PIL中最重要的类是Image类,该类在Image模块中定义。

从文件加载图像:

如果成功,这个函数返回一个Image对象。现在你可以使用该对象的属性来探索文件的内容。

  • format 属性指定了图像文件的格式,如果图像不是从文件中加载的则为 None
  • size 属性是一个2个元素的元组,包含图像宽度和高度(像素)。
  • mode 属性定义了像素格式,常用的像素格式为:
    • "L" (luminance) - 灰度图
    • "RGB"
    • "CMYK" 如果文件打开失败,将抛出IOError异常。 一旦你拥有一个Image类的实例,你就可以用该类定义的方法操作图像。比如:显示

show() 的标准实现不是很有效率,因为它将图像保存到一个临时文件,然后调用外部工具(比如系统的默认图片查看软件)显示图像。该函数将是一个非常方便的调试和测试工具。 接下来的部分展示了该库提供的不同功能。 PIL支持多种图像格式。从磁盘中读取文件,只需使用 Image 模块中的 open 函数。不需要提供文件的图像格式。PIL库将根据文件内容自动检测。 如果要保存到文件,使用 Image 模块中的 save 函数。当保存文件时,文件名很重要,除非指定格式,否则PIL库将根据文件的扩展名来决定使用哪种格式保存。

转换文件到JPEG

save 函数的第二个参数可以指定使用的文件格式。如果文件名中使用了一个非标准的扩展名,则必须通过第二个参数来指定文件格式。

创建JPEG缩略图

需要注意的是,PIL只有在需要的时候才加载像素数据。当你打开一个文件时,PIL只是读取文件头获得文件格式、图像模式、图像大小等属性,而像素数据只有在需要的时候才会加载。 这意味着打开一个图像文件是一个非常快的操作,不会受文件大小和压缩算法类型的影响。

获得图像信息

Image 类提供了某些方法,可以操作图像的子区域。提取图像的某个子区域,使用 crop() 函数。

复制图像的子区域

定义区域使用一个包含4个元素的元组,(left, upper, right, lower)。坐标原点位于左上角。上面的例子提取的子区域包含300x300个像素。 该区域可以做接下来的处理然后再粘贴回去。

处理子区域然后粘贴回去

当往回粘贴时,区域的大小必须和参数匹配。另外区域不能超出图像的边界。然而原图像和区域的颜色模式无需匹配。区域会自动转换。

滚动图像

paste() 函数有个可选参数,接受一个掩码图像。掩码中255表示指定位置为不透明,0表示粘贴的图像完全透明,中间的值表示不同级别的透明度。 PIL允许分别操作多通道图像的每个通道,比如RGB图像。split() 函数创建一个图像集合,每个图像包含一个通道。merge() 函数接受一个颜色模式和一个图像元组,然后将它们合并为一个新的图像。接下来的例子交换了一个RGB图像的三个通道。

分离和合并图像通道

对于单通道图像,split() 函数返回图像本身。如果想处理各个颜色通道,你可能需要先将图像转为RGB模式。 resize() 函数接受一个元组,指定图像的新大小。 rotate() 函数接受一个角度值,逆时针旋转。

基本几何变换

图像旋转90度也可以使用 transpose() 函数。transpose() 函数也可以水平或垂直翻转图像。

transpose

transpose()rotate() 函数在性能和结果上没有区别。 更通用的图像变换函数为 transform()。 PIL可以转换图像的像素模式。

转换颜色模式

PIL库支持从其他模式转为"L""RGB"模式,其他模式之间转换,则需要使用一个中间图像,通常是"RGB"图像。 ImageFilter 模块包含多个预定义的图像增强过滤器用于 filter() 函数。

应用过滤器

point() 函数用于操作图像的像素值。该函数通常需要传入一个函数对象,用于操作图像的每个像素:

应用点操作

使用以上技术可以快速地对图像像素应用任何简单的表达式。可以结合 point() 函数和 paste 函数修改图像。

处理图像的各个通道

注意用于创建掩码图像的语法: Python计算逻辑表达式采用短路方式,即:如果and运算符左侧为false,就不再计算and右侧的表达式,而且返回结果是表达式的结果。比如 a and b 如果afalse则返回a,如果atrue则返回b,详见Python语法。 对于更多高级的图像增强功能,可以使用 ImageEnhance 模块中的类。 可以调整图像对比度、亮度、色彩平衡、锐度等。

增强图像

PIL库包含对图像序列(动画格式)的基本支持。支持的序列格式包括 FLI/FLC、GIF 和一些实验性的格式。TIFF 文件也可以包含多个帧。 当打开一个序列文件时,PIL库自动加载第一帧。你可以使用 seek()tell() 函数在不同帧之间移动。

读取序列

如例子中展示的,当序列到达结尾时,将抛出EOFError异常。 注意当前版本的库中多数底层驱动只允许seek到下一帧。如果想回到前面的帧,只能重新打开图像。 以下迭代器类允许在for语句中循环遍历序列:

一个序列迭代器类

PIL库包含一些函数用于将图像、文本打印到Postscript打印机。以下是一个简单的例子。

打印到Postscript

如前所述,可以使用 open() 函数打开图像文件,通常传入一个文件名作为参数: 如果打开成功,返回一个Image对象,否则抛出IOError异常。 也可以使用一个file-like object代替文件名(暂可以理解为文件句柄)。该对象必须实现readseektell函数,必须以二进制模式打开。

从文件句柄打开图像

如果从字符串数据中读取图像,使用StringIO类:

从字符串中读取

如果图像文件内嵌在一个大文件里,比如 tar 文件中。可以使用ContainerIOTarIO模块来访问。

从tar文档中读取

该小节不太理解,请参考原文。 有些解码器允许当读取文件时操作图像。通常用于在创建缩略图时加速解码(当速度比质量重要时)和输出一个灰度图到激光打印机时。 draft() 函数。

Reading in draft mode

输出类似以下内容: 注意结果图像可能不会和请求的模式和大小匹配。如果要确保图像不大于指定的大小,请使用 thumbnail 函数。 Python2.7 教程 PIL Python 之 使用 PIL 库做图像处理 来自

Python:这有可能是最详细的PIL库基本概念文章了

PIL有如下几个模块:

  • Image模块
  • ImageChops模块
  • ImageCrackCode模块
  • ImageDraw模块
  • ImageEnhance模块
  • ImageFile模块
  • ImageFileIO模块
  • ImageFilter模块
  • ImageFont模块
  • ImageGrab模块
  • ImageOps模块
  • ImagePath模块
  • ImageSequence模块
  • ImageStat模块
  • ImageTk模块
  • ImageWin模块
  • PSDraw模块 啊啊啊啊怎么这么多模块啊~~~!!!! 别担心我为你一一讲解 Image模块提供了一个相同名称的类,即Image类,用于表示PIL图像。 Image模块是PIL中最重要的模块,比如创建、打开、显示、保存图像等功能,合成、裁剪、滤波等功能,获取图像属性功能,如图像直方图、通道数等。 Image模块的使用如下:
from PIL import Image
im = Image.open("image.jpg")

ImageChops模块包含一些算术图形操作,这些操作可用于诸多目的,比如图像特效、图像组合、算法绘图等等,通道操作只用于8位图像。 ImageChops模块的使用如下:

from PIL import Image, ImageChops
im1 = Image.open("image1.jpg")
im2 = Image.open("image2.jpg")
im_dup = ImageChops.duplicate(im1)
im_diff = ImageChops.difference(im1, im2)

由于图像im_dupim的复制过来的,所以它们的差为0,图像im_diff显示时为黑图。 ImageCrackCode模块允许用户检测和测量图像的各种特性。这个模块只存在于PIL Plus包中。 因为我目前安装的PIL中没有包含这个模块。所以就不详细介绍了。 ImageDraw模块为Image对象提供了基本的图形处理功能。例如,它可以创建新图像,注释或润饰已存在图像,为web应用实时产生各种图形。 ImageDraw模块的使用如下:

from PIL import Image, ImageDraw
im = Image.new("RGB", (200, 200), "white")
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0, im.size[1], im.size[0], 0), fill=128)
del draw
im.show()

del draw前后显示出来的图像im是完全一样的,都是在原有图像上画了两条对角线。 原谅我的报错 ImageEnhance模块包括一些用于图像增强的类。它们分别为 Color类、Brightness类、Contrast类和Sharpness类。 ImageEnhance模块的使用如下:

from PIL import Image, ImageEnhance
im = Image.open("image.jpg")
enhancer = ImageEnhance.Brightness(im)
im0 = enhancer.enhance(0.5)  # 图像亮度减半

图像im0的亮度为图像im的一半。 ImageFile模块为图像打开和保存功能提供了相关支持功能。另外,它提供了一个Parser类,这个类可以一块一块地对一张图像进行解码(例如,网络连接中接收一张图像)。这个类的接口与标准的sgmllibxmllib模块的接口一样。 ImageFile模块的使用如下:

from PIL import ImageFile
parser = ImageFile.Parser()
with open("image.jpg", "rb") as f:
    while True:
        data = f.read(1024)
        if not data:
            break
        parser.feed(data)
im = parser.close()

因为所打开图像大小大于1024个byte,所以报错:图像不完整。 所以大家想看的可以自行去找一个小一点的图看一下。 ImageFileIO模块用于从一个socket或者其他流设备中读取一张图像。不赞成使用这个模块。在新的代码中将使用ImageFile模块的Parser类来代替它。 ImageFilter模块包括各种滤波器的预定义集合,与Image类的filter方法一起使用。该模块包含这些图像增强的滤波器:

  • BLUR
  • CONTOUR
  • DETAIL
  • EDGE_ENHANCE
  • EDGE_ENHANCE_MORE
  • EMBOSS
  • FIND_EDGES
  • SMOOTH
  • SMOOTH_MORE
  • SHARPEN ImageFilter模块的使用如下:
from PIL import Image, ImageFilter
im = Image.open("image.jpg")
im = im.filter(ImageFilter.BLUR)

ImageFont模块定义了一个同名的类,即ImageFont类。这个类的实例中存储着bitmap字体,需要与ImageDraw类的text方法一起使用。 PIL使用自己的字体文件格式存储bitmap字体。用户可以使用pilfont工具包将BDF和PCF字体描述器(Xwindow字体格式)转换为这种格式。 PIL Plus包中才会支持矢量字体。 ImageGrab模块用于将屏幕上的内容拷贝到一个PIL图像内存中。当前的版本只在Windows操作系统上可以工作。 ImageGrab模块的使用如下:

from PIL import ImageGrab
im = ImageGrab.grab()
im.show()

图像im显示出笔记本当前的窗口内容,就是类似于截图的工具。 ImageOps模块包括一些“ready-made”图像处理操作。它可以完成直方图均衡、裁剪、量化、镜像等操作。大多数操作只工作在L和RGB图像上。 ImageOps模块的使用如下:

from PIL import Image, ImageOps
im = Image.open("image.jpg")
im_flip = ImageOps.flip(im)

图像im_flip为图像im垂直方向的镜像。 ImagePath模块用于存储和操作二维向量数据。Path对象将被传递到ImageDraw模块的方法中。 ImagePath模块的使用如下:

from PIL import ImagePath
path = ImagePath.Path([(10, 10), (100, 100), (100, 0)])

ImageSequence模块包括一个wrapper类,它为图像序列中每一帧提供了迭代器。 ImageSequence模块的使用如下:

from PIL import ImageSequence
im = Image.open("animation.gif")
for frame in ImageSequence.Iterator(im):
    frame.show()

后面两次show()函数调用,分别显示第1张和第11张图像。 ImageStat模块计算一张图像或者一张图像的一个区域的全局统计值。 ImageStat模块的使用如下:

from PIL import ImageStat
stat = ImageStat.Stat(im)
print(stat.mean)

ImageTk模块用于创建和修改BitmapImagePhotoImage对象中的Tkinter。 ImageTk模块的使用如下:

from PIL import Image, ImageTk
import tkinter
root = tkinter.Tk()
im = Image.open("image.jpg")
photo = ImageTk.PhotoImage(im)
label = tkinter.Label(root, image=photo)
label.pack()
root.mainloop()

这个是我一直不太懂的有没有大佬能帮我解决一下在线等~急! PSDraw模块为Postscript打印机提供基本的打印支持。用户可以通过这个模块打印字体、图形和图像。

PIL中所涉及的基本概念

PIL中所涉及的基本概念有如下几个:

  • 通道(bands)
  • 模式(mode)
  • 尺寸(size)
  • 坐标系统(coordinate system)
  • 调色板(palette)
  • 信息(info)
  • 滤波器(filters) 每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。 以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道。 对于一张图片的通道数量和名称,可以通过getbands()方法来获取。getbands()方法是Image模块的方法,它会返回一个字符串元组(tuple)。该元组将包括每一个通道的名称。 getbands()方法的使用如下:
from PIL import Image
im = Image.open("image.jpg")
print(im.getbands())

图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

  • 1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
  • L:8位像素,表示黑和白。
  • P:8位像素,使用调色板映射到其他模式。
  • I:32位整型像素。
  • F:32位浮点型像素。
  • RGB:3x8位像素,为真彩色。
  • RGBA:4x8位像素,有透明通道的真彩色。
  • CMYK:4x8位像素,颜色分离。
  • YCbCr:3x8位像素,彩色视频格式。 PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。 可以通过mode属性读取图像的模式。其返回值是包括上述模式的字符串。 mode属性的使用如下:
from PIL import Image
im = Image.open("image.jpg")
print(im.mode)

通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。 mode属性的使用如下:

from PIL import Image
im = Image.open("image.jpg")
print(im.size)

PIL使用笛卡尔像素坐标系统,坐标(0, 0)位于左上角。注意:坐标值表示像素的角;位于坐标(0, 0)处的像素的中心实际上位于(0.5, 0.5)。 坐标经常用于二元组(x, y)。长方形则表示为四元组,前面是左上角坐标。例如:一个覆盖800x600的像素图像的长方形表示为(0, 0, 800, 600)。 调色板模式 ("P") 使用一个颜色调色板为每个像素定义具体的颜色值。 使用info属性可以为一张图片添加一些辅助信息。这是一个字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。 info属性的使用如下:

from PIL import Image
im = Image.open("image.jpg")
print(im.info)

对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了4个不同的采样滤波器:

  • NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
  • BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
  • BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
  • ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。 注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILINEARBICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。Image模块中的方法resize()thumbnail()用到了滤波器。 resize()方法的定义为:resize(size, filter=None) = image resize()方法的使用如下:
from PIL import Image
im = Image.open("image.jpg")
im = im.resize((100, 100), Image.BILINEAR)

对参数filter不赋值的话,resize()方法默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:

im = im.resize((100, 100), Image.ANTIALIAS)

thumbnail()方法的定义为:im.thumbnail(size, filter=None) thumbnail()方法的使用如下:

from PIL import Image
im = Image.open("image.jpg")
im.thumbnail((200, 200), Image.ANTIALIAS)

这里需要说明的是,方法thumbnail()需要保持宽高比,对于size=(200, 200)的输入参数,其最终的缩略图尺寸为(182, 200)。 对参数filter不赋值的话,方法thumbnail()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:

im.thumbnail((200, 200), Image.BICUBIC)