你可以利用 PIL (Python Imaging Library, 图像处理类库)进行图像操作,比如图像缩放、裁剪、旋转、颜色转换等。
Matplotlib 是一个绘图库,具有比 PIL 更强大的绘图功能,Matplotlib 中的 PyLab 接口包含很多方便用户创建图像的函数。
实验 1 读取图片
利用 PIL 中的 Python 模块读取一张图片,然后讲其转换成灰度图像,并使其显示。
# 引入实验需要的库
from PIL import Image
from pylab import imshow
# 设置在jupyter notebook中以内联的形式显示 matplotlib 绘制的图片(显示更美观)
%matplotlib inline
# 使用 Image.open(path) 读取你电脑中的一张图片
path = 'untitled.png' # 需要打开的图片的路径
pil_im = Image.open(path)
# 使用 convert('L') 方法将其转换为灰度图像,
pil_im_l = pil_im.convert('L')
# 显示经过处理后的灰度图片
imshow(pil_im_l, cmap='gray')
实验 2 对图像的简单处理
使用 PIL 中的 thumbnail() 方法可以很方便的创建图像的缩略图,它接受一个指定生成缩略图大小的二元元组。
你需要创建一个缩略图,并使其显示; 然后使用 crop() 方法从一副图像中裁剪指定区域,再将裁减的区域使用 transpose() 方法选择 180 度,最后用 paste() 方法将旋转后的区域放回原图并使其显示。
旋转 180 度时,可能要用到 Image.ROTATE_180 这一预定义常量,你也可以使用 resize, rotate 方法完成这个实验。
pil_im.thumbnail((32, 32))
imshow(pil_im)
# thubmnail(), paste() 等方法会直接修改对象本身,在进行下面的操作之前,需要重新获取图片
pil_im = Image.open(path)
box = (100, 100, 500, 500) # box 为一个代表(左,上,右,下)的四元组
region = pil_im.crop(box) # 进行裁剪
region = region.transpose(Image.ROTATE_180)
imshow(region)
pil_im.paste(region)
imshow(pil_im)
实验 3 图像轮廓和直方图
图像用 NumPy 数组表示后,我们可以对它们执行任意数学操作。
因为绘制轮廓需要对每个坐标[x, y]的像素值施加同一个阈值,所以首先要将图像灰度化:
实验 4 灰度变换
在这个实验中,你需要先将图像读入 NumPy 数组(可参考实验 3),然后构造不少于一个映射,将 0…255 区间(或者 0…1 区间)映射到自身(即输出区间范围和输入区间范围相同)。
# 灰度变换举例
figure()
imshow(im)
# 例子:颜色反转
im2 = 255 - im
figure()
imshow(im2)