直方图均衡化原理和实现

基本思想

将原始图像的直方图分布转换为一个均匀分布的直方图,这样原图中的高频率亮度值会被展宽,而低频率亮度值则被压缩,从而达到增强图像对比度的效果。

计算过程

假设我们有一个灰度图像,其像素值范围从0到L-1(对于8位图像,L=256)。直方图均衡化的计算步骤如下:

  1. 计算原始直方图:对于灰度级i,计算图像中灰度级为i的像素数目,记为h(i)。
  2. 计算累积分布函数(CDF):累积分布函数是直方图的一个累积和,对于灰度级i,CDF计算如下:

在这里插入图片描述

  1. 归一化CDF:将CDF的值归一化到0到L-1的范围内。这可以通过以下公式完成:

在这里插入图片描述

  1. 应用均衡化映射:最后,对每个像素,使用归一化的CDF值来替换原始图像中的灰度值,这样就得到了均衡化后的图像。

例子

假设图像的像素值如下:

1, 3, 0, 2, 1, 3, 3, 2
  1. 首先,计算这个图像的直方图。
灰度级: 0  1  2  3
数量:   1  2  2  3
  1. 计算累积分布函数(CDF)

CDF对于每个灰度级i,累积从0到i的像素数量。因此,对于我们的例子:

灰度级:  0  1  2  3
CDF:    1  3  5  8
  1. 归一化CDF

将CDF归一化到0到255的范围(对于8位图像)。归一化的公式是:
对于我们的例子,M ×N = 8(图像的像素总数),CDF_{min} = 1(CDF中的最小值),L = 4(灰度级总数)。因此,归一化CDF为:

灰度级:    0   1   2   3
归一化CDF: 0  85 170 255
  1. 应用均衡化映射

最后,根据归一化的CDF来更新图像的像素值。每个原始像素值i都被映射为归一化CDF中的相应值。因此,原图像像素值转换后为:

原始图像:   1    3   0   2    1   3    3    2
均衡化后:   85  255  0  170  85  255  255  170

由于简化了范围,实际应用中,这些新的像素值将会根据实际情况进行调整,以匹配原图像的灰度级范围。在现实操作中,直方图均衡化后的图像将展现更好的对比度和亮度分布。

实现1-只针对灰度图像

// 直方图均衡化
void QuickDemo::histogram_eq_demo(Mat &image) {Mat gray, dst;cvtColor(image, gray, COLOR_BGR2GRAY);equalizeHist(gray, dst);imshow("Raw gray", gray);imshow("EqualizeHist", dst);
}

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

并发编程,java实现连接池功能

1、并发编程 并发带来的问题:类中的属性值被不同的线程并发修改,而属性值的修改常常是在方法中去修改的,所以最终要解决方法被不同的线程并发执行。 并发编程的目标:同一个方法或者不同的方法,不能在不同的线程同时执…

计算机网络面经八股-HTTP请求报文和响应报文的格式?

请求报文格式: 请求行(请求方法URI协议版本)请求头部空行请求主体 请求行:GET /sample.jsp HTTP/1.1 表示使用 GET 方法请求 /sample.jsp 资源,并使用 HTTP/1.1 协议。请求头部:包含多个字段,…

Naive UI框架安装和引入使用

Naive UI介绍: 一个 Vue 3 组件库比较完整,主题可调,使用 TypeScript,注意,naive-ui 仅支持 Vue3。 1、 安装 naiva ui // 使用 npm 安装。npm i -D naive-ui 字体安 npm i -D vfonts 2、使用 直接引入&#xff…

达梦8数据库下载安装教程(windows)

写作不易,欢迎点赞~ 这里多说一嘴,如果想从Oracle把数据迁移到达梦数据库可参考我这篇文章:https://blog.csdn.net/li836779537/article/details/136642028?spm1001.2014.3001.5502 达梦8安装包(windows) 链接&…

美国洛杉矶云服务器的亮点优势

随着云计算技术的快速发展,云服务器已成为企业、个人用户追求高效、稳定、安全数据存储和运算的重要选择。在众多云服务器中,美国洛杉矶云服务器以其独特的优势脱颖而出,受到越来越多用户的青睐。本文将为您科普美国洛杉矶云服务器的亮点优势…

C++提高笔记(三)---STL容器(vector、deque)

1、vector容器 1.1vector基本概念 功能:vector数据结构和数组非常相似,也称为单端数组 vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展:并不是在原空间之后续接新空间&#xff0…

【PHP + 代码审计】文件包含

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

应对恶意IP攻击的有效方法

在当今数字化时代,网络攻击已经成为了互联网安全的重大挑战之一。恶意IP攻击是网络安全领域中的一种常见威胁,它可能导致数据泄露、服务中断、系统瘫痪等严重后果。因此,有效地应对恶意IP攻击至关重要。IP数据云将深入探讨如何应对恶意IP攻击…

