对于一个透视变换矩阵,可以将其写作一个向量的形式,那么对于一个坐标(i,j),可以通过以下方式进行透视变换:
def axisTransform(i: int, j: int, perMat: np.array) -> Tuple[float]:
"""使用变换矩阵映射坐标
Args:
i (int): 行号
j (int): 列号
perMat (np.array): 变换矩阵
Returns:
Tuple[float]: 以浮点数形式返回变换后的 (i, j)
"""
a = i * perMat[0] + j * perMat[1] + perMat[2]
b = i * perMat[3] + j * perMat[4] + perMat[5]
c = i * perMat[6] + j * perMat[7] + perMat[8]
return a / c, b / c
以上方式即使使用numba进行加速后,在进行多点运算时仍然需要消耗很多时间,可以直接将上述过程写作矩阵操作的形式,如下:
def axisTransform(i: int, j: int, perMat: np.array) -> Tuple[float]:
"""使用变换矩阵映射坐标
Args:
i (int): 行号
j (int): 列号
perMat (np.array): 变换矩阵
Returns:
Tuple[float]: 以浮点数形式返回变换后的 (i, j)
"""
x = np.array([i,j,1])
y = np.array(perMat).reshape(3, 3)
t = np.dot(x,y.T)
return t[0] / t[2], t[1] / t[2]
Comments NOTHING