PIL透视变换,计算出(a,b,c,d,e,f,g,h)

时间:2013-10-08 22:05:37

标签: python python-imaging-library

我正在尝试使用PIL对图像进行透视变换,我有图像角点的坐标以及图像角落最终的坐标。我不知道如何获得'数据'参数的(a,b,c,d,e,f,g,h)。

我知道这与此有关: http://bishopw.loni.ucla.edu/AIR5/2Dperspective.html 但我不确定这个页面是什么意思。

1 个答案:

答案 0 :(得分:3)

您可以通过求解方程得到参数:T.x1 + v = x2其中x1是坐标系1(原始图片)中的点坐标,x2是新坐标系(倾斜或旋转或3d)。 x1,x2,v是2乘1矢量,T是2乘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)。这样你就有很多零和零。数学方法称为高斯消除(使用谷歌或维基百科 - >高斯消除 - >算法的例子)。

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

  

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

编辑: Ups,上面是AFFINE转换。您在询问PERSPECTIVE转型。功能相同但参数不同。数据应该是:

  

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

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

Q = a b c
    d e f
    g h 1

与AFFINE相比,您将常数v嵌入矩阵中。现在你的方程变为:

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

通过高斯消除解决作为AFFINE转换。