问题描述
假设我有一个坐标形式的点列表,它们应该在现实中形成一个完美的网格,但有些扭曲(如下图所示)。您会注意到点之间的间距有所不同,但我正在寻找一种方法,通过查找多项式系数来校正这种失真,从而使该图像完全一致。
在我的尝试中,我尝试使用 skimage
's transform
method,如下面的代码行所示:
transform.PolynomialTransform.estimate(original_points,destination_points,3)
但是,这有一些问题。首先,我不知道 points 参数的确切格式。我在其他格式中使用过像 [[x1,y1],[x2,y2],...]
这样的列表,但它总是出现以下错误:
TypeError: list indices must be integers or slices,not tuple
第二个问题是,即使我设法正确格式化点,该函数似乎也不会返回任何多项式系数来实际应用此校正。
我在这里问的是:
- 如何正确使用
estimate
函数返回多项式校正系数(包括如何正确输入参数)? - 或者,是否有其他功能更容易用于此目的?
所以这个问题可以重现,尝试使用以下几点:
(0,0),(2,(1,1),(0,2),2)
并将这些点与这些新点进行拟合:
(0,(4,3),6),6)
请注意,我希望能够获得三阶多项式系数
解决方法
输入点应该是 NumPy 数组,而不是列表:
In [1]: src = np.array([(0,0),(2,(1,1),(0,2),2)])
In [2]: dst = np.array([(0,(4,3),6),6)])
In [3]: from skimage import transform
In [4]: p = transform.PolynomialTransform()
In [5]: p.estimate(src,dst,order=3)
Out[5]: True
In [6]: p.params
Out[6]:
array([[-0.,3.71780989,1.50088949,-1.85561862,-2.62105008,-0.35138037,0.49835684,1.68275802,-0.37223298,-0.19953219],[-0.,0.85714286,1.,0.42857143,0.57142857,0.71428571,-0.42857143,-0.14285714,0.14285714]])