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 库中的一个函数,用于将多维数组展平为一维数组。这个函数非常有用,特别是当你需要处理多维数组但希望将其视为一维数组时。

  1. 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

  1. 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方法实现灰度直方图的绘制

  1. 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) # 显示图像

运行结果如下




结尾

亲爱的读者,首先感谢抽出宝贵的时间来阅读我们的博客。我们真诚地欢迎您留下评论和意见,因为这对我们来说意义非凡。
俗话说,当局者迷,旁观者清。的客观视角对于我们发现博文的不足、提升内容质量起着不可替代的作用。
如果您觉得我们的博文给您带来了启发,那么,希望能为我们点个免费的赞/关注您的支持和鼓励是我们持续创作的动力
请放心,我们会持续努力创作,并不断优化博文质量,只为给带来更佳的阅读体验。
再次感谢的阅读,愿我们共同成长,共享智慧的果实!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