第5章: 图像变换与仿射操作

图像变换和仿射操作是图像处理中常用的技术,通过旋转、缩放、平移、剪裁等操作,可以实现多种视觉效果以及数据增强。

1.1 图像旋转
1.1.1 基础旋转操作

使用 rotate() 方法可以对图像进行旋转操作,指定旋转的角度(以度为单位),图像将以其中心为轴进行旋转。

python 复制代码
from PIL import Image

# 打开图像
image = Image.open("example.jpg")

# 旋转图像90度
rotated_image = image.rotate(90)
rotated_image.show()

参数说明

  • angle: 指定旋转角度,正值为顺时针旋转,负值为逆时针旋转。
  • expand: 设置为 True 时,图像旋转后调整画布大小以适应整个旋转后的图像。
1.1.2 自适应画布的旋转
python 复制代码
# 自适应画布大小,防止图像被裁剪
rotated_image = image.rotate(45, expand=True)
rotated_image.show()

案例:制作旋转图像的拼图

通过将多个角度的旋转图像组合在一起,可以创建有趣的拼图效果。

python 复制代码
angles = [0, 45, 90, 135]
collage = Image.new("RGB", (image.width * 2, image.height * 2))

for i, angle in enumerate(angles):
    rotated_part = image.rotate(angle, expand=True)
    x = (i % 2) * image.width
    y = (i // 2) * image.height
    collage.paste(rotated_part, (x, y))

collage.show()

1.2 图像缩放

缩放图像可以调整图像的分辨率和尺寸,Pillow 提供了 resize() 方法来实现该功能。

1.2.1 等比例缩放
python 复制代码
# 等比例缩放至一半尺寸
scaled_image = image.resize((image.width // 2, image.height // 2))
scaled_image.show()
1.2.2 非等比例缩放

如果不保持宽高比,可以指定任意尺寸。

python 复制代码
# 非等比例缩放
stretched_image = image.resize((300, 600))
stretched_image.show()

案例:生成缩略图

生成缩略图可以快速预览图像内容,Pillow 提供了 thumbnail() 方法,它会在等比例缩放下,将图像调整为目标尺寸以内。

python 复制代码
thumbnail_image = image.copy()
thumbnail_image.thumbnail((100, 100))
thumbnail_image.show()

1.3 图像平移

图像平移可以让图像内容在画布上进行位置移动。Pillow 中可以使用 transform() 方法来实现平移操作。

python 复制代码
from PIL import Image, ImageTransform

# 平移图像
shifted_image = image.transform(image.size, ImageTransform.AffineTransform((1, 0, 50, 0, 1, 30)))
shifted_image.show()

1.4 图像剪裁

图像剪裁用于提取图像的某个部分,可以使用 crop() 方法指定一个矩形区域,从而裁剪出该部分。

python 复制代码
# 裁剪图像的中心部分
left = image.width // 4
top = image.height // 4
right = image.width * 3 // 4
bottom = image.height * 3 // 4

cropped_image = image.crop((left, top, right, bottom))
cropped_image.show()

案例:制作九宫格图像

将图像按均匀划分成九个区域,并分别提取。

python 复制代码
rows, cols = 3, 3
grid_size = (image.width // cols, image.height // rows)
collage = Image.new("RGB", (image.width, image.height))

for i in range(rows):
    for j in range(cols):
        left = j * grid_size[0]
        top = i * grid_size[1]
        right = left + grid_size[0]
        bottom = top + grid_size[1]
        
        cropped_part = image.crop((left, top, right, bottom))
        collage.paste(cropped_part, (left, top))

collage.show()

1.5 仿射变换

仿射变换可以实现复杂的几何变换,如旋转、缩放、平移等的组合。Pillow 的 transform() 方法支持自定义矩阵,以实现仿射变换。

1.1.1 自定义仿射矩阵

仿射变换矩阵是一种 3x3 的矩阵,通常表示为:

a b c d e f 0 0 1

在 Pillow 中,我们将此矩阵简化为六个参数 (a, b, c, d, e, f)

python 复制代码
# 创建自定义仿射变换
matrix = (1, 0.3, 0, 0.3, 1, 0)
transformed_image = image.transform(image.size, Image.AFFINE, matrix)
transformed_image.show()

案例:生成透视效果

通过调整仿射变换矩阵的参数,可以创建透视效果,使图像看起来像从不同角度拍摄。

python 复制代码
# 创建透视效果
perspective_matrix = (1, -0.5, 0, 0.5, 1, 0)
perspective_image = image.transform(image.size, Image.AFFINE, perspective_matrix)
perspective_image.show()

1.6 图像翻转

Pillow 提供了简单的图像翻转方法 transpose(),可以进行水平和垂直翻转。

1.6.1 水平翻转
python 复制代码
# 水平翻转
flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)
flipped_image.show()
1.6.2 垂直翻转
python 复制代码
# 垂直翻转
flipped_image = image.transpose(Image.FLIP_TOP_BOTTOM)
flipped_image.show()

1.7 图像变换综合案例

将本章学到的变换操作结合起来,可以实现复杂的图像效果。

案例:创建万花筒效果

将图像进行多次旋转和平移,从而生成万花筒的视觉效果。

python 复制代码
kaleidoscope_image = Image.new("RGB", (image.width * 2, image.height * 2))

for angle in range(0, 360, 45):
    rotated = image.rotate(angle, expand=True)
    kaleidoscope_image.paste(rotated, (angle % 2 * image.width, angle // 2 * image.height))

kaleidoscope_image.show()
相关推荐
啥也不行就是菜14 小时前
【AI助手】从零构建文章抓取器 MCP(Node.js 版)
人工智能·mcp·trae
亚里随笔14 小时前
ReSpec:突破RL训练瓶颈的推测解码优化系统
人工智能·深度学习·自然语言处理·大语言模型·rlhf
Anson Jiang14 小时前
PyTorch轻松实现CV模型:零基础到实战
pytorch·python·django·flask·python开发
腾讯云开发者14 小时前
对话香港城市大学张泽松:AI时代教育“变天”?先抓核心能力|TVP专访
人工智能
岁月宁静14 小时前
图像生成接口的工程化设计与落地实践:封装豆包图像生成模型 Seedream 4.0 API
前端·人工智能·node.js
风雨同舟的代码笔记15 小时前
5.Python函数与模块化工程实战:构建高复用代码体系
python
万岳科技程序员小金15 小时前
多商户商城APP源码开发的未来方向:云原生、电商中台与智能客服
人工智能·云原生·开源·软件开发·app开发·多商户商城系统源码·多商户商城app开发
蓝色 - Lanse15 小时前
模型推理如何利用非前缀缓存
人工智能·缓存
CoookeCola15 小时前
MovieNet (paper) :推动电影理解研究的综合数据集与基准
数据库·论文阅读·人工智能·计算机视觉·视觉检测·database
我的xiaodoujiao15 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 22--数据驱动--参数化处理 Json 文件
python·学习·测试工具·pytest