opencv学习:calcHist 函数绘制图像直方图及代码实现

cv2.calcHist 函数是 OpenCV 库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。

函数语法

hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate=False)

参数

  • images: 图像数组或图像列表。对于单通道图像(如灰度图像),只需一个图像;对于多通道图像(如彩色图像),可以传入多个图像。
  • channels: 需要计算直方图的通道索引列表。对于灰度图像,通常传入 [0];对于彩色图像,可以传入 [0](蓝色通道)、[1](绿色通道)、[2](红色通道)。
  • mask: 可选参数,用于指定计算直方图的区域。如果为 None,则计算整个图像的直方图。如果提供了掩码图像,直方图将只计算掩码非零区域的像素值。
  • histSize: 直方图的大小,即直方图的“bin”数量。对于灰度图像,通常设置为 [256],因为像素值的范围是 0 到 255。
  • ranges: 像素值的范围。对于灰度图像,通常设置为 [0, 256]
  • accumulate: 可选参数,用于指定是否在现有的直方图上累加。默认为 False

返回值

  • hist: 计算得到的直方图,是一个一维数组。

代码步骤

  1. 读取灰度图像

    • 使用 cv2.imread 读取图像,并将其转换为灰度图像。
    • cv2.IMREAD_GRAYSCALE 指定读取图像时将其转换为灰度图像。
      phone=cv2.imread("phone.png",cv2.IMREAD_GRAYSCALE)
  2. 展平灰度图像

    • 使用 numpy.ravel 将灰度图像的二维数组展平为一维数组,以便绘制直方图。
      a=phone.ravel()
  3. 绘制灰度图像直方图

    • 使用 matplotlib.pyplot.hist 绘制灰度图像的直方图,其中 bins=256 表示将直方图分为256个区间。
      # 使用 matplotlib 绘制灰度图像的直方图
      # bins=256 表示将直方图分为256个区间
      plt.hist(a, bins=256)
      plt.show()
  4. 计算灰度图像直方图(OpenCV方法)

    • 使用 cv2.calcHist 计算灰度图像的直方图,其中直方图分为16个区间。
      # 使用 OpenCV 计算灰度图像的直方图
      # 直方图分为16个区间
      phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])
  5. 绘制灰度图像直方图(OpenCV方法)

    • 使用 matplotlib.pyplot.plot 绘制计算得到的灰度图像直方图。
      # 绘制计算得到的灰度图像直方图
      plt.plot(phone_hist)
      plt.show()
      
  6. 读取彩色图像

    • 使用 cv2.imread 读取彩色图像。
      # 读取名为 "phone.png" 的彩色图像
      img = cv2.imread("phone.png")
  7. 定义颜色通道列表

    • 定义一个包含蓝色、绿色和红色通道的列表。
      # 定义颜色通道的列表
      color = ('b', 'g', 'r')
      
  8. 计算并绘制彩色图像直方图

    • 遍历每个颜色通道,使用 cv2.calcHist 计算每个通道的直方图,并将直方图分为256个区间。
    • 使用 matplotlib.pyplot.plot 绘制每个通道的直方图,并使用对应的颜色绘制。
      
      # 遍历每个颜色通道
      for i, col in enumerate(color):# 计算每个颜色通道的直方图# 直方图分为256个区间histr = cv2.calcHist([img], [i], None, [256], [0, 256])# 绘制每个颜色通道的直方图# 使用对应的颜色绘制plt.plot(histr, color=col)
  9. 显示彩色图像直方图

    • 使用 matplotlib.pyplot.show 显示绘制的彩色图像直方图。
      # 显示绘制的彩色图像直方图
      plt.show()

完整代码

import cv2
import matplotlib.pyplot as plt
import numpy as np# 读取名为 "phone.png" 的图像,并将其转换为灰度图像
phone = cv2.imread("phone.png", cv2.IMREAD_GRAYSCALE)# 将灰度图像的二维数组展平为一维数组
a = phone.ravel()# 使用 matplotlib 绘制灰度图像的直方图
# bins=256 表示将直方图分为256个区间
plt.hist(a, bins=256)
plt.show()# 使用 OpenCV 计算灰度图像的直方图
# 直方图分为16个区间
phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])# 绘制计算得到的灰度图像直方图
plt.plot(phone_hist)
plt.show()# 读取名为 "phone.png" 的彩色图像
img = cv2.imread("phone.png")# 定义颜色通道的列表
color = ('b', 'g', 'r')# 遍历每个颜色通道
for i, col in enumerate(color):# 计算每个颜色通道的直方图# 直方图分为256个区间histr = cv2.calcHist([img], [i], None, [256], [0, 256])# 绘制每个颜色通道的直方图# 使用对应的颜色绘制plt.plot(histr, color=col)# 显示绘制的彩色图像直方图
plt.show()

实验结果

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 PyCharm 无法启动 Jupyter 服务器的问题:报错分析与解决方案

文章目录 报错背景报错详细信息解决方案pycharm 设置 报错背景 在使用 pycharm 付费版的过程中,发现一直无法启动 jupyter 服务器。 一直也不知道是为什么,直到在终端输入: jupyter notebook发现 jupyter 服务无法启动。 报错详细信息 下…

数据库系列之GaussDB数据库中逻辑对象关系简析

初次接触openGauss或GaussDB数据库的逻辑对象,被其中的表空间、数据库、schema和用户之间的关系,以及授权管理困惑住了,与熟悉的MySQL数据库的逻辑对象又有明显的不同。本文旨在简要梳理下GaussDB数据库逻辑对象之间的关系,以加深…

