[雪峰磁针石博客]python库介绍-图像处理工具pillow中文文档-手册(2018 5.*)

简介:

概述

Python Imaging Library给Python解释器增加了图像处理能力。

该库提供了广泛的文件格式支持,高效的内部展现,以及十分强大的图像处理能力。

核心图像库专为以几种存储为基本像素格式数据的快速访问而设计。它为通用图像处理工具提供了坚实的基础。

我们来看看这个库的用途。

  • 图像存储

PIL适合图像归档和图像批量处理,你可以使用它建立缩略图,转换格式,打印图片等。

现在的版本可以识别和读取大量的图片格式,写入常用的转换和表示格式。

  • 图像显示

当前版本包含了Tk PhotoImageBitmapImage接口, 以及Windows DIB interface ,可以在PythonWin和其他基于Windows的工具包中使用。许多其他GUI工具包带有某种类型的PIL支持。

为了方便调试还提供了show()方法,可以保存图像到磁盘并调用外显示。它将图像保存到磁盘,并调用外部显示工具。

  • 图像处理

这个库包含了基本的图像处理功能,包括点操作,使用内置卷积内核过滤,色彩空间转换。

这个库还支持更改图像大小、旋转、任意仿射变换。

直方图方法允许你统计图像,这可以用于对比度增强和全局统计分析。

教程

使用 Image 类

PIL最重要的类是Image, 你可以通过多种方法创建这个类的实例,比如从文件加载图像,或者处理其他图像, 或者从或从头开始创建图像。

要从文件加载图像,请使用:Image模块中的open函数:


>>> from PIL import Image
>>> im = Image.open("hopper.ppm")

如果成功,这个函数返回Image对象。 您现在可以使用实例属性来检查文件内容:


>>> print(im.format, im.size, im.mode)
PPM (512, 512) RGB

format属为图像来源。如果不是从文件读取就是None。size属性是包含宽度和高度(像素)的二元组)。模式属性定义了图像中波段的数量和名称,以及像素类型和深度。 常见模式为灰度图像为“L”(亮度),真彩色图像为“RGB”,印刷四色为“CMYK”。

如果文件无法打开,则会引发IOError异常。

获得了Image类的实例,就可以使用此类定义的方法来处理和操作图像。 例如让我们显示刚刚加载的图像:


>>> im.show()

注意

show的标准版本效率不高,因为它将图像保存到临时文件并调用xv工具显示图像。 如果你没有安装xv,它甚至不会工作。 它对于调试和测试非常方便。

下面实例把上述步骤给串起来

pillow_read.py


from PIL import Image

im = Image.open("demo.jpg")
print(im.format, im.size, im.mode)
im.show()

代码地址

以下各节概述了此库中提供的不同功能。

image.png

参考资料

读写图像

PIL库支持大量图片格式。使用Image模块的open()函数从磁盘读取文件。你不需要知道文件格式就能打开它,PIL能够根据文件内容自动确定确定文件格式。

要保存文件,使用Image类的save()方法。保存文件的时候文件名变得重要了。除非你指定格式,PIL将会以文件名的扩展名作为格式保存。

转换文件为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:
            Image.open(infile).save(outfile)
        except IOError:
            print("cannot convert", infile)

save()方法的第二个参数可以指定文件格式,如果你使用非标准的扩展名你必须这样做。

创建 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:
            im = Image.open(infile)
            im.thumbnail(size)
            im.save(outfile, "JPEG")
        except IOError:
            print("cannot create thumbnail for", infile)

需要注意的是,除非真的需要,否则库不会解码或加载栅格数据。打开文件时,会读取文件头以确定文件格式并提取解码文件所需的模式,大小和其他属性,但文件的其余部分在稍后才能处理。

这意味着打开图像文件是快速操作,和文件大小和压缩类型无关。比如快速识别图像文件:


import sys
from PIL import Image

for infile in sys.argv[1:]:
    try:
        with Image.open(infile) as im:
            print(infile, im.format, "%dx%d" % im.size, im.mode)
    except IOError:
        pass

剪切,粘贴,合并图像

Image类包含允许您操作图像内区域的方法。要从图像中提取子矩形,请使用crop()方法。

复制图像中的子矩形


box = (100, 100, 400, 400)
region = im.crop(box)

该区域由四元组定义,其中坐标是(左,上,右,下)。 PIL使用左上角为 (0, 0) 的坐标系。另请注意,坐标是指像素之间的位置,因此上例中的区域恰好为300x300像素。

