我有二维图像数据,我想在3D中表示为一个平面,并执行各种操作(平移,旋转,放大)。在执行此类操作后,我希望获得像素的笛卡尔分量和颜色值。
那么,什么是有效的方式:
我确定有些图书馆可以完成大部分繁重的工作(np.linalg?),但我不知道哪些是我应该开始的地方。感谢。
答案 0 :(得分:1)
您可以使用scipy
进行此类操作。特别是,scipy.ndimage
模块可以执行translations,rotations和magnification以及其他转换和映射。这些操作在必要时使用插值以适应矩形阵列的网格。
如果您想直接在没有插值的像素坐标上工作,图像库可能无法正常工作。您可以使用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,并带有额外的颜色轴。使用indices
或meshgrid
时,如果您使用einsum
或tensordot
,请将其包括在内。