您的位置:

Python图像处理库PIL中的image.resize详解

一、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方法的基本使用方法和注意事项,可以轻松地对图像进行缩放、裁剪和拼接等各种操作。