OpenCv高阶(三)——图像的直方图、图像直方图的均衡化

目录

一、直方图

 1、计算并显示直方图

2、使用matplotlib方法绘制直方图(不划分小的子区间)

3、使用opencv的方法绘制直方图 (划分16个小的子亮度区间)

4、绘制彩色图像的直方图,将各个通道的直方图值都画出来

二、直方图均衡化

(1)绘制原图的直方图

 (2)绘制经过直方图均衡化后的图片的直方图

(3)自适应直方图均衡化(局部直方图处理)

三、直方图均衡化的应用

1. 增强图像对比度

2. 提升图像视觉效果

3. 统一图像灰度分布

4. 适用于低对比度图像

总结


一、直方图

直方图:是图像中像素强度分布的图形表达方式,统计各个强度像素值的个数。

直方图的作用:例如视频中。通过标记帧和帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变换。

灰度值在0 - 255范围之间总共 256 个值,可以将我们的范围划分为子部分(称为bins),例如我们可以将这些像素亮度值划分为16个区间值,【0,15】、【16,31】,这两个就是两个亮度区间,它表示会统计亮度值在0到15的所有像素点的个数。

 1、计算并显示直方图

cv2.calcHist(images,channels,mask,histSize,ranges)  计算图像的直方图,用于表示图像中像素灰度级别的分布情况.
images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]

channels: 表示传入的图像通道数。如果输入图像是灰度图它的值就是 [0]。
          如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。

mask: 掩模图像。统计整幅图像的直方图就把它为None。但是如果你想统计图像某一部分的直方图,你就制作一个掩模图像并使用它。

histSize:BINS的数目。也需用中括号括来   (分成多少个区间)
  BINS :上面的直方图显示了每个像素值的像素数,即从0到255。即您需要256个值才能显示上述直方图。
      但是请考虑一下,如果您不需要单独查找所有像素值的像素数,而是在像素值间隔内查找像素数,
      例如,您需要找到介于 0 到 15 之间的像素数,然后是 16 到 31、32到47...、240 到 255。
      您只需要 16 个值来表示直方图。
因此,只需将整个直方图拆分为 16 个子部分,每个子部分的值就是其中所有像素计数的总和。
这每个子部分都称为"BIN"。在第一种情况下,条柱数为256(每个像素一个),而在第二种情况下,它只有16。BINS 在 OpenCV 文档中由术语histSize表示。

ranges: 像素值范围常为 [0 256]

2、使用matplotlib方法绘制直方图(不划分小的子区间)

 这里使用了 numpy 的 ravel 函数,将多维数组拉成一维数组。

img =cv2.imread('../data/310.jpg',cv2.IMREAD_GRAYSCALE)# 转成一维
a=img.ravel()# 使用 matplotlib 的 hist 函数绘制直方图。
plt.hist(a,bins=256)
plt.show()# 参数解释:
# - a:一维数组,即图像的像素值组成的数组。
# - bins=256:指定直方图的条数,即灰度级的数量。

效果:可以看出下面结果中有0~256的亮度值的统计情况 

 

3、使用opencv的方法绘制直方图 (划分16个小的子亮度区间)

#这里的calcHist参数在上面有介绍,这里是对img图片做直方图统计,采用灰度图,即零通道,未设置掩膜,划分为16个区间,亮度值统计[0,256]的值
phone_hist = cv2.calcHist([img],[0],None,[16],[0,256])
plt.plot(phone_hist)#使用calcHist的值绘制曲线图
plt.show()

效果,统计的值为每个亮度区间内属于该亮度值的像素点个数

4、绘制彩色图像的直方图,将各个通道的直方图值都画出来

img=cv2.imread('zl.jpg')
color=('b','g','r')    #设置绘制的折线图每条线的颜色
for i,col in enumerate(color):    #依次遍历三个颜色通道histr=cv2.calcHist([img],[i],None,[256],[0,256])    #依次计算每个通道的直方图值plt.plot(histr,color=col)    #绘制折线图
plt.show()

