【3分钟】掌握用numpy绘制灰度直方图
本文将向大家介绍如何用【三分钟】如何使用numpy库快速绘制灰度直方图
引言
在数字图像处理中,灰度直方图是一种常用的工具,用于统计图像中各个灰度级别的像素数量。它能够直观地反映出图像的对比度、亮度等特征,有助于我们分析和处理图像。本文将向大家介绍如何使用numpy库在Python中快速绘制灰度直方图。
知识储备
对于灰度图像而言,灰度直方图可以统计灰度图像内各个灰度级出现的次数。
灰度直方图的横坐标是灰度图像中各像素点的灰度级。灰度的数值范围为[0, 255]。因此,如果将图像分为256个灰度级,那么每个灰度级唯一对应一个灰度;如果将图像分为16个灰度级,那么每个灰度级包含连续的16个灰度(如[0, 15], [15, 31]…)。
灰度直方图的纵坐标是具有该灰度级的像素个数。
需求说明
欲对灰度图像格式的lena图像实现灰度直方图的绘制。
准备工作
在开始之前,请确保已经安装了numpy、opencv-python和matplotlib这三个库。如果没有安装,可以通过以下命令进行安装:
pip install numpy matplotlib opencv-python
解决方案
基于numpy数组的revel方法实现灰度直方图的绘制
numpy.ravel
方法是 NumPy 库中的一个函数,用于将多维数组展平为一维数组。这个函数非常有用,特别是当你需要处理多维数组但希望将其视为一维数组时。
- revel方法的基本用法
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3],
[4, 5, 6]])
# 使用 ravel 方法展平数组
flattened_arr = arr.ravel()
print(flattened_arr) # 输出: [1 2 3 4 5 6]
在这个例子中,我们创建了一个二维数组 arr
,然后使用 ravel
方法将其展平为一个一维数组 flattened_arr
。
- revel方法的参数
numpy.ravel
方法有一个可选参数 order
,它决定了元素在展平数组中的顺序。order
参数可以是 'C'
或 'F'
或 'A'
或 'K'
,分别代表 C-style、Fortran-style、Any-style 和 Keep-style。默认是 'C'
。
'C'
:按行优先顺序展平数组。'F'
:按列优先顺序展平数组。'A'
:按原数组的顺序展平(如果原数组是 C-style 就按 C-style,如果是 Fortran-style 就按 Fortran-style)。'K'
:按元素在内存中出现的顺序展平。
完整代码
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("lena.jpg", 0) # 以灰度图像格式读取图像
cv2.imshow("lena", img)
# 基于numpy数组的ravel方法将二维数组img展开成一维数组
flattene_img = img.ravel()
# 对一维数组进行直方图绘制
plt.hist(flattene_img, bins=16) # bins=16表示包含16个灰度级
plt.show()
cv2.waitKey(0) # 显示图像
结果如下:
基于numpy数组的reshape方法实现灰度直方图的绘制
- reshape方法的参数说明
numpy数组的reshape方法是在不改变数据内容的情况下,改变一个数组的格式。
具体来说,numpy数组的reshape()方法的参数说明如下:
- newshape:新形状,可以是整数或整数元组。新形状应与原形状兼容,即新形状与旧形状的元素数量需一致。如果是整数,那么结果将是该长度的一维数组。可以是-1,表示自动推断。如果是整数元组,则表示新形态在各个维度上的尺寸。
- order:可选参数,有三种选择:‘C’、‘F’、‘A’。'C’表示按照行来填充,'F’表示按照列的顺序来填充,‘A’表示按任意方向。如果不进行order参数的设置,默认参数为’C’。
完整代码
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("lena.jpg", 0) # 以灰度图像格式读取图像
cv2.imshow("lena", img)
# 基于numpy数组的reshape方法将二维数组img展开成一维数组
flattene_img = img.reshape((-1,)) # 将reshape的shape参数设置为(-1,),代码可以自动计算img展成一维数组后的实际大小
# ---> 比如img形状为(16, 16) ---> 参数(-1,) 等价于参数(256, )
# 对一维数组进行直方图绘制
plt.hist(flattene_img, bins=16) # bins=256表示包含256个灰度级
plt.show()
cv2.waitKey(0) # 显示图像
运行结果如下
结尾
亲爱的读者,首先感谢您抽出宝贵的时间来阅读我们的博客。我们真诚地欢迎您留下评论和意见,因为这对我们来说意义非凡。
俗话说,当局者迷,旁观者清。您的客观视角对于我们发现博文的不足、提升内容质量起着不可替代的作用。
如果您觉得我们的博文给您带来了启发,那么,希望您能为我们点个免费的赞/关注,您的支持和鼓励是我们持续创作的动力。
请放心,我们会持续努力创作,并不断优化博文质量,只为给您带来更佳的阅读体验。
再次感谢您的阅读,愿我们共同成长,共享智慧的果实!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)