>>> from env_helper import info; info()
页面更新时间: 2024-04-06 23:01:55
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.3. 使用 Pillow 处理图像:几何变换

Pillow 库操作切片、旋转、滤镜、输出文字、调色板等功能一应俱全。

3.3.1. 几何变换

Image 包含调整图像大小 resize() 和旋转 rotate() 的方法。前者采用元组给出新的大小,后者采用逆时针方向的角度。

调整大小并逆时针旋转 45度

>>> from PIL import  Image
>>> from matplotlib import pyplot as plt
>>> im=Image.open('./L1020120.JPG')
>>> o = im.resize((128, 128))
>>> outfile= o.rotate(45)
>>> plt.imshow(outfile)
>>> plt.show()
_images/sec03_pillow-geom_3_0.png

要以90度为单位旋转图像,可以使用 rotate()transpose() 方法。后者也可用于围绕其水平轴或垂直轴翻转图像。

  • FLIP_LEFT_RIGHT 水平左右翻转

  • Image.FLIP_TOP_BOTTOM 垂直上下翻转

  • Image.ROTATE_90 逆时针90度

  • Image.ROTATE_180 逆时针180度

  • Image.ROTATE_270 逆时针270度

更多的api可以查看官方文档和源码。

3.3.2. 剪贴,粘贴、合并图像

Image类包含允许您操作图像中的区域的方法。如:要从图像中复制子矩形图像使用 crop() 方法。

从图像复制子矩形

1.截取矩形图像

>>> im=Image.open('L1020120.JPG')
>>> box = (100, 100, 400, 500)
>>> region = im.crop(box)
>>> plt.imshow(region)
>>> plt.show()
_images/sec03_pillow-geom_6_0.png

定义box元组,图像基于左上角为(0,0)的坐标,box 坐标为 (左,上,右,下)。注意,坐标是基于像素。示例中为 300 * 400 像素。

2.先将复制的内容颠倒180度,在原图上粘贴子矩形图像

粘贴时要注意几点。选择好想要粘贴的位置,paste() 方法的两个参数依次是处理后的图片;以及图片的位置,同样为(左,上,右,下),不过,他们的值的间距为图片的像素(也就是确定好左上角的点后,分别加上像素值),不可调整。

将我们复制的图片旋转180度

>>> region = region.transpose(Image.ROTATE_180)

定义要粘贴的位置。

>>> box = (100, 100, 400, 500)

将子图(region) 粘贴(paste)回原图时,粘贴位置 box 的像素与宽高必须吻合。而原图和子图的 mode 不需要匹配,Pillow会自动处理。

>>> im.paste(region, box)
>>> plt.imshow(im)
>>> plt.show()
_images/sec03_pillow-geom_12_0.png
>>> region = region.transpose(Image.ROTATE_180)
>>> box = (200, 200, 500, 600)
>>> im.paste(region, box)
>>> plt.imshow(im)
>>> plt.show()
_images/sec03_pillow-geom_13_0.png

3.移动图像

移动图像就是将图片复制再粘贴。看起就像移动。

>>> image_path = 'L1020120.JPG'
>>> im = Image.open(image_path)

设置想要偏转的像素值。

>>> delta=200
>>> xsize, ysize = im.size
>>> print(im.size)
(1000, 734)

移动图片通常都是在X轴的方向上进行处理,我们设置的偏移值为200个像素,比X轴的值小所以可以直接处理,但是如果是移动2000个像素呢,可能就会出现错误,所以我们对他进行求余处理,也就是将图片移动了多个周期,依旧是2000时,我们需要移动的就是144个像素。

>>> delta = delta % xsize
>>> if delta == 0:
>>>     plt.imshow(im)
>>>     plt.show()

将确定好的位置复制下来,在重新组成一幅图片,视觉上看就像是图片在移动。

>>> part1 = im.crop((0, 0, delta, ysize))
>>> part2 = im.crop((delta, 0, xsize, ysize))
>>> im.paste(part1, (xsize - delta, 0, xsize, ysize))
>>> im.paste(part2, (0, 0, xsize - delta, ysize))
>>> plt.imshow(im)
>>> plt.show()
_images/sec03_pillow-geom_21_0.png