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

news2024/12/23 17:48:18

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.coloradmin.cn/o/2132323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IO中断原理浅析

目录 什么是中断 什么是IO中断 无中断的情况 有中断的情况 什么是中断 中断是指,在程序运行过程中,系统出现一个必须由CPU立即处理的情况,此时CPU暂时中止程序的执行转而处理这个新情况的过程叫做中断。 什么是IO中断 I/O中断通过中断处理…

操作系统的重点笔记-1

一、操作系统的设计目标 1.易用性 使计算机易于使用,提供文件抽象后,对文件的操作就是对磁盘的操作,不再需要考虑如何通过控制磁盘移动,实现对磁盘某个信号的读写细节 2.高效性 完成特定功能的效率,如时间效率&…

音视频开发之旅(93)-图像超分增强之Real-ESRGAN

目录 1、背景和问题 2、高清-低清 数据集构建 3、Real-ESRGAN模型结构 4、源码分析 5、不足与局限性 6、资料 一、背景和问题 图像超分一直是一个活跃的研究课题,旨在从低分辨率(LR)重建高分辨率(HR)图像。在数…

中秋节了,送大家一个月饼

按F12,直接在浏览器控制台输入下面代码,你就会得到下面的月饼 console.log("%c\uD83E\uDD6E","font-size: 20em")

pandas中基于范围条件进行表连接

来自:Python大数据分析 费弗里 表连接是我们日常开展数据分析过程中很常见的操作,在pandas中基于join()、merge()等方法,可以根据左右表连接依赖字段之间对应值是否相等,来实现常规的表连接。 但在有些情况下,我们可能…

JDBC与MyBatis:数据库访问技术的变迁【后端 15】

JDBC与MyBatis:数据库访问技术的变迁 JDBC的基本使用 Java Database Connectivity (JDBC) 是Java提供的一种标准API,用于与数据库进行交互。它提供了一系列的接口和类,使得开发人员能够直接使用Java代码来编写SQL语句并执行数据库操作。JDBC…

Sequential的使用和搭建实战

一、Sequential 是什么 Sequential 主要出现在 Keras 库中,这是一个用于构建和训练深度学习模型的高级 API。Sequential 类允许你按顺序构建神经网络模型,其中每一层都按照给定的顺序逐层堆叠。这种模型适用于大多数线性堆叠的神经网络结构。Sequential…

GEE 迭代删除谷歌资产文件夹

在Google Earth Engine (GEE) 中管理大量地理空间数据时,我们可能会遇到需要清理不再需要的资产的情况。但需要提前删除子文件后才可删除文件夹,才可释放存储空间,删除过时的数据。本文将介绍如何在GEE中迭代删除资产文件夹。 代码详解 以下…

3个方法教大家如何在Excel表格中添加水印

在Excel表格中添加水印是一种常见的需求,但是Excel并没有像word文档一样的直接添加水印的功能,怎么办? 今天小编来分享一个方法,也能实现Excel表格的添加水印~ 一、使用文本框插入文字水印 1、插入选项卡 进入excel的操作界面&…

Google大数据架构技术栈

数据存储层 Colossus Colossus作为Google下一代GFS(Google File System)。 GFS本身存在一些不足 单主瓶颈 GFS 依赖单个主节点进行元数据管理,随着数据量和访问请求的增长,出现了可扩展性瓶颈。想象一下,只有一位…

攻防世界 CTF Pwn(一)

前言 攻防世界是一个专注于网络安全的在线学习和竞赛平台,由赛宁网安推出,旨在为网络安全爱好者提供丰富的学习资源和实战竞赛环境。该平台自2018年9月推出以来,已经吸引了超过18万用户注册使用,月活跃用户超过5万。 平台的主要…

BBOT:一款递归型互联网OSINT资源情报工具

关于BBOT BBOT是一款递归型互联网OSINT资源情报工具,该工具深受Spiderfoot项目的启发,旨在自动化侦察、漏洞奖励项目和ASM。 功能介绍 1、支持多个目标 2、网页截图 3、 Web安全测试模块套件 4、由 NLP 提供支持的子域名变异 5、Neo4j 的本机输出&#…

【LeetCode】每日一题 2024_9_13 预算内的最多机器人数目(滑动窗口、单调队列)

LeetCode 启动! 每日一题的题解重新开始连载! 题目:预算内的最多机器人数目 题目链接:2398. 预算内的最多机器人数目 题目描述 代码与解题思路 func maximumRobots(chargeTimes []int, runningCosts []int, budget int64) (an…

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用…

【计算机网络】HTTP相关问题与解答

此篇文章内容会不定期更新,仅作为学习过程中的笔记记录 目录 一、HTTP请求和响应报文是怎样的? 1、请求报文 2、响应报文 二、HTTP请求方法有哪些? GET HEAD POST PUT DELETE PATCH OPTIONS TRACE CONNECT 三、GET请求与POST请…

Day 不知道是几|贪心算法part1

贪心算法 贪心算法一般分为如下四步: 将问题分解为若干个子问题 找出适合的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解 这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。…

c++中模版进阶和继承

类型参数非类型模版参数 //类型参数非类型模版参数 template<class T,int N> class Array { public:Array() {} private:T _a[N]; }; int main() {Array<int, 100> a1;return 0; } 注意&#xff1a; 1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。…

【兼容性记录】video标签在 IOS 和 安卓中的问题

业务需求背景&#xff1a;由于业务中涉及到有视频播放的内容&#xff0c;所以就使用了 video 标签去做&#xff0c;但是 video 标签在 ios 设备和安卓设备中的默认行为不一致&#xff0c;故记录下解决方法&#xff08;折中办法&#xff09;。 ios 自动全屏 ios 设备点击播放视频…

STC分散文件加载

一、什么是分散加载文件&#xff1f; 分散加载文件通常以.sct结尾&#xff0c;英文名是&#xff1a;Linker Control File, scatter loading&#xff0c;链接器根据这个文件的配置来分配各个节区的地址空间&#xff0c;并且生成分散加载代码&#xff0c;因此我们只要修改分散加载…

另一款插件开发中......

欢迎插眼&#xff01;&#xff01;&#xff01; 一款关于源码阅读和笔记记录的插件。发个图&#xff0c;还在开发中......Command Assist的难点是第一次接触IDEA插件&#xff0c;不管是项目工程结构&#xff0c;还是开发发布流程都比较陌生&#xff0c;然后是功能点里面的终端…