[英]Applying function to all pixels of an image (width, height, 3) with np.vectorize
我想將 function 應用於形狀(width, height, 3)
圖像的每個像素,並接收一個新的形狀矩陣(width, height, 2)
(XYZ -> u'v')。 如何使用np.vectorize()
來完成?
np.vectorize()
是這里最快的解決方案還是有更好的方法?
我玩弄了以下代碼,但收到了錯誤RuntimeWarning: invalid value encountered in long_scalars (9 * Y) / (X + 15 * Y + 3 * Z)
。 而且它似乎永遠在運行......
# input is im_xyz with shape (width, height, 3)
im_xyz_reshape = im_xyz.reshape((im_xyz.shape[0] * im_xyz.shape[1], 3))
def xyz2uv(XYZ):
[X,Y,Z] = XYZ
return np.array([
(4 * X) / (X + (15 * Y) + (3 * Z)),
(9 * Y) / (X + 15 * Y + 3 * Z)
])
xyz2uv_v = np.vectorize(xyz2uv, signature='(xyz)->(uv)')
im_uv = xyz2uv_v(im_xyz_reshape).reshape((im.shape[0], im.shape[1], 2))
正如您已經意識到的那樣, np.vectorize
是一個美化的 python-for 循環並且非常慢。 實現這一目標的更好方法是以矢量化方式編寫 function。
def xyz2uv(xyz): # untested as we have no example
x, y, z = xyz[ ..., 0], xyz[..., 1], xyz[..., 3]
denom = x + 15*y + 3*z
return np.stack([4*x/denom, 9*y/denom], axis=2)
這確保了我們始終對整個數組進行操作,這可以通過很少的 python 函數調用來完成,並且 rest 是使用 C/C++ 在引擎蓋下完成的,這就是它快速的原因。 使用您的方法,我們必須在 python 中執行所有循環,這使它變慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.