簡體   English   中英

使用 np.vectorize 將 function 應用於圖像的所有像素(寬度、高度、3)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM