2015-09-12 63 views
1

我擁有2D圖像數據,我想在3D中表示爲一個平面,並執行各種操作(平移,旋轉,放大)。我希望獲得笛卡爾組件顏色像素的值,在這樣的操作之後。以3D格式轉換圖像數據

那麼,什麼是一個有效的辦法:

  • 表示圖像的行/列值作爲笛卡爾值
  • 上述

描述改變這些笛卡爾值我敢肯定有些庫會完成大部分繁重的工作(np.linalg?),但我不知道哪些是我應該開始的地方。謝謝。

回答

1

你可以使用scipy這樣的東西。特別地,scipy.ndimage模塊可以執行translations,rotationsmagnification以及其他轉換和映射。這些操作在必要時使用插值來適應矩形陣列的網格。

如果您想直接在沒有內插的像素座標上工作,圖像庫可能無法正常工作。您可以使用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圖像,並且有額外的顏色軸。如果使用indicesmeshgrid,並且使用einsumtensordot,請包括此內容。