1.1 Pillow:Python图像处理类库
Pillow库提供了非常灵活的图像处理功能,可以轻松地完成以下任务
图像的基本操作,如打开、保存、裁剪、缩放、旋转图像等;
图像的颜色空间转换;
图像的滤镜和增强功能,例如模糊、锐化等;
在图像上绘制简单的图形和文字。
Pillow中最重要的模块为Image,要读取一幅图,可以使用:
from PIL import Image
pil_im = Image.open('xiaozhou.jpg').convert('L')
上述代码的返回值pil_im是一个PIL图像对象,convert()用于实现图像颜色的转换,转换成灰度图像,则用convert('L')表示。
1.1.1 转换图像格式
通过save()方法,Pillow可以将图像保存成多种格式的文件。
from PIL import Image
import os
for infile in filelist:
outfile = os.path.splitext(infile)[0] + ".jpg"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print "cannot convert",infile
Pillow函数会进行简单的检查,如果文件不是JPEG格式,会自动将其转换成JPEG格式;如果转换失败,它会在控制台输出一条报告失败的消息。
创建一个包含文件夹中所有图像文件的文件列表,先新建一个名为imtools.py(我们将一些经常使用的图像操作存储其中)的文件。
import os
def get_imlist(path):
"""返回目录中所有JPG图像的文件名列表"""
return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]
导入os模块,该模块提供与操作系统交互的功能,比如文件和目录操作。这段代码的作用是遍历指定目录 path,并返回一个包含所有 .jpg 图像文件的完整路径的列表。
1.1.2 创建缩略图
thumbnail()方法接收一个指定生成缩略图大小的元组参数,将图像转换成符合元组参数指定大小的缩略图。
pil_im.thumnail((128,128))
1.1.3 复制和粘贴图像区域
使用crop()方法可以从一幅图像中裁剪指定区域,该区域用四元组来指定,坐标以此(左,上,右,下),Pillow中指定坐标系的左上角坐标(0,0):
box = (100,100,400,400)
region = pil_im.crop(box)
region = region.transpose(Image.ROTAT_180)
pil_im.paste(region,box)
1.1.4 调整尺寸和旋转
resize()方法用来指定新图像的大小,调用rotate()方法进行逆时针旋转。
out = pil_im.resize((128,128))
out2 = pil_im.rotate(45)
1.2 Matplotlib
1.2.1 绘制图像、点和线
Matplotlib可以绘制点和线,来表示一些事物,比如兴趣点、对应点以及检测出的物体。
from PIL import Image
from pylab import *
#读取图像到数组中
im = array(Image.open('xiaozhou.jpg')
#绘制图像
imshow(im)
#一些点
x = [100,100,400,400]
y = [200,500,200,500]
#使用红色星状标记绘制点
plot(x,y,'r*')
#绘制连接前两个点的线
plot(x[:2],y[:2])
#添加标题,显示绘制的图像
title('Plotting:"xiaozhou.jpg"')
show()
使用 Matplotlib 的 imshow
函数显示图像数据。此时,图像会显示在一个 Matplotlib 图形窗口中。使用红色星状标记('r*'
)在图像上绘制这些点。绘制连接前两个点的线段。x[:2]和 y[:2]选择了前两个点的坐标。这段代码首先读取并显示图像,然后在图像上绘制指定的点和线段,并在图形窗口中添加标题,最终,图形窗口展示了图像及其上的标记和线条。下图是绘制的图像

在绘制图像时,可以控制图像的颜色和样式
颜色 | |||
---|---|---|---|
'b' | 蓝色 | 'g' | 绿色 |
'r' | 红色 | 'c' | 青色 |
'm' | 品色 | 'y' | 黄色 |
'k' | 黑色 | 'w' | 白色 |
线型 | |
---|---|
'-' | 实线 |
‘--’ | 虚线 |
‘:’ | 点线 |
标记 | |||
---|---|---|---|
'.' | 点 | 'o' | 圆圈 |
's' | 正方形 | '*' | 星形 |
'+' | 加号 | 'x' | 叉号 |
1.2.2 图像轮廓和直方图
绘制图像的轮廓需要对每个坐标[x,y]的像素值施加一个阈值,所以首先要将图像灰度化。图像的直方图用来表征该图像像素的分布情况,用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。
from PIL import Image
from pylab import *
#读取图像到数组中
im = array(Image.open('xiaozhou.jpg').convert('L'))
#新建一个图像
figure()
#不使用颜色信息
gray()
#在原点的左上角显示轮廓图像
contour(im,origin='image')
axis('equal')
axis('off')
show()
figure()
hist(im.flatten(),128)
show()
contour(im,origin='image')绘制输入图像的轮廓图。origin='image'
参数将图像的原点设置在左上角(通常情况下,原点默认在左下角)。axis('equal')确保 x 和 y 轴具有相同的缩放比例,以保持图像的实际比例。上述代码运行的结果如下图。


1.3 NumPy
NumPy(Numerical Python的缩写)是一个广泛使用的Python库,主要用于进行数值计算。它为Python提供了一个强大的N维数组对象,并提供了许多用于操作这些数组的函数和工具。
1.3.1 图像数组表示
NumPy中的数组对象是多维的,可以用来表示向量、矩阵和图像。一个数组对象很像一个列表,但是数组所有的元素必须具有相同的数据类型。除非创建数组对象时指定数据类型,否则数据类型会按照数据的类型自动确定。
im = array(Image.open('xiaozhou.jpg'))
print(im.shape,im.dtype)
im1 = array(Image.open('xiaozhou.jpg').convert('L'),'f')
print(im1.shape,im1.dtype)
控制台输出的结果如下
(2000, 2999, 3) uint8
(2000, 2999) float32
每行的第一个元组表示图像数组的大小(行、列、颜色通道),紧接着的字符串表 示数组元素的数据类型。
1.3.2 灰度变换
考虑到任意函数f,它将[0,255]区间映射到自身,也就是说输出区间的范围和输入区间的范围相同。
from PIL import Image
from pylab import *
im1 = array(Image.open('blue_sky.jpg').convert('L'))
im2 = 255 - im1 #对图像进行反相处理
im3 = (100.0/255) * im1 + 100 #将图像像素变换到100...200区间
im4 = 255.0 * (im1/255.0)**2 #对图像像素求平方后得到的图像
运行结果如下图所示



1.3.3 图像缩放
def imresize(im,sz):
"""使用PIL对象重新定义图像数组的大小"""
pil_im = Image.fromarray(uint8(im))
return array(pil_im.resize(sz))
首先,将输入的图像数组 im
转换为 uint8
数据类型,以确保图像像素值在0到255之间,这是PIL库处理图像时所需的格式;再将NumPy数组转换为PIL图像对象,赋值给变量 pil_im;最后
使用给定的尺寸 sz
调整图像的大小,并返回一个新的PIL图像对象。