histogram函数重要参数详解
def histogram(a, bins=10, range=None, normed=None, weights=None, density=None):
...
- 位置参数a:
The histogram is computed over the flattened array.(源码对参数a的解释)
从源码对参数a的解释来看,参数a应该传入一维数组以计算直方图。然而,参数a既可接受PIL.Image对象,也可接受多维数组对象。参数a之所以能够接受PIL.Image对象,是因为histogram函数内部会通过数组的asarray方法将PIL.Image对象转换为numpy的多维数组;而参数a之所以能够接受多维数组,是因为histogram函数内部会通过数组的reval方法将多维数组展开成一维数组。
-
默认参数bins
bins参数规定的是直方图中箱子的数量。
以灰度直方图为例,灰度图像的数值范围是[0, 255],共256个数值。假定256个灰度级,等价于灰度直方图将有256个箱子 ==> bins应设置为256; -
默认参数range
range参数规定直方图横坐标的显示范围,默认为数据的范围(最小值和最大值)。如果灰度图像像素的最小值为30,最大值为220,而range不自行规定为(0, 255),那么画出的直方图横坐标数值范围为(30, 220),如下所示:
因此,若要画灰度图像256个灰度级的灰度直方图,建议将range参数设置为(0, 255)。
histogram函数返回值详解
第一个返回值hist——直方图的纵坐标
若要绘制灰度直方图,那么histogram函数返回的第一个值便记录了灰度直方图每个灰度级的像素个数,也就是灰度直方图的所有纵坐标。如果由256个灰度级,那么返回值hist的长度便为256。
第二个返回值bin_edges——直方图横坐标的边界
由于直方图是由一个个“箱子组成的”,那么每个箱子都有左右边界,且相邻箱子共用一个边界。那么对于灰度直方图而言,如果有256个灰度级 ⇒ 256个箱子(bins=256) ⇒ 257个不同边界(共有边界算一个)。因此,返回的bin_edges的长度是 len(hist) + 1。bin_edges的两端边界受到参数range的影响。如果range为(0, 255), 那么bin_edges的左端边界为0,右端边界为255, 并等间隔划分256份(由bins参数决定),共257个边界值。如果range为(0, 100), 那么bin_edges的左端边界为0,右端边界为100,仍然等间隔划分256份(由bins参数决定),共257个边界值。
基于histogram函数画灰度图像的灰度直方图
代码如下:
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
# 读取图像并将其转换为灰度图像
img = Image.open('lena.jpg').convert('L')
# 计算图像的灰度直方图
# histogram的输入既可以是PIL.Image对象,也可以是多维数组
hist, bin_edges = np.histogram(a=img, bins=256, range=(0, 255))
# 绘制灰度直方图
plt.bar(bin_edges[:-1], hist) # bin_edges的长度是hist长度 + 1 故舍弃bin_edges数组最后一个数值
plt.show()
结束语
如果本博文对你有所帮助,可以点个赞/收藏支持一下,如果能够持续关注,小编感激不尽~
如果有相关需求/问题需要小编帮助,欢迎私信~
小编会坚持创作,持续优化博文质量,给读者带来更好de阅读体验~