使用ndimage.interpolation.affine_transform进行矩阵转换

时间:2018-10-03 16:40:51

标签: python numpy scipy

我正在尝试使用ndi.interpolation.affine_transform转换一个简单的矩阵,但是得到的结果却相反。例如:

import scipy.ndimage as ndi
m = [[1, 1, 11], [2, 2, 22], [3, 3, 33]]
final_affine_matrix = [[1, 0], [0, 1]]
final_offset = [0, 1]
x = ndi.interpolation.affine_transform(
        m,
        final_affine_matrix,
        final_offset,
        order=1,
        mode='nearest',
        cval=0)
print(x)

[[ 1 11 11]
 [ 2 22 22]
 [ 3 33 33]]

鉴于偏移量为[0, 1],y轴是否应该移动而不是x轴移动?也就是说,输出不应为:

[[ 2  2 22]
 [ 3  3 33]
 [ 3  3 33]]

我可以实现该结果,但只能使用偏移量[1, 0]。他们不应该相反吗?

1 个答案:

答案 0 :(得分:0)

documentation中所述,scipy.ndimage.affine_transform()通过执行以下操作来计算新位置:np.dot(matrix, o) + offset(其中o是输出位置)。

这意味着以下测试应该成功:

m = np.array(m)
assert(m[0, 1] == x[0, 0])
assert(m[0, 2] == x[0, 1])
assert(m[1, 1] == x[1, 0])
assert(m[1, 2] == x[1, 1])
assert(m[2, 1] == x[2, 0])
assert(m[2, 2] == x[2, 1])

或更简洁地说:

assert(np.all(m[:, 1] == x[:, 0]))
assert(np.all(m[:, 2] == x[:, 1]))

,并且按预期进行。因此,确实矩阵正在按1索引移动。也许您希望将另一个矩阵作为输出,因为您对打印输出感到困惑。第零个索引表示行,第一个索引表示列。因此,按第一个索引移动将使列移动。