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])
我有一个 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])