pin_drop当前位置:知识文库 ❯ 图文

Pillow Image翻转教程 - transpose与ImageOps镜像方法详解

一、Image翻转概述

图像翻转是沿水平或垂直轴对图像进行镜像操作,与旋转不同,翻转是产生镜像效果而非绕中心转动。Pillow提供了两种实现翻转的方式:transpose()方法中的FLIP_LEFT_RIGHT和FLIP_TOP_BOTTOM常量,以及ImageOps模块中的mirror()flip()便捷方法。

翻转操作是像素重排,不会进行插值计算,因此完全无损,且执行速度极快。

二、transpose()方法语法与参数

基本语法

代码示例

from PIL import Image

# 使用transpose翻转
flipped_h = img.transpose(Image.FLIP_LEFT_RIGHT)
flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM)

翻转常量

常量 说明
Image.FLIP_LEFT_RIGHT 0 水平翻转(左右镜像)
Image.FLIP_TOP_BOTTOM 1 垂直翻转(上下镜像)

三、ImageOps便捷方法

ImageOps模块提供了更直观的翻转方法:

方法 参数 说明
ImageOps.mirror(image) image: Image对象 水平翻转,等同于FLIP_LEFT_RIGHT
ImageOps.flip(image) image: Image对象 垂直翻转,等同于FLIP_TOP_BOTTOM

代码示例

from PIL import ImageOps

mirrored = ImageOps.mirror(img)  # 水平翻转
flipped = ImageOps.flip(img)     # 垂直翻转

提示:ImageOps.mirror()和ImageOps.flip()底层实际就是调用transpose(),它们只是提供了更语义化的接口,功能完全等价。

四、代码示例演示

示例1:水平翻转和垂直翻转

演示基本的水平翻转和垂直翻转操作,以及组合翻转效果:

代码示例

from PIL import Image

img = Image.new('RGB', (200, 100), color='purple')

# 水平翻转(左右镜像)
h_flipped = img.transpose(Image.FLIP_LEFT_RIGHT)
print(f"水平翻转: {h_flipped.size}")

# 垂直翻转(上下镜像)
v_flipped = img.transpose(Image.FLIP_TOP_BOTTOM)
print(f"垂直翻转: {v_flipped.size}")

# 同时水平和垂直翻转(等同于旋转180度)
hv_flipped = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.FLIP_TOP_BOTTOM)
rot180 = img.transpose(Image.ROTATE_180)
print(f"双重翻转: {hv_flipped.size}")
print(f"旋转180度: {rot180.size}")

输出:

代码示例

水平翻转: (200, 100)
垂直翻转: (200, 100)
双重翻转: (200, 100)
旋转180度: (200, 100)

示例2:使用ImageOps进行翻转

创建带有方向标记的图像,验证翻转效果:

代码示例

from PIL import Image, ImageDraw, ImageOps

# 创建带有方向标记的图像
img = Image.new('RGB', (200, 100), color='white')
draw = ImageDraw.Draw(img)
draw.text((10, 10), "LEFT", fill='black')
draw.text((150, 70), "RIGHT", fill='black')

# 水平镜像
mirrored = ImageOps.mirror(img)
print(f"镜像后尺寸: {mirrored.size}")

# 垂直翻转
flipped = ImageOps.flip(img)
print(f"翻转后尺寸: {flipped.size}")

输出:

代码示例

镜像后尺寸: (200, 100)
翻转后尺寸: (200, 100)

示例3:翻转创建对称图像

利用翻转操作创建左右对称的图像:

代码示例

from PIL import Image

# 创建左半部分图像
img = Image.new('RGB', (100, 100), color='navy')

# 水平翻转左半部分
right_half = img.transpose(Image.FLIP_LEFT_RIGHT)

# 拼接为对称图像
full = Image.new('RGB', (200, 100))
full.paste(img, (0, 0))
full.paste(right_half, (100, 0))
print(f"对称图像尺寸: {full.size}")

输出:

代码示例

对称图像尺寸: (200, 100)

五、实际应用场景

  • 深度学习数据增强:在训练图像分类或目标检测模型时,通过随机水平翻转扩充训练数据集,提升模型鲁棒性。

  • 对称图案设计:创建Logo或装饰图案时,利用翻转生成镜像对称效果,常用于万花筒效果。

  • 扫描文档修正:某些扫描仪可能产生镜像图像,通过翻转可快速修正方向。

六、注意事项

  • 翻转与旋转的区别:翻转是镜像操作,旋转是绕中心转动,两者效果完全不同。

  • 尺寸不变:翻转操作不改变图像尺寸,只改变像素排列顺序。

  • 文字镜像:对包含文字的图像翻转后文字会变为镜像,通常不可读,需注意使用场景。

小贴士

同时执行水平翻转和垂直翻转等同于旋转180度,但性能更好,因为翻转是纯像素重排操作,无需插值计算。在数据增强中,常将随机翻转(RandomHorizontalFlip和RandomVerticalFlip)组合使用。

七、翻转方式对比

方法 代码 方向 特点
transpose(FLIP_LEFT_RIGHT) img.transpose(Image.FLIP_LEFT_RIGHT) 水平 标准方法
transpose(FLIP_TOP_BOTTOM) img.transpose(Image.FLIP_TOP_BOTTOM) 垂直 标准方法
ImageOps.mirror() ImageOps.mirror(img) 水平 便捷方法
ImageOps.flip() ImageOps.flip(img) 垂直 便捷方法

八、小结与练习

通过本文的学习,我们掌握了Pillow中Image翻转的核心方法:

  • 水平翻转(FLIP_LEFT_RIGHT/mirror)实现左右镜像,垂直翻转(FLIP_TOP_BOTTOM/flip)实现上下镜像。

  • 翻转是无损操作,仅重排像素不进行插值。

  • 在数据增强、对称图案创建等场景中经常使用。


练习题

练习1:编写程序,打开一张图片,创建一个2x2的拼图,分别放置原图、水平翻转、垂直翻转和双重翻转的结果。

练习2:编写程序,创建一个左右对称的渐变图像(左半部分为从黑到白的渐变,右半部分为镜像)。


常见问题

翻转和旋转有什么区别?

翻转是镜像操作,产生左右或上下的镜像效果;旋转是绕图像中心转动。例如,翻转后的文字会变成镜像不可读,而旋转后的文字方向改变但仍可读。

ImageOps.mirror()和transpose(FLIP_LEFT_RIGHT)哪个更好?

两者功能完全等价,底层实现相同。ImageOps.mirror()语义更清晰、代码更易读;transpose()更灵活,可以与其他常量配合使用。根据个人习惯选择即可。

翻转会改变图像尺寸吗?

不会。翻转只是重排像素的位置顺序,不会改变图像的宽度和高度。与rotate(expand=True)不同,翻转后的图像尺寸始终与原始图像相同。

如何实现对角线翻转?

可以使用img.transpose(Image.TRANSPOSE)实现主对角线翻转,或使用img.transpose(Image.TRANSVERSE)实现副对角线翻转。

标签: Pillow 图像翻转 镜像 ImageOps 数据增强 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Pillow Image旋转教程 - rotate()与transpose()方法详解 下一篇: Pillow Image滤镜教程 - ImageFilter内置滤镜与自定义卷积核详解

poll相关推荐