【五分钟】熟练使用numpy的histogram函数(干货!!!)

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阅读体验~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/217594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0开始使用Maven

文章目录 一.Maven的介绍即相关概念1.为什么使用Maven/Maven的作用2.Maven的坐标 二.Maven的安装三.IDEA编译器配置Maven环境1.在IDEA的单个工程中配置Maven环境2.方式2:配置Maven全局参数 四.IDEA编译器创建Maven项目五.IDEA中的Maven项目结构六.IDEA编译器导入Mav…

设计模式之代理模式(1)

目录 概述定义应用场景主要角色类图 详述基本代码应用实例符合的设计原则 总结 概述 定义 代理模式是一种结构型设计模式,它允许通过一个代理对象来控制对原始对象的访问。代理对象可以在不改变原始对象的情况下,增加一些额外的功能,例如权限…

差分基准站

差分基准站,又称参考接收机,是一种固定式卫星接收机,用于提高卫星定位精度。 差分基准站的作用是提供已知位置和准确的位置信号,以纠正其他移动定位终端接收器接收到的卫星信号中的误差。 卫星定位信号会受到多种因素的影响&#…

selenium自动化测试:xpath八种定位方式!

01、前言 如果可以的话,请先关注(专栏和账号),然后点赞和收藏,最后学习和进步。你的支持是我继续写下去的最大动力,个人定当倾囊而送,不负众望。谢谢!!! 1.…

【蓝桥杯省赛真题49】Scratch小狗避障 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch小狗避障 一、题目要求 编程实现 二、案例分析 1、角色分析

JDK安装太麻烦?一篇文章搞定

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVMJava系统类库)和JAVA工具。 JDK包含的基本组件包括: javac – 编译器&#xf…

从零开始入门Zapier:与ChatGPT双剑合璧,手把手教程让你进入AI与自动化新纪元

coments 1. 1. 打开Zapier的官方界面 登录之后,会出现一个调查表,可以根据自己的情况进行选择。 第一次注册成功,会送你14天的免费体验

SAP ABAP ALV创建动态树形菜单

创建动态树形菜单——ALV 创建的合同越多,使用树形菜单能比较直观的地显示,而且展开下阶也能明确的知识相关的信息,比如合同中的出口成品有哪些。 设计要点: 第一、 Node_key一定要区分,不能重复,否则出错…

C语言--每日选择题--Day35

第一题 1. 有如下定义:(x y) % 2 (int) a / (int) b 的值是() int x 3; int y 2;float a 2.5; float b 3.5; A:0 B:2 C:1.5 D:1 答案及解析 D 本题是考查强制类型转换和操作符优先级 操作…

JavaWeb 前端工程化

前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。 前端工程化实现技术栈 前端工程化实现的技术栈有很多,我们采用ES6nodejsnpmViteVUE3routerpiniaaxiosElement-plus组合来实现 ECMAScri…

由11月27日滴滴崩溃到近两个月国内互联网产品接二连三崩溃引发的感想

文章目录 知乎文分析微信聊天截图微信公众号 滴滴技术 发文k8s 官方文档滴滴官方微博账号 近两个月国内互联网产品“崩溃”事件2023-10-23 语雀崩溃2023-11-12 阿里云崩溃2023-11-27 滴滴崩溃2023-12-03 腾讯视频崩溃总结 我的感想 知乎文分析 最近连续加班,打车较…

简单的界面与数据分离的架构

草图绘制于2021年2月19日 当时用到了:qt的子项目、delegate、view和widget的关系,有感而写的小备忘,2022年底考的软件设计师里面的设计模式虽然可能早已包含,但自己也得有自己啊,要把自己哪怕不成熟的东西也记录下来&…

操作系统概述及发展史、Linux内核、发行版及应用领域

一、 操作系统(Operation System,OS) 裸机:没有安装操作系统的计算机 如果想在 裸机 上运行自己所编写的程序,就必须用机器语言书写程序如果计算机上安装了操作系统,就可以在操作系统上安装支持的高级语言…

【算法刷题】Day12

文章目录 1004. 最大连续1的个数 III题干:算法原理:1、暴力枚举 计数器2、利用滑动窗口 代码: 746. 使用最小花费爬楼梯题干:算法原理:解法一:1.1 状态表示1.2 状态转移方程1.3 初始化1.4 填表顺序1.5 返回…

unity学习笔记18

模型文件属性简介 1.动画类型:一共有四种:无 表示没有动画,旧版 就表示这个模型文件里面的动画片段可以用animation组件来播放的,最后两个 ”泛型“和“人形”都是animator组件来播放的。区别是泛型支持所有类型的动画播放&#x…

LangChain的函数,工具和代理(四):使用 OpenAI 函数进行标记(Tagging) 提取(Extraction)

在上一篇博客LangChain中轻松实现OpenAI函数调用 中我们学习了如何使用Pydantic来生成openai的函数描述对象,并且通过在langchain中调用Pydantic生成的函数描述变量来轻松实现openai的函数调用功能,在此基础上今天我们再介绍两个非常实用的功能&#xff…

vue实现css过渡与css动画

一、过渡和动画的区别 过渡:通常用来表示元素上属性状态的变化。动画:通常用来表示元素运动的情况。 二、使用Vue实现基础得css过渡与动画 1. 动画 /* css */ keyframes leftToRight {0% {transform: translateX(-100px);}50% {transform: translateX(-5…

万兆多模光模块SFP-10G-SR:高速短距传输的最优选

随着信息技术的发展,企业和个人对数据传输速度和带宽需求不断增加。传统的千兆以太网已经不能满足高速数据传输的要求,因此万兆以太网技术崭露头角。作为万兆以太网中的重要组件之一,万兆多模SFP-10G-SR光模块引起了广泛的关注。本文将介绍万…

Sentinel基础知识

Sentinel基础知识 资源 1、官方网址:https://sentinelguard.io/zh-cn/ 2、os-china: https://www.oschina.net/p/sentinel?hmsraladdin1e1 3、github: https://github.com/alibaba/Sentinel 一、软件简介 Sentinel 是面向分布式服务架构的高可用流量防护组件…

【原神游戏开发日志1】缘起

【原神游戏开发日志1】缘起 版权声明 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明 文章内容不得删减、修改、演绎 相关学习资源见文末 大家好,最近看到原神在TGA上频频获奖,作为一个14年经验的游戏开…