执行双线性变换的代码不起作用

2024-05-17 17:01:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想尝试一下,将矩形转换成四边形的双线性变换 http://www.fmwconcepts.com/imagemagick/bilinearwarp/FourCornerImageWarp2.pdf 在第4页。你知道吗

我有广场

(500,900)(599,900)(599,999)(500,999)

四轮车呢

(454,945)(558,951)(598,999)(499,999)

其中,上述四坐标和方坐标的第i个条目是相应的角点。你知道吗

有了它,我就可以做以下矩阵了

[1 500 900 450000][a0] [454] [1 599 900 539100][a1]=[558] [1 599 999 598401][a2] [598] [1 500 999 499500][a3] [499]

[1 500 900 450000][b0] [945] [1 599 900 539100][b1]=[951] [1 599 999 598401][b2] [999] [1 500 999 499500][b3] [999]

如果我为他们解决我会得到

a0=-709.911845730028 a1=1.50964187327824 a2=0.709621467197225 a3=-0.000510152025303541 b0=148.305785123967 b1=0.611570247933884 b2=0.85154576063667 b3=-0.000612182430364249

但是当我运行这个python脚本(我想手动模拟,将四边形上的点(454945)转换为正方形上的点(500900))时,我得到了一个不同的答案。我得到(442.908226541024.0)。。。你知道吗

X = 454
Y = 945

a0=-709.911845730028
a1=1.50964187327824
a2=0.709621467197225
a3=-0.000510152025303541


b0=148.305785123967 
b1=0.611570247933884 
b2=0.85154576063667 
b3=-0.000612182430364249

A = b2*a3 - b3*a2
C_one = (b0*a1 - b1*a0)
C = C_one + (b1*X - a1*Y)
B_one = (b0*a3 - b3*a0) + (b2*a1 - b1*a2)
B = B_one + (b3*X - a3*Y)

V = (-B + (B*B - 4*A*C)**0.5 ) / (2*A)
U = (X - a0 - a2*V) / (a1 + a3*V)

print U,V

有人知道怎么了吗?你知道吗


Tags: comhttpa2a1wwwb0a0one
1条回答
网友
1楼 · 发布于 2024-05-17 17:01:37

如果我正确理解了你的线性代数表示法,那么我不同意你的ab

sage: A = Matrix([[1,500,900,450000],[1, 599, 900, 539100],
                  [1, 599, 999 ,5984],[1, 500, 999, 499500]])
sage: v = vector([945, 951, 999, 999])
sage: w = vector([454, 558, 598, 499])
sage: a = A.solve_right(w)
sage: b = A.solve_right(v)
sage: print(a); print(N(a))
(-3435371408/7209873, 15036641/14419746, 721395/1602194, 5/582616)
(-476.481542462676, 1.04278126674353, 0.450254463566834, 8.58198195724113e-6)
sage: print(b); print(N(b))
(1029623095/2403291, 123379/2403291, 432837/801097, 3/291308)
(428.422149044789, 0.0513375200922402, 0.540305356280201, 0.0000102983783486894)
sage: 
sage: A * a
(454, 558, 598, 499)
sage: A * b
(945, 951, 999, 999)

计算

from math import sqrt

X = 454
Y = 945

a = (-476.481542462676, 1.04278126674353,
     0.450254463566834, 8.58198195724113e-6)

b = (428.422149044789, 0.0513375200922402,
     0.540305356280201, 0.0000102983783486894)

A = b[2]*a[3] - b[3]*a[2]
C_one = (b[0]*a[1] - b[1]*a[0])
C = C_one + (b[1]*X - a[1]*Y)
B_one = (b[0]*a[3] - b[3]*a[0]) + (b[2]*a[1] - b[1]*a[2])
B = B_one + (b[3]*X - a[3]*Y)
V = (-B + sqrt((pow(B,2) - 4*A*C))) / (2*A)
U = (X - a[0] - a[2]*V) / (a[1] + a[3]*V)

print( U,V )

我明白了

892.3074973991894 -0.0

那不一样。。。不知道是否正确。你知道吗

相关问题 更多 >