在numpy中通过灰度元素划分RGB图像

时间:2015-08-12 18:17:14

标签: python numpy

假设我们有两个形状阵列(480,640,3)和(480,640),比如RGB和灰度图像。你如何将第一个元素分成第二个?到目前为止,我使用以下代码,但它有更好的代码片段吗?

arr1[:, :, 0] /= arr2
arr1[:, :, 1] /= arr2
arr1[:, :, 2] /= arr2

4 个答案:

答案 0 :(得分:4)

您可以将另一个轴添加到arr2,以便它broadcast

>>> a = np.ones((2,2,3))
>>> b = np.ones((2,2)) * 2
>>> a
array([[[ 1.,  1.,  1.],
        [ 1.,  1.,  1.]],

       [[ 1.,  1.,  1.],
        [ 1.,  1.,  1.]]])
>>> b
array([[ 2.,  2.],
       [ 2.,  2.]])
>>> a = a / b[:, :, np.newaxis]
>>> a
array([[[ 0.5,  0.5,  0.5],
        [ 0.5,  0.5,  0.5]],

       [[ 0.5,  0.5,  0.5],
        [ 0.5,  0.5,  0.5]]])
>>>

答案 1 :(得分:1)

嗯......你可能会复制你的灰度数组,只做一个分区吗?

arr1 /= arr2.repeat(3).reshape(np.shape(arr1))

答案 2 :(得分:1)

这是一个可能有效的摘录:

result = np.dstack([x/np.reshape(arr2,(480,640,1)) for x in np.dsplit(arr1,3)])

将RGB阵列分成3个2D阵列,将每个阵列除以灰度阵列并重新组合。

答案 3 :(得分:1)

您可以在向arr2添加单身维度之后使用np.divide来对arr1元素进行原位编辑,因为这是您的代码似乎在做。优点是这将是内存效率。这是实施 -

np.divide(arr1,arr2[:,:,None],arr1)

您还可以使用np.einsum的广播功能 -

arr1 = np.einsum('ijk,ij->ijk',arr1,1/arr2)