Python 使用 Pillow 处理图像:几何变换
pillow库操作切片、旋转、滤镜、输出文字、调色板等功能一应俱全。
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可以查看官方文档和源码。
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_5_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_11_0.png
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()