Numpy 3d数组映射操作

时间:2016-02-19 06:28:04

标签: python opencv numpy

现在我有一个3维np.array [身高,体重,3]。 (这是一张图片)我想实现一个RGB - > YUV算法自己RGB2YUV。但是,从每个像素迭代并应用变换太慢。

for x in xrange(height):
    for y in xrange(weight):
          img[x,y] = mat_1 * img[x,y]

有没有办法使用一些实现它的built_in方法?

1 个答案:

答案 0 :(得分:1)

这似乎是np.einsum的一个很好的用例:

yuv_image = np.einsum('kl,ijl->ijk', transformation_matrix, rgb_image)

一旦你将这些指数写在一张纸上,就很容易想出这些指数。

显示两种方法的值相等的示例:

>>> rgb_image = np.random.rand(2*4*3).reshape(2,4,3)
>>> transformation_matrix = np.random.rand(9).reshape(3,3)
>>> z = np.empty_like(rgb_image)
>>> for x in range(rgb_image.shape[0]):
...     for y in range(rgb_image.shape[1]):
...         z[x,y] = np.dot(transformation_matrix, rgb_image[x,y,:])
...
>>> np.allclose(z, np.einsum('kl,ijl->ijk', transformation_matrix, rgb_image))
True