浅谈EXT2文件系统(1)

简介 EXT2(Second Extended Filesystem)文件系统是Linux操作系统的早期文件系统之一,它于 1993 年推出,是第一个旨在克服 Ext 文件系统限制的商业文件系统。EXT2 没有日志功能,EXT2 支持的单个文件大小为 2TB&#xf…

如何在Word中插入复选框

如何在Word中插入复选框:详细教程与技巧 在Word中插入复选框是一项非常实用的技巧,尤其是在制作问卷调查、待办事项清单、交互式表单或文档中需要用户进行选择时,复选框不仅能提高文档的功能性,还能显得更加专业。本文将详细讲解…

不小心把回收站清空了怎么恢复?别慌!四招找回

在日常使用电脑的过程中,我们可能会不小心清空回收站,从而丢失一些重要的文件。当遇到这种情况时,很多人可能会感到焦虑和无助。然而,幸运的是,有一些方法可以帮助我们尝试恢复这些被删除的文件。下面,我们…

大数据-133 - ClickHouse 基础概述 全面了解

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

关于【禁止new对象时在for循环内定义申明变量】

文章目录 简介代码分析反编译之后对比性能测试内存与垃圾回收情况JDK和常用框架怎么写总结依赖 简介 不知道是谁最先提出了一个不要将变量定义在循环内。 然后我们在代码扫描中有一项是:【禁止new对象时在for循环内定义申明变量】 我也好奇为什么不能&#xff1f…

如何利用MES系统进行产品质量全流程追溯

利用MES(制造执行系统)系统进行产品质量全流程追溯,是一个系统化和精细化的过程,主要涉及数据采集、信息整合、过程控制、查询分析以及持续优化等多个环节。以下是如何具体利用MES系统进行产品质量全流程追溯的步骤: 一…

centos(在线、离线)安装iptables

Iptables 是 Linux 操作系统中的一个用户空间工具,用来配置 Linux 内核中的 Netfilter 防火墙模块。它主要负责网络数据包的过滤、网络地址转换 (NAT) 以及配置防火墙规则。centos默认的防火墙管理工具是Firewalld,所以iptables需要下载安装。 目录 一…

嵌入式软件工程师:科技浪潮中的关键角色

嵌入式软件工程师:科技浪潮中的关键角色 一、嵌入式软件工程师的职业魅力 (一)市场需求旺盛 嵌入式软件工程师在当今科技领域中扮演着至关重要的角色。随着智能化时代的到来,嵌入式系统在各个行业的应用越来越广泛,市…

【贪心算法】贪心算法

贪心算法简介 1.什么是贪心算法2.贪心算法的特点3.学习贪心的方向 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.什么是贪心算法 与其说是…

[linux基础知识]教你使用vim和ctags阅读linux内核源码

1 安装ctags apt install ctags 2 内核源码目录下添加索引 使用下面命令,添加索引成功后,内核目录下会生成tags 索引文件。 ctags -R 3 vim使用索引阅读源码 跳转到函数变量定义与返回 #跳到函数或者变量定义 Ctrl] #返回 Ctrlo 光标移动到需要…

vue + Element UI table动态合并单元格

一、功能需求 1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并) 2、落实情况里的定量内容和定性内容值一样则合并。(横向…

设置使用阿里云服务器DNS

由于云服务器是从腾讯云迁移到阿里云,然后使用ssl验证时一直无法使用dns验证,也无法创建三级域名,原来需要把阿里云服务器改成阿里云的dns使用 如果使用其他服务器DNS会下面会显示当前DNS服务器,

Linux:git

hello,各位小伙伴,本篇文章跟大家一起学习《Linux:git》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!!&…

解决Docker镜像不可下载

使用国内可信的镜像中心 可信国内镜像网址:https://hub.atomgit.com/ 点击镜像仓库 搜索想要的镜像 按如图所示,即可查看对应的版本 点击复制,即可下载使用 缺点: 可用的镜像相比于docker官方量少 并且,获取的镜像名字…

【Java】方法2_Java的参数传递机制

文章目录 前言一、Java的参数传递机制都是值传递 1.基本类型的参数传递2.引用类型的参数传递总结 前言 学习Java的参数传递机制,基本类型的参数传递,引用类型的参数传递。 一、Java的参数传递机制都是值传递 值传递:指传输实参给方法的形参…

『功能项目』单例模式框架【37】

我们打开上一篇36C#拓展 - 优化冗余脚本的项目, 本章要做的事情是编写单例模式基类,让继承其基类的子类在运行时只存在一个,共有两个单例基类框架,分别是不继承MonoBehaviour的单例和继承MonoBehaviour的单例框架 首先编写不继承…

OpengGL教程(三)---使用VAO和VBO方式绘制三角形

本章参考官方教程:learnopengl-cn VertexShader.glsl #version 330 core layout(location 0) in vec3 position; layout(location 1) in vec3 color; uniform mat4 projection; // 投影矩阵 out vec4 ourColor; void main() {gl_Position projection * vec4(p…

Probabilistic Embeddings for Cross-Modal Retrieval 论文阅读

Probabilistic Embeddings for Cross-Modal Retrieval 论文阅读 Abstract1. Introduction2. Related work3. Method3.1. Building blocks for PCME3.1.1 Joint visual-textual embeddings3.1.2 Probabilistic embeddings for a single modality 3.2. Probabilistic cross-modal…