效果:分别统计了不同颜色通道下的直方图

二、直方图均衡化

直方图均衡化:直方图均衡化是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。直方图均衡化通过将图像的像素值分布均匀化来实现这一目标。
在Python OpenCV中,可以使用cv2.equalizeHist()函数来实现直方图均衡化。该函数将输入图像转换为灰度图像,并将其像素值分布均匀化,从而增强图像的对比度和亮度。下面是将不均衡的直方图均衡化之后的结果。

(1)绘制原图的直方图

woman = cv2.imread('ja.jpg',cv2.IMREAD_GRAYSCALE)
# # # phone_hist = cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(woman.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()

 可以看出图像的亮度值集中在50左右

 

 (2)绘制经过直方图均衡化后的图片的直方图

phone_equalize = cv2.equalizeHist(woman)
plt.hist(phone_equalize.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()

与原图对比,直方图均衡化是对全局做均衡化,这使亮度值很大的像素点增多了,表现在图像上就是图像整体变亮。 

 

(3)自适应直方图均衡化(局部直方图处理)

普通直方图均衡化(HE)通过全局灰度变换增强对比度,但对噪声敏感且可能过度放大局部噪声(如暗部噪声)。自适应直方图均衡化(AHE) 将图像划分为多个子块(tiles),对每个子块独立进行直方图均衡化,从而实现局部对比度增强,避免全局均衡化的缺陷。

改进版:限制对比度的自适应直方图均衡化(CLAHE, Contrast-Limited AHE):在 AHE 基础上,通过设定灰度值裁剪阈值(clip limit),防止子块内噪声或纹理被过度增强,是实际应用中更常用的方法。

主要优点

  • 局部对比度增强:针对不同区域的局部特征调整对比度,适合光照不均或局部细节丰富的图像(如医学影像、卫星图像)。
  • 抑制噪声放大:通过裁剪阈值(clip limit)限制子块内直方图的峰值,避免噪声或纹理被过度增强。
  • 保留细节与自然感:相比全局均衡化,CLAHE 在增强局部细节的同时,减少过增强导致的伪影(如棋盘效应)。

函数:cv2.createCLAHE([, clipLimit[, tileGridSize]]) 

参数说明:
clipLimit:设定子块内直方图均衡化时的灰度值裁剪阈值,单位为 “像素数 / 面积”(即每个灰度级允许的最大像素数密度)。可选项,默认值 8
titleGridSize:设定子块的大小(行数 × 列数),单位为像素。可选项,默认值 (8,8)。
  • titleGridSize取值影响
    • 较小尺寸(如 4x4):局部细节增强更精细,但计算量增加,可能引入棋盘效应(需通过插值缓解)。
    • 较大尺寸(如 16x16):局部处理更粗糙,适合全局对比度增强需求,减少分块边界的影响。

创建一个自适应直方图对像,并将上面的woman这张图像传入

clahe = cv2.createCLAHE(clipLimit=1, tileGridSize=(16,16))#通过类创建了一个局部均衡化对象
phone_clahe = clahe.apply(woman)
plt.hist(phone_clahe.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()

自适应直方图均衡化则是划分子块均衡化会减少分块边界的影响。 

 使用hstack()函数水平堆叠上面的三张图片用于对比,直方图均衡化与自适应直方图均衡化的区别

  • hstackhconcat):水平堆叠,沿列方向扩展。
  • vstackvconcat):垂直堆叠,沿行方向扩展(对应函数为 np.vstack 和 cv2.vconcat)。
res = np.hstack((woman,phone_equalize,phone_clahe))
cv2.imshow('phone_equalize',res)
cv2.waitKey(0)

 从左到右依次是原图、直方图均衡化、自适应直方图均衡化

三、直方图均衡化的应用

