我有2D图像数据,我想将其表示为3D平面,并执行各种操作(平移、旋转、放大)。我想通过这些操作得到像素的笛卡尔分量和颜色值。
那么,怎样才能有效地:
- 将图像的行/col值表示为笛卡尔值
- 将上述笛卡尔值转换为
我确信有一些库可以完成大部分繁重的工作(np. linear ?),但我只是不知道应该从哪个库开始。谢谢。
您可以使用scipy
来完成这些事情。特别是,scipy.ndimage
模块可以进行平移、旋转和放大,以及其他转换和映射。这些操作在必要时使用插值来适应矩形数组的网格。
如果你想直接处理像素的坐标而不进行插值,图像库可能无法工作。你可以用np.indices
抓取数组的坐标,并通过你想要的任何变换来运行它们,并且原始将与原始像素值相关联。不幸的是,这些转换似乎并没有在一个通用的库中实现,所以你必须搜索函数,例如,Python - 3D向量的旋转。
从链接答案旋转的例子:
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
你可以通过xp, yp, zp
看到所有与a
形状相同的坐标。
如果您的图像是彩色的,请注意您的2D图像已经是3D的,并且带有额外的颜色轴。当使用indices
或meshgrid
时,如果使用einsum
或tensordot
,请包含此