我正在尝试使用PIL对图像进行透视变换,我有图像角点的坐标以及图像角落最终的坐标。我不知道如何获得'数据'参数的(a,b,c,d,e,f,g,h)。
我知道这与此有关: http://bishopw.loni.ucla.edu/AIR5/2Dperspective.html 但我不确定这个页面是什么意思。
答案 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转换。