现在可以以某种方式处理该区域并粘贴回来。

处理子矩形并粘贴回来


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

当粘贴区域时,区域的大小必须完全匹配。但是模式不需要匹配。模式不匹配时会在粘贴之前自动转换。

滚动图像


def roll(image, delta):
    """Roll an image sideways."""
    xsize, ysize = image.size

    delta = delta % xsize
    if delta == 0: return image

    part1 = image.crop((0, 0, delta, ysize))
    part2 = image.crop((delta, 0, xsize, ysize))
    part1.load()
    part2.load()
    image.paste(part2, (0, 0, xsize-delta, ysize))
    image.paste(part1, (xsize-delta, 0, xsize, ysize))

    return image

调用示例:

pillow_roll.py


from PIL import Image

def roll(image, delta):
    """Roll an image sideways."""
    xsize, ysize = image.size

    delta = delta % xsize
    if delta == 0: return image

    part1 = image.crop((0, 0, delta, ysize))
    part2 = image.crop((delta, 0, xsize, ysize))
    part1.load()
    part2.load()
    image.paste(part2, (0, 0, xsize-delta, ysize))
    image.paste(part1, (xsize-delta, 0, xsize, ysize))

    return image

im = Image.open("demo.jpg")
im = roll(im,100)
im.show()

image.png

[代码地址]https://github.com/china-testing/python-api-tesing/tree/master/python3_libraries/pillow)

请注意粘贴时首先调用crop(),如果未调用则在paste命令中使用图像之前,不会执行裁剪操作。这意味着part1会从第一次粘贴已经修改的图像版本中剪切掉。

粘贴方法也可以将透明度掩码作为可选参数。在此掩码中,值255表示粘贴的图像在该位置不透明(即按原样使用粘贴的图像)。值0表示粘贴的图像是完全透明的。中间值表示不同级别的透明度。例如,粘贴RGBA图像并将其用作蒙版将粘贴图像的不透明部分,但不粘贴透明背景。

PIL还允许您使用多波段图像的各个波段,例如RGB图像。拆分方法会创建新图像,每个图像都包含原始多波段图像中的一个波段。合并功能采用模式和图像元组,并将它们组合成新图像。以下示例交换RGB图像的三个波段:

分割和合并色带


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

注意,对于单波段图像,split()会返回图像本身。要使用单独的色带,可能首先要将图像转换为“RGB”。

几何变换

PIL.Image.Image类包含调整resize()和rotate()图像的方法。前者需要给出尺寸的元组,后者是逆时针方向的角度。

简单的几何变换


out = im.resize((128, 128))
out = im.rotate(45) # degrees counter-clockwise

要以90度的步幅旋转图像,您可以使用rotate()方法或transpose()方法。后者也可用于翻转水平或垂直轴周围的图像。

转置图像


out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)

如果expand标志为真,transpose(ROTATE)操作也可以与rotate()操作完全相同,以提供与图像大小相同的更改。

可以通transform()方法执行更常用的图像转换。

示例:


#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author:    xurongzhong#126.com 技术支持qq群:6089740
# CreateDate: 2018-3-27
# rotate.py
import glob
import os 
from PIL import Image

def rotate(files, dst, value=90):
    for file_ in files:
        img = Image.open(file_)
        img = img.rotate(value)
        name = "{}{}{}".format(dst, os.sep, os.path.basename(file_))
        img.save(name)

src = r'/home/andrew/code/tmp_photos'
dst = r'/home/andrew/code/tmp_photos2'

common = glob.glob('{}{}*.*'.format(src, os.sep))  
rotate(common, dst)

代码地址

颜色转换

PIL允许您使用convert() 方法在不同的像素表示之间转换图像。

模式转换


from PIL import Image
im = Image.open("hopper.ppm").convert("L")

该库支持每种支持模式和“L”和“RGB”模式之间的转换。要在其他模式之间转换,您可能必须使用中间图像(通常是“RGB”)图像。

图像增强

PIL提供了许多可用于增强图像的方法和模块。

  • 过滤器

ImageFilter模块包含许多可以与filter()方法一起使用的预定义增强过滤器。

应用过滤器


