使用Numpy模块可以方便地对图像进行裁剪。下面是使用Numpy模块裁剪图片的完整攻略:
导入Numpy模块
import numpy as np
from PIL import Image
在使用Numpy模块之前需要先导入模块。同时,还需要使用PIL模块中的Image类来读取图像文件。
读取图片文件
image = Image.open('example.jpg')
使用Image类的open()
方法打开图片文件,得到一个Image
对象,后续的处理都将通过这个对象进行。
将图像转化为Numpy数组
image_array = np.array(image)
使用Numpy模块将打开的图片转化为一个3维的Numpy数组,其中第一维表示像素的行数,第二维表示像素的列数,第三维表示像素的颜色通道数。
裁剪图片
cropped_image = image_array[50:150, 50:150]
使用Numpy的数组切片方法,取出指定的像素行列范围即可完成裁剪操作。以上示例将图片的行和列都裁剪到了50到150之间的范围。
将裁剪后的图像保存
cropped_image = Image.fromarray(cropped_image.astype('uint8'))
cropped_image.save('cropped_example.jpg')
使用fromarray()
方法将Numpy数组转化为Image
对象,并使用save()
方法将裁剪后的图像保存到指定文件中。注意,由于Numpy数组的数据类型是float
,但是Image
对象需要的是uint8
类型,因此需要在转化之前使用astype()
方法将数组数据类型强制转化为uint8
。
示例1:裁剪图标
image = Image.open('icon.png')
image_array = np.array(image)
cropped_image = image_array[10:110, 10:110]
cropped_image = Image.fromarray(cropped_image.astype('uint8')).save('cropped_icon.png')
以上示例将图标文件的像素行列都裁剪到了10到110之间的范围,并将裁剪后的结果保存为了新的图片文件。
示例2:裁剪彩色图片
image = Image.open('example.jpg')
image_array = np.array(image)
cropped_image = image_array[50:150, 50:150, :3]
cropped_image = Image.fromarray(cropped_image.astype('uint8')).save('cropped_example.jpg')
以上示例将彩色图片的像素行列都裁剪到了50到150之间的范围,并将裁剪后的结果保存为了新的图片文件。由于彩色图片的每个像素都有3个颜色通道,因此需要使用:
将前三维都选中,忽略掉最后一维(即alpha通道)。