精酿啤酒与日式料理的精致体验

当Fendi Club啤酒遇见日式料理,一场味蕾的精致盛宴就此展开。Fendi Club啤酒以其醇厚的口感和与众不同的麦香,为日式料理增添了别样的风味,而日式料理则以其精致的制作和丰富的口感,为啤酒带来了更多的层次感。 Fendi Club啤酒&am…

【论文笔记合集】ARIMA 非平稳过程通过差分转化为平稳过程

本文作者: slience_me 文章目录 ARIMA 非平稳过程通过差分转化为平稳过程文章原文具体解释详解 ARIMA 非平稳过程通过差分转化为平稳过程 文章原文 Many time series forecasting methods start from the classic tools [38, 10]. ARIMA [7, 6] tackles the foreca…

芯片公司SAP具体操作流程:从设计到生产的科技之旅

芯片公司作为现代科技产业的重要支柱,其运作涉及多个复杂环节。SAP作为一套企业资源计划系统,为芯片公司提供了从产品设计到生产制造的全方位管理支持。下面,我们就来详细科普一下芯片公司在SAP中的具体操作流程。 首先,芯片公司需…

阿里云服务器安全狗免费使用多引擎智能查杀引擎

云服务器具有按量付费、降低综合成本等诸多优势,受到很多企业的欢迎。 因此,目前使用的云服务器越来越多。 阿里云是目前云服务器中最具影响力的品牌,因此选择阿里云服务器的用户数量也是最多的。 那么阿里云服务器需要安装杀毒软件吗&#x…

CentOS 7安装MySQL及初始化操作教程

一、引言 MySQL是一款广泛使用的开源关系型数据库管理系统,适用于各种规模的应用场景。在CentOS 7系统中安装MySQL并进行初始化操作,可以为我们的应用程序提供稳定、可靠的数据存储服务。本文将详细介绍CentOS 7安装MySQL及初始化操作的步骤。 目录 一、…

C#使用SharpZipLib对文件进行压缩和解压

C#使用SharpZipLib对文件进行压缩和解压 使用SharpZipLib库 编写SharpZipLibHelper帮助类 using ICSharpCode.SharpZipLib.Zip;namespace SharpZipLib_Project {public class SharpZipLibHelper{/// <summary>/// 多个文件或文件夹压缩/// </summary>/// <pa…

序列化Serializable/Parcelable

定义 将一个对象转换成可存储或可传输的状态。&#xff08;对象转换成字节流的过程&#xff09; 作用 对象序列化后&#xff0c;可以在进程间、网络间进行传输&#xff0c;也可以做本地持久化存储 为什么要序列化 对于计算机来说&#xff0c;不认识对象只认识二进制。数据…

vue父子组件生命周期

父子组件的生命周期是一个嵌套的过程 渲染的过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted 子组件更新过程 父beforeUpdate->子beforeUpdate->子updated->父updated 父组件更…

行业认可 | 海云安上榜《2024年网络与信息安全行业全景图》多个领域

近日&#xff0c;深圳市网络与信息安全行业协会正式发布《2024年网络与信息安全行业全景图》。海云安凭借过硬的技术实力及成熟的网络与信息安全产品及服务获得行业认可&#xff0c;入围6大类目共计17项细分领域。包括&#xff1a; 业务安全&#xff08;软硬件开发安全、人工智…

MFC中字符串string类型和CString类型互转方法

在Microsoft Foundation Classes (MFC)中&#xff0c;CString是一个非常方便的类&#xff0c;用于处理C风格的字符串。有时&#xff0c;你可能需要在MFC的CString和C标准库中的std::string之间进行转换。下面是如何在两者之间进行转换的方法&#xff1a; CString转std::string…

C++向函数传递函数

函数指针的定义格式为&#xff1a; <函数返回类型> (*指针变量)(<函数形参列表>) 例如&#xff1a; 下面定义了一个函数指针变量fp: double (*fp)(int);这意味着fp可以指向返回类型为double,参数类型为int的任何函数 比如&#xff1a; double func(int x){...}获…

如何配置Log4j以便将日志信息输出到文件,并指定日志文件的格式?请解释Log4j中的PatternLayout,并给出一个常用的日志格式模式。

如何配置Log4j以便将日志信息输出到文件&#xff0c;并指定日志文件的格式&#xff1f; 配置Log4j以将日志信息输出到文件并指定日志文件的格式&#xff0c;通常涉及创建一个配置文件&#xff08;如log4j.properties或log4j2.xml&#xff09;&#xff0c;其中定义了Log4j的行为…