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

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

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

>>> region = region.transpose(Image.ROTATE_180)
>>> box = (200, 200, 500, 600)
>>> im.paste(region, box)
>>> plt.imshow(im)
>>> plt.show()

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