当前位置: 首页 > news >正文

[Python] opencv - 什么是直方图?如何绘制图像的直方图?如何对直方图进行均匀化处理?

什么是直方图?

直方图是一种统计图,用于展示数据的分布情况。它将数据按照一定的区间或者组进行划分,然后计算在每个区间或组内的数据频数或频率(即数据出现的次数或占比),然后用矩形或者柱形图的形式将这些频数或频率表示出来。横轴表示数据的区间或组,纵轴表示频数或频率,通过矩形或柱形的高度来表示频数或频率的大小。直方图可以用于直观地展示数据的分布情况,分析数据的集中趋势、离散程度和异常值等。

什么是图像直方图?

图像直方图是用来表示数字图像亮度或颜色分布的统计图。它可以显示图像中每个像素值或像素值范围的频数或频率。图像直方图以横轴表示像素值,纵轴表示像素值的频数或频率。对于灰度图像,直方图展示了每个像素值出现的次数或占比。对于彩色图像,可以将图像分解为红、绿、蓝通道,每个通道的直方图分别表示了该通道像素值的分布情况。

图像直方图可以提供有关图像亮度或颜色分布的重要信息。例如,在灰度图像中,直方图的形状可以反映图像的对比度和明暗程度。在彩色图像中,通过分析不同通道的直方图,可以了解图像的色彩分布情况,例如颜色偏移、色彩饱和度等。图像直方图在图像处理和计算机视觉中广泛应用,用于图像增强、颜色分析、图像检索等任务中。

opencv的calcHist函数介绍

cv2.calcHist()函数是OpenCV中用于计算图像直方图的函数。它的语法如下:

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

参数解释:

  • images:输入的图像,可以是一个图像或图像列表。
  • channels:用于计算直方图的通道编号,如果输入的图像是灰度图像,则通道值为[0];如果是彩色图像,通道值可以是[0]、[1]或[2],分别表示B、G、R通道。
  • mask:可选参数,用于指定感兴趣区域。如果不提供,则计算整个图像的直方图。
  • histSize:直方图的桶数,表示直方图的分组数量。
  • ranges:直方图的像素值范围,通常为[0, 256]。
  • hist:可选参数,用于存储计算得到的直方图。
  • accumulate:可选参数,用于指定是否累加直方图。

返回值:

  • hist:计算得到的直方图。

cv2.calcHist()函数会根据指定的通道和大小,计算输入图像的直方图。可以通过调整参数来计算灰度图像或彩色图像的直方图。计算得到的直方图可以用于图像处理、分析和可视化等应用。

如何灰度图像的直方图?

在Python中,可以使用matplotlib库 + opencv库来绘制灰度图像的直方图。下面是一个简单的示例:

