2015-04-25 48 views
2

我将图像加载到一个numpy数组中,并且想要在直方图中绘制其颜色值。numpy图像中灰度值的直方图

import numpy as np 

from skimage import io 
from skimage import color 

img = io.imread('img.jpg') 
img = color.rgb2gray(img) 

unq = np.unique(img) 
unq = np.sort(unq) 

当我们检查的unq的价值,我们会看到类似

array([ 5.65490196e-04, 8.33333333e-04, 1.13098039e-03, ..., 
     7.07550980e-01, 7.09225490e-01, 7.10073725e-01]) 

到现在还太值matplotlib所以我的想法是遍历unq和删除所有这些偏差仅x值从它的前身。

dels = [] 

for i in range(1, len(unq)): 
    if abs(unq[i]-unq[i-1]) < 0.0003: 
     dels.append(i) 

unq = np.delete(unq, dels) 

虽然这种方法可行是因为它确实非常低效不使用numpy的经过优化的实现。

是否有一个numpy功能可以为我做这个?

只是注意到我的算法丢失了颜色出现频率的信息。让我试着修复这个

+2

为什么不使用['np.histogram(img,bins)'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html)(或['plt.hist (img.ravel(),bin)'](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist)如果你只是想绘制它)? –

+0

@ali_m是的,这会回答我的问题。 – bodokaiser

回答

5

如果你只是想计算的直方图,可以使用np.histogram

bin_counts, bin_edges = np.histogram(img, bins, ...) 

这里,bins既可以是窗口的数量,或指定上下仓边缘的载体。

如果你想绘制直方图,最简单的方法是使用plt.hist

bin_counts, bin_edges, patches = plt.hist(img.ravel(), bins, ...) 

请注意,我用img.ravel()计算直方图之前被拉平的图像阵列。如果您将二维数组传递给plt.hist(),则它会将每行视为一个单独的数据系列,这不是您想要的。

+1

感谢您使用'plt.hist(img.ravel())'!“!如何从直方图中读取灰度值(比例尺只能从0到0.8)? – bodokaiser

+0

不确定你的意思。 x轴表示灰度值,y轴表示频率。如果x比例从0到0.8,那么所有灰度值都位于0和0.8之间,这与您在'unq'中显示的值看起来一致。 –

+0

啊,这是有道理的。 – bodokaiser