本文目录一览:
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
如果a
为false
则返回a
,如果a
为true
则返回b
,详见Python语法。
对于更多高级的图像增强功能,可以使用 ImageEnhance
模块中的类。
可以调整图像对比度、亮度、色彩平衡、锐度等。
增强图像
PIL库包含对图像序列(动画格式)的基本支持。支持的序列格式包括 FLI/FLC、GIF 和一些实验性的格式。TIFF 文件也可以包含多个帧。
当打开一个序列文件时,PIL库自动加载第一帧。你可以使用 seek()
和 tell()
函数在不同帧之间移动。
读取序列
如例子中展示的,当序列到达结尾时,将抛出EOFError
异常。
注意当前版本的库中多数底层驱动只允许seek
到下一帧。如果想回到前面的帧,只能重新打开图像。
以下迭代器类允许在for
语句中循环遍历序列:
一个序列迭代器类
PIL库包含一些函数用于将图像、文本打印到Postscript打印机。以下是一个简单的例子。
打印到Postscript
如前所述,可以使用 open()
函数打开图像文件,通常传入一个文件名作为参数:
如果打开成功,返回一个Image
对象,否则抛出IOError
异常。
也可以使用一个file-like object代替文件名(暂可以理解为文件句柄)。该对象必须实现read
、seek
、tell
函数,必须以二进制模式打开。
从文件句柄打开图像
如果从字符串数据中读取图像,使用StringIO
类:
从字符串中读取
如果图像文件内嵌在一个大文件里,比如 tar 文件中。可以使用ContainerIO
或TarIO
模块来访问。
从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_dup
是im
的复制过来的,所以它们的差为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
类,这个类可以一块一块地对一张图像进行解码(例如,网络连接中接收一张图像)。这个类的接口与标准的sgmllib
和xmllib
模块的接口一样。
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
模块用于创建和修改BitmapImage
和PhotoImage
对象中的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
滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILINEAR
和BICUBIC
滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。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)