import cv2
import matplotlib.pyplot as plt# 读取灰度图像
image = cv2.imread('2_0_2_2170.png', 0)# 计算直方图
histogram = cv2.calcHist([image], [0], None, [256], [0, 256])# 绘制直方图
plt.figure()
plt.title('Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.plot(histogram)
plt.xlim([0, 256])
plt.show()

在上面的示例中,我们首先使用cv2.imread()函数读取灰度图像。然后,使用cv2.calcHist()函数计算图像的直方图。该函数接受以下参数:图像(以数组的形式传递,所以使用方括号括起来),通道(如果是灰度图像,通道为[0]),掩码(用于指定对哪些像素计算直方图,None表示计算整个图像的直方图),直方图的bin数(256表示每个像素值都有一个bin),像素值范围([0, 256]表示像素值的范围)。最后,使用matplotlib.pyplot库绘制直方图,设置标题、x轴、y轴标签,以及绘制直方图的范围。

运行以上代码,将会显示灰度图像的直方图。你可以根据实际情况修改代码中的图像路径和参数,来绘制不同灰度图像的直方图。

如何绘制彩色图像的直方图?

import cv2
import matplotlib.pyplot as plt# 读取彩色图像
image = cv2.imread('beauty_01.jpg')# 将图像从BGR颜色空间转换为RGB颜色空间
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 将图像展平为一维数组
pixels = image_rgb.reshape(-1, 3)# 绘制直方图
plt.figure()
plt.title('Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
colors = ('r', 'g', 'b')
for i, color in enumerate(colors):histogram = cv2.calcHist([image_rgb], [i], None, [256], [0, 256])plt.plot(histogram, color=color)plt.xlim([0, 256])
plt.show()

在上述示例中,我们首先使用cv2.imread()函数读取彩色图像。然后,使用cv2.cvtColor()函数将图像从BGR颜色空间转换为RGB颜色空间。接下来,我们使用reshape()函数将图像展平为一维数组,以便于计算直方图。然后,使用cv2.calcHist()函数计算每个颜色通道的直方图。最后,使用matplotlib.pyplot库绘制直方图,设置标题、x轴、y轴标签,以及为每个颜色通道分别绘制直方图。

运行以上代码,将会显示彩色图像的直方图。你可以根据实际情况修改代码中的图像路径和参数,来绘制不同彩色图像的直方图。

什么是直方图均衡化?

直方图均衡化是一种图像处理技术,用于增强图像的对比度。 它通过重新分配图像的灰度级,使得原始图像中灰度级较少的区域在整个灰度范围内更均匀地分布。直方图均衡化可以增加图像的视觉效果和细节,并用于图像增强、图像分割、图像识别等应用中。

如何进行直方图均衡化?

opencv中,可以通过equalizeHist函数来进行灰度图的直方图均衡化。

cv2.equalizeHist()函数是OpenCV中用于直方图均衡化的函数。它将输入图像的直方图进行均衡化,以提升图像的对比度和亮度。

该函数的语法如下:

dst = cv2.equalizeHist(src)

参数说明:

  • src:输入图像,可以是灰度图像或彩色图像。

返回值:

  • dst:均衡化后的图像。

函数的工作原理如下:

  1. 计算输入图像的直方图。
  2. 计算直方图的累积分布函数(Cumulative Distribution Function,CDF)。
  3. 根据CDF对输入图像进行像素值的映射,将较暗的像素值转化为较亮的像素值,以实现直方图均衡化。
  4. 返回均衡化后的图像。

直方图均衡化可以提高图像的对比度,使得图像中的细节更加清晰。它常用于图像增强、视觉处理和计算机视觉中的预处理步骤。

使用案例:

import cv2# 读取图像
image = cv2.imread('beauty_01.jpg', cv2.IMREAD_GRAYSCALE)  # 以灰度模式读取图像# 进行直方图均衡化
equalized_image = cv2.equalizeHist(image)# 显示原始图像和均衡化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Equalized Image', equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

相关文章:

[Python] opencv - 什么是直方图?如何绘制图像的直方图?如何对直方图进行均匀化处理?

什么是直方图? 直方图是一种统计图,用于展示数据的分布情况。它将数据按照一定的区间或者组进行划分,然后计算在每个区间或组内的数据频数或频率(即数据出现的次数或占比),然后用矩形或者柱形图的形式将这…...

ppi rust开发 python调用

创建python的一个测试工程 python -m venv venv .\venv\Scripts\activatepip install cffi创建一个rust的lib项目 cargo new --lib pyrustlib.rs #[no_mangle] pub extern "C" fn rust_add(x: i32, y: i32) -> i32 {x y }Cargo.toml [package] name "p…...

网站后端开发 thinkphp6 入门教程合集(更新中)

thinkphp6 入门(1)--安装、路由规则、多应用模式 thinkphp6 入门(1)--安装、路由规则、多应用模式_软件工程小施同学的博客-CSDN博客 thinkphp6 入门(2)--视图、渲染html页面、赋值 thinkphp6 入门&#x…...

Web前端框架-Vue(初识)

文章目录 web前端三大主流框架**1.Angular****2.React****3.Vue**什么是Vue.js 为什么要学习流行框架框架和库和插件的区别一.简介指令v-cloakv-textv-htmlv-pre**v-once**v-onv-on事件函数中传入参数事件修饰符双向数据绑定v-model 按键修饰符自定义按键修饰符别名v-bind(属性…...

配置dns服务的正反向解析

服务端IP客户端IP网址192.168.153.137192.168.153.www.openlab.com 1:正向解析 1.1关闭客户端和服务端的安全软件,安装bind软件 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# yum install bind -y [rootnod…...

小白水平理解面试经典题目LeetCode 71. Simplify Path【Stack类】

71. 简化路径 小白渣翻译 给定一个字符串 path ,它是 Unix 风格文件系统中文件或目录的绝对路径(以斜杠 ‘/’ 开头),将其转换为简化的规范路径。 在 Unix 风格的文件系统中,句点 ‘.’ 指的是当前目录,…...

电力负荷预测 | 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM) 所谓预测,就是指通过对事物进行分析及研究,并运用合理的方法探索事物的发展变化规律,对其未来发展做出预先估计和判断。…...

YY调音台:音频后期处理

我从事影视后期处理的工作,主要负责音频、音效合成这块工作内容。在影视作品中,声音不仅仅是背景元素,它在叙事和创造情感氛围上发挥着至关重要的作用。我们的工作不仅要让听众听到声音,更要让他们通过声音感受到情感的波动和故事…...

一键部署一个监控系统hertzbeat

效果 特点 一站式监控告警通知,支持应用服务,数据库,操作系统,中间件,云原生,网络等。 易用友好,无需 Agent,全页面操作,鼠标点一点就能监控告警。 强大监控模版能力&…...

为电子表格嵌入数据库,Excel/WPS一键升级为管理系统

将Excel表格转化为管理系统,这款工具能够实现只需导入表格数据,即可自动生成相应的软件和APP。 表格办公的烦恼,有遇到吧? 对于具有一定规模的企业而言,各类表格如同繁星般众多,既有日常使用的常规表格&a…...

搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

一、DFS 往深里搜,搜到叶子结点那里,回溯,到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件(题目要求的东西) 3、每层都用循环判断是否存在可以dfs的路 输出数字…...

【开源】基于JAVA+Vue+SpringBoot的停车场收费系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…...

DDoS攻击激增,分享高效可靠的DDoS防御方案

当下DDoS攻击规模不断突破上限,形成了 "网络威胁格局中令人不安的趋势"。专业数据显示,对比2022年上半年与2023年上半年,所有行业的DDoS攻击频率增加了314%。其中零售、电信和媒体公司遭受的攻击规模最大,三个垂直行业的…...

打卡今天学习的命令 (linux

1.1 cp - 复制文件或目录 cp source destination cp -r source_directory destination # 递归复制目录及其内容1.2 rm - 删除文件或目录 rm file rm -r directory # 递归删除目录及其内容1.3 mv - 移动/重命名文件或目录 mv source destination mv old_name new_name # 重…...

[C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法

参考网上大部分方法错误&#xff0c;根本不起作用。正确方法是 C:\Users\你的用户名\AppData\Roaming\NuGet找到NuGet.Config打开&#xff0c;看到类似下面信息&#xff08;可能不一样&#xff09; <?xml version"1.0" encoding"utf-8"?> <co…...

FRP内网穿透如何避免SSH暴力破解(二)——指定地区允许访问

背景 上篇文章说到&#xff0c;出现了试图反复通过FRP的隧道&#xff0c;建立外网端口到内网服务器TCP链路的机器人&#xff0c;同时试图暴力破解ssh。这些连接造成了流量的浪费和不必要的通信开销。考虑到服务器使用者主要分布在A、B、C地区和国家&#xff0c;我打算对上一篇…...

Unity类银河恶魔城学习记录4-1,4-2 Attack Logic,Collider‘s collision excepetion源代码 P54 p55

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; u…...

各种编程语言送祝福:2024龙年大吉

我是码农一枚&#xff0c;在这里用不同编程语言中祝福大家"2024&#xff0c;龙年大吉"~ Python print("2024&#xff0c;龙年大吉")Java public class Main {public static void main(String[] args) {System.out.println("2024&#xff0c;龙年大…...

C++中用Boost::Python调用Python模块

这个过程有挺多坑&#xff0c;记录一下。我这里的环境&#xff1a; Windows 11 Qt 6.2 Boost 1.8.4 CMake 3.25.2 Visual Stutio 2019&#xff08;主要用于C编译&#xff09; 1、下载并将Boost编译为静态库 b2.exe toolsetmsvc-14.2 install --prefixboost安装路径 links…...

MySQL查询缓存

MySQL查询缓存 MySQL在查询的时候首先会查询缓存&#xff0c;如果缓存命中的话就直接返回结果&#xff0c;不需要解析sql语句&#xff0c;也不会生成执行计划&#xff0c;更不会执行&#xff1b;如果没有命中缓存&#xff0c;则再进行SQL解析以及进行查询&#xff0c;并将结果返…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...