我擁有2D圖像數據,我想在3D中表示爲一個平面,並執行各種操作(平移,旋轉,放大)。我希望獲得笛卡爾組件和顏色像素的值,在這樣的操作之後。以3D格式轉換圖像數據
那麼,什麼是一個有效的辦法:
- 表示圖像的行/列值作爲笛卡爾值
- 上述
描述改變這些笛卡爾值我敢肯定有些庫會完成大部分繁重的工作(np.linalg?),但我不知道哪些是我應該開始的地方。謝謝。
我擁有2D圖像數據,我想在3D中表示爲一個平面,並執行各種操作(平移,旋轉,放大)。我希望獲得笛卡爾組件和顏色像素的值,在這樣的操作之後。以3D格式轉換圖像數據
那麼,什麼是一個有效的辦法:
描述改變這些笛卡爾值我敢肯定有些庫會完成大部分繁重的工作(np.linalg?),但我不知道哪些是我應該開始的地方。謝謝。
你可以使用scipy
這樣的東西。特別地,scipy.ndimage
模塊可以執行translations,rotations和magnification以及其他轉換和映射。這些操作在必要時使用插值來適應矩形陣列的網格。
如果您想直接在沒有內插的像素座標上工作,圖像庫可能無法正常工作。您可以使用np.indices
獲取數組的座標,然後通過您想要的任何轉換運行它們,並且原始圖像將與原始像素值相關聯。不幸的是,這些轉換似乎並未在通用庫中實現,因此您必須搜索函數,例如Python - Rotation of 3D vector。
與鏈接的答案旋轉的一個例子:
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 = 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
點,從去
仍然有顏色:
a[2, 2, 0]
# 10
只需查看xp, yp, zp
即可看到與a
具有相同形狀的所有座標。
如果您的圖像是彩色的,請注意您的2D圖像已經是3D圖像,並且有額外的顏色軸。如果使用indices
或meshgrid
,並且使用einsum
或tensordot
,請包括此內容。