以3D形式转换图像数据

时间:2015-09-12 23:03:28

标签: python numpy 3d linear-algebra

我有二维图像数据,我想在3D中表示为一个平面,并执行各种操作(平移,旋转,放大)。在执行此类操作后,我希望获得像素的笛卡尔分量颜色值。

那么,什么是有效的方式:

  • 将图像的行/列值表示为笛卡尔值
  • 如上所述转换那些笛卡尔值

我确定有些图书馆可以完成大部分繁重的工作(np.linalg?),但我不知道哪些是我应该开始的地方。感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用scipy进行此类操作。特别是,scipy.ndimage模块可以执行translationsrotationsmagnification以及其他转换和映射。这些操作在必要时使用插值以适应矩形阵列的网格。

如果您想直接在没有插值的像素坐标上工作,图像库可能无法正常工作。您可以使用np.indices获取数组的坐标,并通过您喜欢的任何变换运行它们,并且原始数据将与原始像素值相关联。遗憾的是,这些转换似乎并未在公共库中实现,因此您必须搜索函数,例如Python - Rotation of 3D vector

来自链接答案的旋转示例:

a = np.arange(12).reshape(3, 4, 1) # a 2D image in 3D (hence the extra dim of 1)
i, j, k = np.indices(a.shape)
x, y, z = np.meshgrid(np.linspace(0, 1, 4), np.linspace(0, 1, 3), [.5], indexing='xy')

axis = [0, 0, 1]
theta = 90
#M = rotation_matrix(axis, theta)
# for example, rotate around z-axis:
M = np.array([[ 0., -1.,  0.],
              [ 1.,  0.,  0.],
              [ 0.,  0.,  1.]])
# the following two lines are equivalent ways of multiplying M by each point as a vector:
# we want to sum over last axis of M, first of [x, y z]
xp, yp, zp = np.einsum('ij,jklm->iklm' M, [x, y, z])
xp, yp, zp = np.tensordot(M, [x, y, z], axes=(-1,0))

所以现在,原来在i, j, k = 2, 2, 0的观点来自:

x[2, 2, 0], y[2, 2, 0], z[2, 2, 0]
# (0.666666, 1.0, 0)

xp[2, 2, 0], yp[2, 2, 0], zp[2, 2, 0]
#(-1.0, 0.666666, 0.0)

仍有颜色:

a[2, 2, 0]
# 10

只需查看a,即可看到与xp, yp, zp具有相同形状的所有坐标。

如果您的图像是彩色的,请注意您的2D图像已经是3D,并带有额外的颜色轴。使用indicesmeshgrid时,如果您使用einsumtensordot,请将其包括在内。