我想编写可以显示图像直方图的代码,而不使用内置的Matplotlib hist函数。
这是我的代码:
threading.Lock()
我的问题是,有没有更有效的方法来制作一个像素值频率数组而不使用for循环?
答案 0 :(得分:1)
基于NumPy的矢量化解决方案将使用np.bincount
-
out = np.bincount(img.ravel(),minlength=256)
另一种基于.sum()
-
out = (img.ravel() == np.arange(256)[:,None]).sum(1)
运行样本以验证结果 -
In [155]: # Input image (512x512) as array
...: img = np.random.randint(0,255,(512,512))
...:
...: # Original code
...: row, col = img.shape
...: y = np.zeros((256), np.uint64)
...: for i in range(0,row):
...: for j in range(0,col):
...: y[img[i,j]] += 1
...:
In [156]: out1 = np.bincount(img.ravel(),minlength=256)
In [157]: out2 = (img.ravel() == np.arange(256)[:,None]).sum(1)
In [158]: np.allclose(y,out1)
Out[158]: True
In [159]: np.allclose(y,out2)
Out[159]: True