【问题标题】:histogram of gray scale values in numpy imagenumpy图像中灰度值的直方图
【发布时间】:2015-04-25 11:05:02
【问题描述】:

我将图像加载到 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 功能可以为我做到这一点?

刚刚注意到我的算法丢失了关于颜色出现频率的信息。让我尝试解决这个问题

【问题讨论】:

标签: python image-processing numpy matplotlib


【解决方案1】:

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

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

这里,bins 可以是 bin 的数量,也可以是指定 bin 上下边缘的向量。

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

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

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

【讨论】:

  • 感谢plt.hist(img.ravel()) 的精彩提示!如何从直方图中读取灰度值(比例仅从 0 到 0.8)?
  • 不确定你的意思。 x 轴代表灰度值,y 轴代表频率。如果 x 刻度从 0 到 0.8,那么您的所有灰度值都在 0 到 0.8 之间,这看起来与您在 unq 中显示的值一致。
  • 啊是的,这是有道理的。
猜你喜欢
  • 2015-04-15
  • 2021-06-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多