1. 增强图像对比度

  • 原理:将图像中原本集中的灰度范围 “拉伸” 到更宽的动态范围,使图像中不同灰度级的像素分布更均匀(直方图趋于平坦)。
  • 效果:让原本对比度低、细节模糊的图像(如暗部过暗或亮部过亮)变得更清晰,暗部和亮部的细节更容易分辨。
  • 示例:在医学影像(如 X 光片)中,均衡化可增强组织间的对比度,便于医生观察病灶。

2. 提升图像视觉效果

  • 通过均衡化,图像中原本难以区分的灰度区域(如相近的明暗过渡)会变得层次分明,整体视觉效果更自然。
  • 例如:修复老照片时,均衡化可改善因曝光不足或过度导致的细节丢失。

3. 统一图像灰度分布

  • 将图像的灰度直方图调整为近似均匀分布,使像素灰度值覆盖更广泛的范围。
  • 这为后续的图像处理任务(如图像分割、特征提取、模式识别等)提供更优质的输入,提升算法效果。

4. 适用于低对比度图像

  • 特别适合处理因光照不均、传感器噪声等导致对比度低下的图像(如阴天拍摄的照片、卫星遥感图像),通过均衡化恢复图像细节。

总结

直方图均衡化通过重新分配像素的灰度值,将图像的动态范围最大化利用,使图像从 “对比度不足” 转变为 “层次丰富”,是图像处理中基础且高效的增强手段。其本质是通过数学变换(累积分布函数,CDF)实现灰度的非线性映射,从而优化视觉效果和后续处理的可行性。

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

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

相关文章

Flutter 与原生通信

Flutter 与原生之间的通信主要基于通道机制,包括 MethodChannel、EventChannel 和 BasicMessageChannel。 MethodChannel:用于 Flutter 与原生之间的方法调用,实现双向通信,适合一次性的方法调用并获取返回值,如 Flut…

前端面试-Vue篇

核心概念 Vue 3的响应式原理与Vue 2有何本质区别?Vue中虚拟DOM的diff算法优化策略有哪些?Vue组件间通信方式有哪些?适用场景分别是什么?Vue的生命周期钩子在Composition API中如何替代?Vue的模板编译过程是怎样的&…

光刻机研发与市场现状分析报告

1. 引言 光刻机(Lithography Machine)是半导体制造的核心设备,其技术水平和市场供应能力直接影响全球芯片产业的发展。随着人工智能(AI)、5G、高性能计算(HPC)和自动驾驶等技术的兴起&#xff0…

Missashe考研日记-day21

Missashe考研日记-day21 1 专业课408 学习时间:4h学习内容: 今天先把昨天学的内容的课后习题做了,整整75道啊,然后学了OS第二章关于CPU调度部分的内容,这第二章太重要了,以至于每一小节的内容都比较多&am…

【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复

技术栈:vue3 element-plus axios pinia router Django5 websocket 讯飞星火API 本文将实现一个 AI 聊天对话功能,将前端用户输入问题以及之前对话发送给后端,通过 api 访问大模型,返回前端实时对话数据。 调用 讯飞星火API…

广东广州一家IPO资产重组疑点重重,信息披露真实性存疑

作者:Eric 来源:IPO魔女 4月18日,广州瑞立科密汽车电子股份有限公司(简称“瑞立科密”)将接受深交所主板IPO上会审核。公司保荐机构为中信证券,拟募集资金为15.2162亿元。 瑞立科密过往资产重组疑点重重&a…

银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本

银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本 原因 测试Kylin-Desktop-V10-SP1-General-Release-2303-arm64系统下,编译QT-5.15.12版本已做测试。 测试环境 测试板配置 型号:LM-D2000-NONE-1w-V01-pc_A2150 CPU:飞腾D20…

查看前端项目依赖树型结构关系图的详细方法,涵盖 命令行工具 和 可视化工

以下是查看前端项目依赖树型结构关系图的详细方法&#xff0c;涵盖 命令行工具 和 可视化工具&#xff1a; 一、命令行工具生成依赖树 1. npm # 查看项目依赖树&#xff08;文本形式&#xff09; npm ls# 查看指定包的依赖树 npm ls <package-name># 生成JSON格式的依…

