2

我正在尝试使用 PIL 对图像进行透视变换,我有图像角的坐标和图像角应该结束的坐标。我不确定如何为“数据”参数获取 (a, b, c, d, e, f, g, h)。

我知道这与此有关: http: //bishopw.loni.ucla.edu/AIR5/2Dperspective.html 但我不确定此页面的含义。

4

1 回答 1

4

您可以通过解方程得到参数: T.x1 + v= x2 其中 x1 是坐标系 1(原始图片)中的点坐标,x2 是新坐标系(倾斜或旋转或 3d)。x1, x2, v 是 2 x 1 向量,T 是 2 x 2 矩阵。例如 x1 = (x1x, x1y), x2 = (x2x,x2y) , v = (c,f) 和

T = a b
    d e

如果你不知道矩阵代数,你可以通过消除变量来解决这个问题。对于每个点,您都会得到两个方程式,例如:

a*x1x + b*x1y + c = x2x
d*x1x + e*x1y + f = x2y

如果您现在插入其中一个角点。假设 x1 = (0,1) 和 x2 = (0,4) 你得到:

a*0   + b*1   + c = 0
d*0   + e*1   + f = 4

从中你得到:

b = -c
e = 4-f

现在,如果您对其他角点重复此操作(并使用 b = -c 的知识)。您可以求解所有变量的数值。

提示,在计算变换之前,将原始图片坐标缩放到单位平方 (0,0)、(0,1)、(1,0) 和 (1,1)。这样你就有很多 1 和 0。数学方法称为高斯消除(使用谷歌或维基百科->高斯消除->算法示例)。

请注意,im.tranform 中的数据有六个参数(2d -> 2d 变换):

数据是一个 6 元组 (a, b, c, d, e, f),其中包含仿射变换矩阵的前两行。对于输出图像中的每个像素 (x, y),新值取自输入图像中的位置 (ax + by + c, dx + e y + f),四舍五入到最近的像素。

编辑: Ups,以上是用于仿射变换。你问的是透视变换。功能相同,但参数不同。数据应该是这样的:

数据是一个 8 元组 (a, b, c, d, e, f, g, h),其中包含透视变换的系数。对于输出图像中的每个像素 (x, y),新值取自一个位置 (ax + by + c)/(gx + hy + 1), (dx + ey + f)/(gx + hy + 1) 在输入图像中,四舍五入到最近的像素。

所以你的方程是 Q.x3 = x4,其中原始坐标 x3 是 (x3x, x3y,1),转换后的坐标 x4 是 (x4x, x4y, 1),对于 Q:

Q = a b c
    d e f
    g h 1

与仿射相比,您将常数 v 嵌入到矩阵中。现在你的方程变成:

a*x3x + b*x3y + c*1 = x4x    
d*x3x + e*x3y + f*1 = x4y   
g*x3x + h*x3y + 1*1 = 1

通过作为仿射变换的高斯消元求解。

于 2013-10-11T09:19:02.160 回答