在Python中手动高效地创建图像直方图

时间:2016-10-16 17:08:09

标签: python opencv numpy image-processing matplotlib

我想编写可以显示图像直方图的代码,而不使用内置的Matplotlib hist函数。

这是我的代码:

threading.Lock()

我的问题是,有没有更有效的方法来制作一个像素值频率数组而不使用for循环?

1 个答案:

答案 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