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

news2024/11/18 11:29:52

什么是直方图?

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

什么是图像直方图?

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

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

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()

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

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

相关文章

『运维备忘录』之 TAR 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

绕过安全狗

本节我们想要绕过的安全狗版本为v4.023957 ,它是网站安全狗的Apache版。 首先搭建环境。渗透环境选用DVWA漏洞集成环境,下载地址 为http://www.dvwa.co.uk/ 。DVWA是一款集成的渗透测试演练环境,当刚刚入门 并且找不到合适的靶机时&#xff…

c++ 类,第一篇章,初始化列表 (详细)

快过年啦!雀儿在这里提前祝大家新年快乐! 初始化,就是在一个变量在创建的时候被赋值,一共有四种可能 //X是类名,a是对象名,v是初始值 X a{v}; X a1{v}; X a2v; X a3(v);一共四种写法,如上。 第…

正点原子--STM32基本定时器学习笔记(1)

目录 1. 定时器概述 1.1 软件定时原理 1.2 定时器定时原理 1.3 定时器分类 1.4 定时器特性表 1.5 基本、通用、高级定时器的功能整体区别 2. 基本定时器简介 3. 基本定时器框图 时钟树分析 这部分是笔者对基本定时器的理论知识进行学习与总结!主要记录学习…

Leaf——美团点评分布式ID生成系统

0.普通算法生成id的缺点 1.Leaf-segment数据库方案 第一种Leaf-segment方案,在使用数据库的方案上,做了如下改变: - 原方案每次获取ID都得读写一次数据库,造成数据库压力大。改为利用proxy server批量获取,每次获取一…

基于spring cloud alibaba的微服务平台架构规划

平台基础能力规划(继续完善更新…) 一、统一网关服务(独立服务) 二、统一登录鉴权系统管理(独立服务) 1.统一登录 2.统一鉴权 3.身份管理 用户管理 角色管理 业务系统和菜单管理 部门管理 岗位管理 字典管…

一步步建立一个C#项目(连续读取S7-1200PLC数据)

这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先创建一个窗体应用。 1、窗体应用 2、配置存储位置 3、选择框架 拖拽一个Button,可以选择视图菜单---工具箱 4、工具箱 拖拽Lable控件和TextBook控件 5、拖拽控件 接下来…

算法day12

算法day12 二叉树理论基础114 二叉树的前序遍历145 二叉树的后序遍历94 二叉树的中序遍历迭代法 二叉树理论基础 直接看代码随想录就完事了,之前考研也学过,大概都能理解 我这里就说说代码层面的。 二叉树的存储: 1、链式存储:这…

简单实验 spring cloud gateWay 路由实验 实验

1.概要 1.1 说明 微服务统一网关实验&#xff0c;这里简单实验一下路由的功能 1.2 实验步骤&#xff0c;使用下面这个工程作为基础工程添加了一个gateWay做如下使用 简单实践 spring cloud nacos nacos-server-2.3.0-CSDN博客 2 代码 2.1 工程文件 <?xml version&quo…

【Linux取经路】探寻shell的实现原理

文章目录 一、打印命令行提示符二、读取键盘输入的指令三、指令切割四、普通命令的执行五、内建指令执行5.1 cd指令5.2 export指令5.3 echo指令 六、结语 一、打印命令行提示符 const char* getusername() // 获取用户名 {return getenv("USER"); }const char* geth…

生成式学习,特别是生成对抗网络(GANs),存在哪些优点和缺点,在使用时需要注意哪些注意事项?

生成对抗网络&#xff08;GANs&#xff09; 1. 生成对抗网络&#xff08;GANs&#xff09;的优点&#xff1a;2. 生成对抗网络&#xff08;GANs&#xff09;的缺点&#xff1a;3. 使用生成对抗网络&#xff08;GANs&#xff09;需要注意的问题 1. 生成对抗网络&#xff08;GANs…

学生管理系统(javaSE第一阶段项目)

JavaSE第一阶段项目_学生管理系统 1.项目介绍 此项目是JavaSE第一阶段的项目,主要完成学生对象在数组中的增删改查,大家可以在此项目中发挥自己的想象力做完善,添加其他功能等操作,但是重点仍然是咱们前9个模块的知识点2.项目展示 2.1.添加功能 2.2.查看功能 2.3.修改功能 2…

第二证券:大涨5%,这一指数爆发!

A股商场今日上午进一步上行&#xff0c;各大指数持续上涨&#xff0c;其间上证指数克复2800点。小市值股票体现更佳&#xff0c;中证1000指数上午大涨5%。 港股商场方面&#xff0c;今日上午一度大幅上涨&#xff0c;后涨幅有所回落。港股百胜我国今日上午体现抢眼&#xff0c…

jvm垃圾收集器之七种武器

1.回收算法 1.1 标记-清除算法(Mark-Sweep) 分为两个阶段&#xff0c;标注和清除。标记阶段标记出所有需要回收的对象&#xff0c;清除阶段回收被标记的对象所占用的空间。 该算法最大的问题是内存碎片化严重&#xff0c;后续可能发生大对象不能找到可利用空间的问题。 1.2 …

10.0 Zookeeper 权限控制 ACL

zookeeper 的 ACL&#xff08;Access Control List&#xff0c;访问控制表&#xff09;权限在生产环境是特别重要的&#xff0c;所以本章节特别介绍一下。 ACL 权限可以针对节点设置相关读写等权限&#xff0c;保障数据安全性。 permissions 可以指定不同的权限范围及角色。 …

Topaz Photo AI for Mac v2.3.1 补丁版人工智能降噪软件无损放大

想要将模糊的图片变得更加清晰&#xff1f;不妨试试Topaz Photo AI for Mac 这款人工智能、无损放大软件。Topaz Photo AI for Mac 一款强大的人工智能降噪软件&#xff0c;允许用户使用复杂的锐化算法来提高图像清晰度&#xff0c;还包括肖像编辑选项&#xff0c;如面部重塑、…

Verilog刷题笔记20

题目&#xff1a; Case statements in Verilog are nearly equivalent to a sequence of if-elseif-else that compares one expression to a list of others. Its syntax and functionality differs from the switch statement in C. 解题&#xff1a; module top_module ( …

RabbitMQ-3.发送者的可靠性

发送者的可靠性 3.发送者的可靠性3.1.生产者重试机制3.2.生产者确认机制3.3.实现生产者确认3.3.1.开启生产者确认3.3.2.定义ReturnCallback3.3.3.定义ConfirmCallback 3.发送者的可靠性 首先&#xff0c;我们一起分析一下消息丢失的可能性有哪些。 消息从发送者发送消息&#…

新版MQL语言程序设计:键盘快捷键交易的设计与实现

文章目录 一、什么是快捷键交易二、使用快捷键交易的好处三、键盘快捷键交易程序设计思路四、键盘快捷键交易程序具体实现1.界面设计2.键盘交易事件机制的代码实现 一、什么是快捷键交易 操盘中按快捷键交易是指在股票或期货交易中&#xff0c;通过使用快捷键来进行交易操作的…