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

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

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

相关文章

C++学习Day03之构造函数和析构函数

目录 一、程序及输出1.1 构造函数1.2 析构函数1.3 构造和析构必须要声明在全局作用域 二、分析与总结 一、程序及输出 1.1 构造函数 构造函数 没有返回值 不用写void 函数名 与 类名相同 可以有参数 ,可以发生重载 构造函数 由编译器自动调用一次 无须手动调用 创建…

C语言——Q/编译和链接

目录 一、翻译环境和运⾏环境 二、翻译环境 1、预处理(预编译) 2、编译 2.2.1 词法分析: 2.2.2 语法分析 2.2.3 语义分析 3、汇编 4、链接 三、运行环境 一、翻译环境和运行环境 在ANSI C 的任何⼀种实现中,存在两个不…

CentOS7局域网内搭建本地yum源

CentOS7.6 局域网内搭建本地yum源 一、背景 客户机房服务器无法直连公网,远程通过堡垒机部署环境,因为机器比较多,最终选择通过安装自定义yum源进行部署。以下为自己部署yum源过程,以备后续使用。 二、准备yum源Packages 网上…

【刷题题解】最长回文子序列

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列 这道题,一眼动态规划,但是即使动起来也规划…

python_蓝桥杯刷题记录_笔记_全AC代码_入门3

前言 记录我的解法以及笔记思路,谢谢观看。 题单目录 1.P2141 [NOIP2014 普及组] 珠心算测验 2.P1567 统计天数 3.P1055 [NOIP2008 普及组] ISBN 号码 4.P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here 5.P1308 [NOIP2011 普及组] 统计单词数 6.P1047 […

深度学习之循环神经网络进阶

这一讲我们学习如何实现一个循环神经网络的分类器: 我们要解决的问题是名字分类,我们根据名字找到其对应的国家。 上一讲我们介绍了循环神经网络。 我们在处理自然语言的时候我们通常是以上这种方式,我们在处理单词的时候,通常…

一文彻底搞懂MySQL基础:B树和B+树的区别(简洁版)

文章目录 1. 节点结构2. 插入和删除3. 查询4. 性能5. 适用场景6.关于 B树和 B树的常见问题6.1. B树和B树的区别是什么?6.2. 什么情况下应该使用 B树?6.3. 什么情况下应该使用 B树? B树和B树都是多路搜索树,它们都用于数据库索引中…

命令注入漏洞原理以及修复方法

漏洞名称 :命令注入 漏洞描述:Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤 不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利…

一文讲明Jetpack中的图片组件

Jetpack Compose系列(5) - 图片组件 Jetpack Compose中的常用图片组件有两个:Icon和Image。从命名上就不难看出这两个组件在内容呈现上就是负责图形和图片相关。 需要说明的是,Compose获取资源方式有四种: 文本 -> stringResource(R.s…

比特币ETF广告战大爆发!

作者:秦晋 贝莱德主动发起广告攻势。 2月1日,据外媒Cryptoslate报道,贝莱德在提交给美国SEC的一份文件中显示,其提出一项在建筑物侧面投影比特币ETF广告计划。 据介绍,广告内容为:「IBIT」信号是一个以迈阿…

【Qt+MSVC2017_64bit +Cmake新建项目编译出错】

项目场景: 提示:这里简述项目相关背景: 项目新电脑环境配置 QtMSVC2017_64bit Cmake新建项目编译出错 问题描述 提示:这里描述项目中遇到的问题: QtMSVC2017_64bit Cmake新建项目编译出错 Running C:\Program Fil…

【数据分享】1米分辨率土地覆盖数据集SinoLC-1

数据链接 SinoLC-1: the first 1-meter resolution national-scale land-cover map of China created with the deep learning framework and open-access data (Update data: August, 2023) (zenodo.org)https://zenodo.org/records/8214467 数据分享 数据分享到了公众号&…

Android studio改代码运行不生效

Android studio改代码后运行不生效,尝试卸载apk后,运行能生效,后面尝试手动通过adb命令安装生成的apk能生效。 studio 版本 解决方案: 在File->Settings->Build, Execution, Deployment,找到Android Configura…

BFS——双向广搜+A—star

有时候从一个点能扩展出来的情况很多,这样几层之后搜索空间就很大了,我们采用从两端同时进行搜索的策略,压缩搜索空间。 190. 字串变换(190. 字串变换 - AcWing题库) 思路:这题因为变化规则很多,所以我们一层一层往外…

golang开源的可嵌入应用程序高性能的MQTT服务

golang开源的可嵌入应用程序高性能的MQTT服务 什么是MQTT? MQTT(Message Queuing Telemetry Transport)是一种轻量级的、开放的消息传输协议,设计用于在低带宽、高延迟或不可靠的网络环境中进行通信。MQTT最初由IBM开发&#xf…

canvas设置图形各种混合模式,类似photoshop效果

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

一看就会《幻兽帕鲁》服务器自建指南

玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

jmeter设置定时器

前言 本文主要分享两种定时器(同步定时器、固定定时器)的用法,从作用,设置方法以及实例演示几个方面讲解,结尾还有小知识哦!一起开始学习吧! 一、同步定时器(集合点) …

[leetcode] 22. 括号生成

文章目录 题目描述解题方法方法一:dfs遍历java代码 方法二:按照卡特兰数的思路递归求出有效括号组合java代码 相似题目 题目描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示…