自学内容网 自学内容网

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

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

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

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

from PIL import Image

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

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

参数说明

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

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

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

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 等比例缩放
# 等比例缩放至一半尺寸
scaled_image = image.resize((image.width // 2, image.height // 2))
scaled_image.show()
1.2.2 非等比例缩放

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

# 非等比例缩放
stretched_image = image.resize((300, 600))
stretched_image.show()

案例:生成缩略图

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

thumbnail_image = image.copy()
thumbnail_image.thumbnail((100, 100))
thumbnail_image.show()

1.3 图像平移

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

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() 方法指定一个矩形区域,从而裁剪出该部分。

# 裁剪图像的中心部分
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()

案例:制作九宫格图像

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

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)

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

案例:生成透视效果

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

# 创建透视效果
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 水平翻转
# 水平翻转
flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)
flipped_image.show()
1.6.2 垂直翻转
# 垂直翻转
flipped_image = image.transpose(Image.FLIP_TOP_BOTTOM)
flipped_image.show()

1.7 图像变换综合案例

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

案例:创建万花筒效果

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

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()

原文地址:https://blog.csdn.net/imdeity/article/details/143647402

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!