from PIL import ImageFilter
out = im.filter(ImageFilter.DETAIL)
  • 点操作
    point()方法可用于转换图像的像素值(例如图像对比度操作)。在大多数情况下,期望一个参数的函数对象可以传递给此方法。每个像素都根据该功能进行处理:

# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)

使用上述技巧,您可以快速将任何简单表达式应用于图像。你也可以结合point()和paste()方法来选择性地修改图像:

处理单个色带


# split the image into individual bands
source = im.split()

R, G, B = 0, 1, 2

# select regions where red is less than 100
mask = source[R].point(lambda i: i < 100 and 255)

# process the green band
out = source[G].point(lambda i: i * 0.7)

# paste the processed band back, but only where red was < 100
source[G].paste(out, None, mask)

# build a new multiband image
im = Image.merge(im.mode, source)

Python仅根据确定结果所需的逻辑表达式部分进行评估,并返回检查的最后值作为表达式的结果。因此,如果上面的表达式为假(0),Python不会查看第二个操作数,并返回0.否则,返回255。

  • 增强

对于更高级的图像增强,您可以使用ImageEnhance模块中的类。从图像创建后,可以使用增强对象快速尝试不同的设置。

您可以用这种方式调整对比度,亮度,色彩平衡和清晰度。

增强图像


from PIL import ImageEnhance

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

图像序列

Python图像库包含对图像序列(也称为动画格式)的一些基本支持。支持的序列格式包括FLI/FLC, GIF和一些实验格式。 TIFF文件也可以包含多个帧。

当你打开一个序列文件时,PIL自动加载序列中的第一帧。您可以使用seek和tell方法在不同的帧之间移动:

读序列


from PIL import Image

im = Image.open("animation.gif")
im.seek(1) # skip to the second frame

try:
    while 1:
        im.seek(im.tell()+1)
        # do something to im
except EOFError:
    pass # end of sequence

正如在这个例子中看到的,当序列结束时,你会得到EOFError异常。

注意当前版本库中的大多数驱动程序只允许您寻找下一帧(如上例所示)。要倒回文件,您可能必须重新打开它。

下面的类让你使用for语句来遍历序列:


from PIL import ImageSequence
for frame in ImageSequence.Iterator(im):
    # ...do something to frame...

后记打印
Python影像库包括在Postscript打印机上打印图像,文本和图形的功能。这里有一个简单的例子:


from PIL import Image
from PIL import PSDraw

im = Image.open("hopper.ppm")
title = "hopper"
box = (1*72, 2*72, 7*72, 10*72) # in points

ps = PSDraw.PSDraw() # default is sys.stdout
ps.begin_document(title)

# draw the image (75 dpi)
ps.image(box, im, 75)
ps.rectangle(box)

# draw title
ps.setfont("HelveticaNarrow-Bold", 36)
ps.text((3*72, 4*72), title)

ps.end_document()

更多关于读图片

如前所述,Image模块的open() 函数用于打开图像文件。在大多数情况下,您只需将文件名作为参数传递给它:


from PIL import Image
im = Image.open("hopper.ppm")

如果一切顺利,结果是一个PIL.Image.Image对象。否则,会引发IOError异常。

您可以使用文件类对象而不是文件名。该对象必须实现read(), seek()和tell()方法,并以二进制模式打开。

从打开的文件中读取


from PIL import Image
with open("hopper.ppm", "rb") as fp:
    im = Image.open(fp)

要从字符串数据读取图像,请使用StringIO类:

从字符串中读取


import StringIO

im = Image.open(StringIO.StringIO(buffer))

请注意,在读取图像标题之前,库会回滚文件(使用seek(0))。另外,当读取图像数据时(通过加载方法),也将使用seek。如果映像文件嵌入到较大的文件中,例如tar文件,则可以使用ContainerIO或TarIO模块访问它。

从tar档案中读取


from PIL import Image, TarIO

fp = TarIO.TarIO("Tests/images/hopper.tar", "hopper.jpg")
im = Image.open(fp)

控制解码器

某些解码器允许您在从文件中读取图像的同时操作图像。当创建缩略图时(速度通常比质量更重要)和打印到黑白激光打印机(只需要灰度版本的图像时)时,通常可以使用此功能来加速解码。

draft() 方法处理已打开但尚未加载的图像,以便尽可能匹配给定的模式和大小。这是通过重新配置图像解码器完成的。

以草稿模式阅读
这仅适用于JPEG和MPO文件。


from PIL import Image
from __future__ import print_function
im = Image.open(file)
print("original =", im.mode, im.size)