Ollama高并发测试

本文主要来测试一下ollama的高并发能力。 具体配置如下&#xff1a; 一、Ollama默认参数执行 我们打开4个窗口&#xff0c;然后分别让DeepSeek “给我讲一个笑话” &#xff0c;看下不同窗口的答题顺序。 通过答题顺序可以看到&#xff0c;在不进行参数设置时&#xff0c;模…

资源管理与HPA:让Kubernetes应用自动伸缩

引言&#xff1a;从“手动挡”到“自动驾驶” 想象我们驾驶一辆汽车&#xff0c;手动调节油门和换挡不仅费力&#xff0c;还难以应对突发状况。我们的应用服务也一样&#xff0c;在面对突然的流量增长&#xff0c;内存使用暴涨该如何应对。HPA&#xff08;Horizontal Pod Auto…

Windows 下 MongoDB ZIP 版本安装指南

在开发和生产环境中&#xff0c;MongoDB 是一种非常流行的 NoSQL 数据库&#xff0c;以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说&#xff0c;MongoDB 提供了多种安装方式&#xff0c;其中 ZIP 版本因其灵活性和轻量级的特点&#xff0c;成为很多开发者的首选…

【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议

前面在介绍网络层时我们提出来过一个问题&#xff1a;主机是怎么把数据交给路由器的&#xff1f;那里我们说这是由数据链路层来做的。 网络上的报文在物理结构上是以mac帧的形式流动的&#xff0c;但在逻辑上是以IP流动的&#xff0c;IP的流动是需要mac帧支持的。 数据链路层解…

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案 医疗AI领域的多模态思维链技术正在重塑临床决策支持、医学影像分析和医疗流程优化的范式。本指南从计算可持续性、错误传播控制、伦理安全防护和通用性扩展四大维度,系统解析医疗大模型落地落地的关键要…

代理模式深度解析

目录 一 静态代理 1.1 优点 1.2 缺点 1.3 适用场景 二 JDK动态代理 1 JDK动态代理的工作原理 1.1 创建代理类 1.2 加载代理类 1.3 实现方法调用 2. Proxy.newProxyInstance() 的核心工作流程 方法签名 工作步骤 3. 代理类的生成与加载 3.1 代理类生成的关键方法 …

Spring Cache与Redis集成原理

一、核心架构图解 #mermaid-svg-aiWGQLhmWx7kOfLz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-icon{fill:#552222;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-text{fill:#552222;stroke:#5…

编程技能:调试02,设置断点与删除断点

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;调试01&#xff0c;调试介绍 回到目录 下…

flink写doris时的优化

1.概念 doris并不擅长高频、小量数据的导入&#xff1b; 因为doris每一次数据导入都会在be节点上生成数据文件&#xff1b;如果高频导入小量数据&#xff0c;就会在存储层产生大量的小文件&#xff08;必然会影响到后续的查询效率&#xff0c;也会对系统产生更多的compaction…

ElementNotInteractableException原因及解决办法

在自动化测试中,ElementNotInteractableException是一个常见的异常,它通常发生在尝试与网页上的某个元素进行交互(例如点击、输入等操作)时,但由于该元素当前不可交互。这可能由多种原因引起,以下是一些常见的原因及其解决方法: 元素未完全加载 如果尝试与页面上的元素交…

如何从 GitHub 镜像仓库到极狐GitLab?

最近 GitHub 封禁中国用户的事情闹得沸沸扬扬,虽然官方发布的报道说中国用户被限制登录是因为配置错误导致,已经撤回了更新,中国用户已经可以正常使用。但是这就像横在国内开发者和企业头上的“达摩克利斯之剑”。为了避免 GitHub 不可用而带来的影响,国内开发者和企业可以…

服务器安装nacos

1.下载依赖 docker pull nacos/nacos-server:v2.4.3安装 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone nacos/nacos-server:v2.4.3把nacos中的data 文件和conf 文件copy到自己服务的文件夹 docker cp nacos-server:/home/nacos/data /home/admin1/…