我正在尝试使用affine tranform给出的解决方案给定二维点的二维Kloss, and Kloss in “N-Dimensional Linear Vector Field Regression with NumPy.” (2010, The Python Papers Source Codes 2).

Article source code

他们提供了一种方法来查找连接两组点 y x 的仿射变换,其中该变换由矩阵 A 和 vector b 表示(即矩阵方程 y = Ax + b ojit )。

在二维中,您有6个未知数,其中四个定义2x2 A 矩阵,另外2个定义 b

但是,在示例脚本及其描述的论文中,它们具有未知数t = n ^ 2 + n,其中n是点的数量,这意味着您需要六个点,对于2D情况,它实际上是12个已知值(即x和图像上每个点的y值)。

他们通过以下方式对此进行了测试:

def solve(point_list):
    """
    This function solves the linear equation system involved in the n
    dimensional linear extrapolation of a vector field to an arbitrary point.

    f(x) = x * A + b

    with:
       A - The "slope" of the affine function in an n x n matrix.
       b - The "offset" value for the n dimensional zero vector.

    The function takes a list of n+1 point-value tuples (x, f(x)) and returns
    the matrix A and the vector b. In case anything goes wrong, the function
    returns the tuple (None, None).

    These can then be used to compute directly any value in the linear
    vector field.
    """dimensions = len(point_list[0][0])
    unknowns = dimensions ** 2 + dimensions
    number_points = len(point_list[0])
    # Bail out if we do not have enough data.
    if number_points < unknowns:
        print ’For a %d dimensional problem I need at least %d data points.’ \ % (dimensions, unknowns)
        print ’Only %d data points were given.’ % number_points return None, None.

...

问题:

他们为什么说您需要6点才能获得2D仿射变换?

opencv getAffineTransform只需3个数据点即可找到2D点,这是直观的数字,因为3点定义了一个平面。当我从Kloss和Kloss代码中取出上述条件测试时,它在2D模式下可以得到3分。

最佳答案

讲到重点,

他们为什么说您需要6点才能获得2D仿射变换?

我想您指的是eq之前的那个位。 (4),他们说您至少需要m>=n^2+n。在那里,m是点对的数量,n是维数。

我认为他们没有引起太多关注,他们的意思是m>=n+1

这意味着在2D中,您将需要在中的n+1=3对点,而在3D中,我们将需要n+1=4对点以完全定义仿射变换。请注意,只要点不是共线的,就可以找到解决方案。

这与您发布的opencv链接一致,具有3x2=6输入数字(3个源点,每个源点具有两个坐标)和类似的6输出数字:
(x1,y1,x2,y2,x3,y3)转换为X[x1,y1],Y[x1,y1],X[x2,y2],Y[x2,y2],X[x3,y3],Y[x3,y3]
(但是请注意,opencv会评估确切的仿射变换,而本文不会)

话虽如此,您通常对此并不在意。

您可能需要使用比m少的点的仿射变换,并且您对许多解决方案之一感兴趣。

您经常需要对转换进行估算,并尽量减少误差,例如,从最小二乘意义上讲,这就是本文的目的:快速并使用numpy进行转换。

关于image-processing - 仿射变换检索中的最小点数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20010788/

10-12 23:11