im.draft("L", (100, 100))
print("draft =", im.mode, im.size)

这样打印出如下内容:


original = RGB (512, 512)
draft = L (128, 128)

请注意,生成的图像可能不完全符合请求的模式和尺寸。为确保图像不大于给定大小,请改用缩略图方法。

相关文章
|
5天前
|
Python
在Python中绘制K线图,可以使用matplotlib和mplfinance库
使用Python的matplotlib和mplfinance库可绘制金融K线图。mplfinance提供便利的绘图功能,示例代码显示如何加载CSV数据(含开盘、最高、最低、收盘价及成交量),并用`mpf.plot()`绘制K线图,设置类型为&#39;candle&#39;,显示移动平均线(mav)和成交量信息。可通过调整参数自定义图表样式,详情参考mplfinance文档。
15 2
|
5天前
|
机器学习/深度学习 边缘计算 TensorFlow
【Python机器学习专栏】Python机器学习工具与库的未来展望
【4月更文挑战第30天】本文探讨了Python在机器学习中的关键角色,重点介绍了Scikit-learn、TensorFlow和PyTorch等流行库。随着技术进步,未来Python机器学习工具将聚焦自动化、智能化、可解释性和可信赖性,并促进跨领域创新,结合云端与边缘计算,为各领域应用带来更高效、可靠的解决方案。
|
5天前
|
机器学习/深度学习 计算机视觉 Python
【Python 机器学习专栏】图像数据的特征提取与预处理
【4月更文挑战第30天】本文探讨了图像数据的特征提取与预处理在机器学习中的重要性。图像数据具有大容量、信息丰富和冗余性高的特点。特征提取涉及颜色、纹理和形状特征;预处理包括图像增强、去噪和分割。Python的OpenCV和Scikit-image库在处理这些任务时非常有用。常见的特征提取方法有统计、变换和基于模型的方法,而预处理应注意保持图像真实性、适应性调整及验证评估。有效的特征提取和预处理能提升模型性能,Python工具使其更高效。
|
5天前
|
机器学习/深度学习 PyTorch 算法框架/工具
Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化
Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化
|
6天前
|
Serverless Python
使用Python的pandas和matplotlib库绘制移动平均线(MA)示例
使用Python的pandas和matplotlib库绘制移动平均线(MA)示例:加载CSV数据,计算5日、10日和20日MA,然后在K线图上绘制。通过`rolling()`计算平均值,`plot()`函数展示图表,`legend()`添加图例。可利用matplotlib参数自定义样式。查阅matplotlib文档以获取更多定制选项。
16 1
|
6天前
|
数据采集 SQL 数据挖掘
Python数据分析中的Pandas库应用指南
在数据科学和分析领域,Python语言已经成为了一种非常流行的工具。本文将介绍Python中的Pandas库,该库提供了强大的数据结构和数据分析工具,使得数据处理变得更加简单高效。通过详细的示例和应用指南,读者将了解到如何使用Pandas库进行数据加载、清洗、转换和分析,从而提升数据处理的效率和准确性。
|
6天前
|
SQL 关系型数据库 MySQL
使用Python的pymysql库连接MySQL,执行CRUD操作
使用Python的pymysql库连接MySQL,执行CRUD操作:安装pymysql,然后连接(host=&#39;localhost&#39;,user=&#39;root&#39;,password=&#39;yourpassword&#39;,database=&#39;yourdatabase&#39;),创建游标。查询数据示例:`SELECT * FROM yourtable`;插入数据:`INSERT INTO yourtable...`;更新数据:`UPDATE yourtable SET...`;删除数据:`DELETE FROM yourtable WHERE...`。
13 0
|
6天前
|
机器学习/深度学习 人工智能 计算机视觉
使用Python实现简单的图像识别应用
本文介绍了如何使用Python编写一个简单的图像识别应用程序。通过结合Python的图像处理库和机器学习库,我们可以轻松地构建一个能够识别特定物体或图案的程序。本文将从安装必要的库开始,然后逐步介绍如何编写代码来实现图像的加载、处理和识别。
|
6天前
|
机器学习/深度学习 算法 数据挖掘
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧
|
6天前
|
数据可视化 API Python
Python绘图工具seaborn,教会你如何绘制更加精美的图形(二)
Python绘图工具seaborn,教会你如何绘制更加精美的图形(二)