Numpy:np 数组中单个值的高效映射

Numpy: Efficient mapping of single values in np arrays

我有一个 3D numpy 数组,以 HSV 颜色 space(形状 = (h=1000, w=3000, 3))表示图像。

图像的最后一个维度是[H,S,V]。如果像素值 >20 ,我想从所有像素的 H 通道中减去 20 ,但保持 S 和 V 不变。 我编写了以下矢量化函数:

def sub20(x):
# x is a array in the format [H,S, V]
       return np.uint8([H-20, S, V])
 vec= np.vectorize(sub20, otypes=[np.uint8],signature="(i)->(i)")
 img2= vec(img1)

这个向量化函数所做的是接受图像的最后一个维度 [H,S,V] 并输出 [H-20, S, V] 如果 H 大于 20,我不知道如何让它减去 20。它也需要 1 分钟来执行。我希望脚本接受实时网络摄像头。有什么方法可以让它更快吗?

谢谢

是否需要使用矢量化功能?

否则只能使用以下命令:

# if you want to make change directly on same image.
img1[:,:,0] -= 20

# if you want to leave img1 in the same state.
img2 = np.array(img1)
img2[:,:,0] = img1[:,:,0] - 20

更新 (12:08 - 5.4.2020)
为了合并该值永远不会低于 0,我建议按照 Mercury 提到的那样分两步计算它:

# if you want to make changes directly on same image.
img1[:,:,0] -= 20
img1[img1[:,:,0] < 0] = 0

# if you want to leave img1 in the same state.
img2 = np.array(img1)
img2[:,:,0] = img2[:,:,0] - 20
img2[img2[:,:,0] < 0] = 0

您可以简单地根据条件切片:

img1[:,:,0][img1[:,:,0]>=20] -= 20

或者也可以使用 np.where:

img1[:,:,0] = np.where(img1[:,:,0]>=20, img1[:,:,0]-20, img1[:,:,0])