numpy图像中灰度值的直方图

bod*_*ser 4 python numpy image-processing matplotlib

我将图像加载到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)
Run Code Online (Sandbox Code Playgroud)

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

array([  5.65490196e-04,   8.33333333e-04,   1.13098039e-03, ...,
         7.07550980e-01,   7.09225490e-01,   7.10073725e-01])
Run Code Online (Sandbox Code Playgroud)

这仍然有太多的价值,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)
Run Code Online (Sandbox Code Playgroud)

虽然这种方法有效,但由于它不使用numpy的优化实现,因此效率非常低.

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

只是注意到我的算法丢失了有关颜色发生频率的信息.让我试着解决这个问题.

ali*_*i_m 12

如果您只想计算直方图,可以使用np.histogram:

bin_counts, bin_edges = np.histogram(img, bins, ...)
Run Code Online (Sandbox Code Playgroud)

这里,bins可以是箱数,也可以是指定上下箱边的矢量.

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

bin_counts, bin_edges, patches = plt.hist(img.ravel(), bins, ...)
Run Code Online (Sandbox Code Playgroud)

请注意,我曾经img.ravel()在计算直方图之前将图像阵列展平.如果您将2D数组传递给plt.hist()它,它会将每一行视为一个单独的数据系列,这不是您想要的.

  • 谢谢你用'plt.hist(img.ravel())`来表达伟大的tipp!如何从直方图中读取灰度值(刻度仅从0到0.8)? (2认同)