Python Pillow 简明教程

Python Pillow - Applying Perspective Transforms

在 Pillow 中应用透视变换涉及改变图像的透视或视点。此变换修改图像中点的坐标位置,模仿透视变化,如旋转、倾斜或扭曲图像。

Perspective Transformation in Pillow

Pillow 的 transform() 方法允许您对图像应用不同类型的变换。对于透视变换,使用 3x3 变换矩阵定义该变换。此矩阵可以表示旋转、平移、缩放和剪切等操作。对于透视变换,矩阵元素控制每个像素坐标如何发生改变。

Matrix Elements for Perspective Transform

矩阵元素(a、b、c、d、e、f、g、h)定义变换−

  1. a 和 d 表示 x 和 y 方向的缩放。

  2. b 和 c 表示剪切或倾斜。

  3. e 和 f 是沿着 x 和 y 轴的平移。

  4. g 和 h 是透视系数。

Applying Perspective Transforms

我们可以直接与 Image.PERSPECTIVE 配合使用 transform() 并传递四个源点和四个目标点来指定变换。

透视变换可以明显扭曲图像。因此,请仔细选择变换矩阵或点,以在不过度扭曲的情况下实现所需的视觉效果。

在 Pillow 中应用透视变换涉及使用变换矩阵或定义源点和目标点来改变图像的透视,模拟角度、方向或视点的变化。理解变换矩阵和点映射对于实现所需的视觉效果至关重要,同时避免图像中出现过度的扭曲或不需要的变换。

以下是 transform() 方法的语法和参数。

transformed_image = image.transform(size, method, data, resample=0, fill=0)

其中,

  1. image − 我们要变换的 Pillow Image 对象。

  2. size − 表示已变换图像的输出大小(宽度、高度)的元组。

  3. method − 定义要应用的变换类型,Image.AFFINE、Image.PERSPECTIVE 或 Image.QUAD 等。

  4. data − 根据所使用的方法所需的变换数据。

  5. resample (optional) − 要使用的重新采样方法,如 Image.BILINEAR、Image.NEAREST 和 Image.BICUBIC。默认值为 0,即最近邻点。

  6. fill (optional) − 填充变形图像边界外区域的颜色。默认值是 0,即黑色。

根据变换方法准备数据,对于 Image.AFFINE 变换,它需要一个表示仿射变换矩阵的 6 元素元组。对于透视变换,使用 Image.PERSPECTIVE ,它需要一个 8 元素元组来表示透视变换矩阵。此外, Image.QUAD 涉及提供源和目标四边形点以进行准确的透视映射。

Example

在这个示例中,我们正在使用 transform() 方法对给定的输入图像执行透视变换。

from PIL import Image
import numpy

def find_data(source, target):
    matrix = []
    for s, t in zip(source, target):
        matrix.append([t[0], t[1], 1, 0, 0, 0, -s[0]*t[0], -s[0]*t[1]])
        matrix.append([0, 0, 0, t[0], t[1], 1, -s[1]*t[0], -s[1]*t[1]])
    A = numpy.matrix(matrix, dtype=float)
    B = numpy.array(source).reshape(8)
    res = numpy.dot(numpy.linalg.inv(A.T * A) * A.T, B)
    return numpy.array(res).reshape(8)

#Open an image
image = Image.open("Images/logo_w.png")
# image.show()

#Define the transformation matrix for perspective transform
coeffs = find_data(
    [(0, 0), (225, 0), (225, 225), (0, 225)],
    [(15, 115), (140, 20), (140, 340), (15, 250)])

#Applying the perspective transformation
transformed_image = image.transform((300, 400), Image.PERSPECTIVE, coeffs, Image.BICUBIC)

#Save or display the transformed image
transformed_image.save("output Image/transform.png")
transformed_image.show()

以下是输入图像 −

logo w

在执行以上代码后,将显示以下变形图像 −

transform

Example

这是对另一个图像执行透视变换的另一个示例,其中矩阵元素为 (a, b, c, d, e, f, g, h)。

from PIL import Image

#Open an image
image = Image.open("Images/flowers.jpg")
image.show()

#Define the transformation matrix for perspective transform
matrix = (10, 4, 11, -1, 5, 2, 1, -1)

#Apply the perspective transformation
transformed_image = image.transform(image.size, Image.PERSPECTIVE, matrix)

#Save or display the transformed image
transformed_image.save("output Image/transform_image.jpg")
transformed_image.show()

执行上述代码时,您将获得以下输出 -

输入图像:

flowers

透视变换后输出的图像:

transform image

Note

  1. transform() 方法支持各种变换类型,所需要的变换数据因所选方法而异。

  2. 提供正确的变换数据(即矩阵或基于所选变换方法的点)对于实现所需的效果至关重要。

  3. Pillow 中的 transform() 方法用途广泛,它允许我们对图像执行不同类型的几何变换,从而提供了图像处理和透视调整的灵活性。