一、resize基本概念
在图像处理中,resize是指改变图像的大小,通常比例和尺寸都会发生变化。PIL中的resize函数主要用于调整图像的大小,并可以改变图像的比例和尺寸。
resize方法有两个参数,即参数size和resample,其中size可以是一个整数,也可以是一个二元的元组,表示新的图像大小;resample是指新图像的采样方式,即图像调整的方法,可以是近邻法、双线性插值法、三次样条插值法等。
下面是一个resize函数的基本代码:
from PIL import Image # 打开原始图像 im = Image.open("example.jpg") # 调整图像尺寸 im_resized = im.resize((400, 300), resample=Image.BILINEAR) # 显示调整后的图像 im_resized.show()
二、resize参数详解
1. size参数
size参数是一个元组,表示新的图像大小。如果指定一个整数n,则表示图像的宽和高都将缩放到原图像大小的n分之一。如果指定一个二元元组(w, h),则表示图像的宽和高将缩放到指定的大小(w, h)。
如果只指定宽度或高度,则使用Aspect Ratio来调整另一个维度的大小,使得图像的比例不会变形。
例如,下面的代码将把图像的宽和高都缩放到原来的2倍:
from PIL import Image # 打开原始图像 im = Image.open("example.jpg") # 缩放图像大小到原来的2倍 im_resized = im.resize((im.size[0]*2, im.size[1]*2), resample=Image.BILINEAR) # 显示调整后的图像 im_resized.show()
2. resample参数
resample参数用于指定新图像的采样方式,即图像调整的方法。PIL中支持多种图像调整的方法,如近邻法、双线性插值法、三次样条插值法等。
具体的resample参数取值及其内部实现方式见下表:
resample参数取值 | 内部实现方式 |
---|---|
Image.NEAREST | 最近邻法 |
Image.BOX | 箱式过滤 |
Image.BILINEAR | 双线性插值法 |
Image.HAMMING | 汉明窗口法 |
Image.BICUBIC | 三次样条插值法 |
Image.LANCZOS | Lanczos窗口法 |
例如,下面的代码将使用双线性插值法将原图像缩放到原来的2倍:
from PIL import Image # 打开原始图像 im = Image.open("example.jpg") # 缩放图像大小到原来的2倍 im_resized = im.resize((im.size[0]*2, im.size[1]*2), resample=Image.BILINEAR) # 显示调整后的图像 im_resized.show()
三、resize实际应用
1. 缩略图
缩略图是一种特殊的图像resize,用于将图像缩小到指定大小以适合网页显示或缩略图显示。
在PIL中,可以使用thumbnail方法来创建缩略图,它与resize方法的区别在于,thumbnail会更改原始图像,而resize方法会返回一个新的图像对象。
下面的示例代码将创建一个200x200像素的缩略图:
from PIL import Image # 打开原始图像 im = Image.open("example.jpg") # 创建并显示缩略图 im.thumbnail((200, 200)) im.show()
2. 批量处理图片
在实际应用中,经常需要批量处理大量的图像,比如将多张图片缩放到相同的大小、水平翻转或垂直翻转等操作。这时可以使用Python的os、glob和PIL库来实现。
下面的示例代码将批量处理指定文件夹下的所有图片,并将它们缩放到指定的大小:
import os import glob from PIL import Image # 指定原始图像目录和输出目录 input_dir = "/input" output_dir = "/output" # 指定目标大小 target_size = (200, 200) # 遍历所有png和jpg图像文件 for file_path in glob.glob(os.path.join(input_dir, "*.png")) + glob.glob(os.path.join(input_dir, "*.jpg")): # 打开原始图像 im = Image.open(file_path) # 缩放图像大小到指定大小 im_resized = im.resize(target_size, resample=Image.BILINEAR) # 拼接输出路径 output_path = os.path.join(output_dir, os.path.basename(file_path)) # 保存调整后的图像到输出目录 im_resized.save(output_path)
3. 使用resize进行图像缩放与拼接
大型图像常常需要缩小和拼接才能方便地查看,PIL的resize方法可以很好地实现这一功能。下面的示例代码将把一个大图像分割成多个小图像,并将它们依次排列拼接在一起:
from PIL import Image # 打开原始图像 im = Image.open("example.png") # 分割图像成4个子图 sub_images = [] sub_images.append(im.crop((0, 0, im.size[0]//2, im.size[1]//2))) sub_images.append(im.crop((im.size[0]//2, 0, im.size[0], im.size[1]//2))) sub_images.append(im.crop((0, im.size[1]//2, im.size[0]//2, im.size[1]))) sub_images.append(im.crop((im.size[0]//2, im.size[1]//2, im.size[0], im.size[1]))) # 缩放子图像 sub_images_resized = [x.resize((x.size[0]//2, x.size[1]//2), resample=Image.BILINEAR) for x in sub_images] # 计算输出图像大小 output_size = (im.size[0], im.size[1]//2*2) # 创建新的输出图像 output = Image.new(im.mode, output_size) # 拼接子图像到输出图像 output.paste(sub_images_resized[0], (0, 0)) output.paste(sub_images_resized[1], (im.size[0]//2, 0)) output.paste(sub_images_resized[2], (0, im.size[1]//2)) output.paste(sub_images_resized[3], (im.size[0]//2, im.size[1]//2)) # 显示调整后的图像 output.show()
四、结语
本篇文章主要介绍了Python图像处理库PIL中的image.resize方法,包括resize方法的基本概念、参数详解和实际应用场景。通过这些内容的讲解,相信大家已经掌握了PIL中image.resize方法的基本使用方法和注意事项,可以轻松地对图像进行缩放、裁剪和拼接等各种操作。