使用src /目标坐标的Python PIL进行透视变换

时间:2018-10-28 13:55:38

标签: python image-processing python-imaging-library coordinate-transformation

我偶然发现this question,并尝试使用Python Pillow执行透视转换。

这是我要尝试做的,结果是什么样的:

enter image description here

这是我用来尝试的代码:

from PIL import Image
import numpy

# function copy-pasted from https://stackoverflow.com/a/14178717/744230
def find_coeffs(pa, pb):
    matrix = []
    for p1, p2 in zip(pa, pb):
        matrix.append([p1[0], p1[1], 1, 0, 0, 0, -p2[0]*p1[0], -p2[0]*p1[1]])
        matrix.append([0, 0, 0, p1[0], p1[1], 1, -p2[1]*p1[0], -p2[1]*p1[1]])

    A = numpy.matrix(matrix, dtype=numpy.float)
    B = numpy.array(pb).reshape(8)

    res = numpy.dot(numpy.linalg.inv(A.T * A) * A.T, B)
    return numpy.array(res).reshape(8)

# test.png is a 256x256 white square
img = Image.open("./images/test.png")

coeffs = find_coeffs(
    [(0, 0), (256, 0), (256, 256), (0, 256)],
    [(15, 115), (140, 20), (140, 340), (15, 250)])

img.transform((300, 400), Image.PERSPECTIVE, coeffs,
              Image.BICUBIC).show()

我不确定转换是如何进行的,但似乎这些点向相反的方向移动(例如,我需要做(-15,115)才能使A点向右移动。但是,它也赢了不能移动15像素,但可以移动5)。

如何确定目标点的确切坐标以正确倾斜图像?

1 个答案:

答案 0 :(得分:9)

答案很简单:只需交换源坐标和目标坐标。但这不是您的错:链接答案的作者特别容易感到困惑,因为SQL> set serveroutput on SQL> declare 2 res1 date; 3 begin 4 res1 := account_api.get_date(1); 5 end; 6 / PL/SQL procedure successfully completed. (在这种情况下)是函数参数的混乱顺序,因为函数参数没有有用的名称,并且因为该示例对剪切进行了向后转换。

除了交换源坐标和目标坐标外,还可以交换target, source函数的参数。更好的是,也重命名它们,例如

find_coeffs

让其余代码相同,只是使用不同的图像,我得到了这种转换:

Walter with red cornersWalter with red corners in perspective