【图像处理】直方图均衡化c++实现

直方图均衡化是一种通过调整图像像素灰度值分布,来增强图像对比度的经典数字图像处理技术。其核心在于将原始图像的灰度直方图从集中的某个区间“拉伸”或“均衡”到更广泛的区间,让图像的明暗细节更清晰关键在于利用累积分布函数实现灰度值的映射

为什么需要直方图均衡化?

原始图像可能因光照不足、设备限制等原因,灰度值集中在狭窄区间,导致对比度低——比如过暗的图像灰度集中在低亮度区域,过亮的则集中在高亮度区域,细节被掩盖。
直方图均衡化的目标就是打破这种集中分布,让灰度值在整个0~255(8位图像)区间内更均匀地分布,从而使暗部更暗、亮部更亮,凸显细节

请添加图片描述请添加图片描述

直方图均衡化的核心原理是什么?

  1. 灰度直方图:统计图像中每个灰度值(0~255)出现的像素数量,横轴为灰度值,纵轴为像素数,反映灰度分布特征。
  2. 累积分布函数(CDF):计算灰度值从0到当前值的像素数量累计占比,公式为:
    CDF(k)=∑i=0kniN CDF(k) = \sum_{i=0}^{k} \frac{n_i}{N} CDF(k)=i=0kNni
    其中,nin_ini是灰度值iii的像素数,NNN是图像总像素数,CDF(k)CDF(k)CDF(k)表示灰度≤kkk的像素占比(0~1之间)。
  3. 灰度映射:将原始灰度值kkk通过CDF映射到新的灰度值k′k'k,公式为:
    k′=round[(L−1)×CDF(k)] k' = \text{round}[(L-1) \times CDF(k)] k=round[(L1)×CDF(k)]
    其中,L=256L=256L=256(8位图像),round为四舍五入。通过此映射,原始集中的灰度会被“拉伸”到更宽的范围。
    在这里插入图片描述
    在这里插入图片描述

直方图均衡化的步骤(以8位图像为例)

步骤具体操作
1. 计算原始直方图统计每个灰度值(0~255)的像素数量nin_ini
2. 计算累积分布函数(CDF)按公式计算CDF(k)CDF(k)CDF(k),得到每个灰度值对应的累计占比
3. 灰度值映射k′=(255×CDF(k))k' = (255 \times CDF(k))k=(255×CDF(k))四舍五入,得到新灰度值
4. 生成均衡化图像将原始图像中每个像素的灰度值替换为映射后的k′k'k

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

直方图均衡化的效果与局限

  • 优势

    • 无需人工干预,自动增强对比度适合光照不均、细节模糊的图像(如医学影像、监控图像)。
    • 计算简单,可实时处理
  • 局限

    • 可能过度增强噪声:如果原始图像中某一灰度区间像素少但含噪声,均衡化后噪声会被放大。
    • 对自然图像可能失真:过度均衡化会让图像显得“不自然”,比如人脸可能失去肤色质感。
    • 全局均衡化:对明暗差异大的图像(如逆光场景)效果有限,因为它对整幅图像用同一映射规则,可能导致亮部过曝或暗部丢失。

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

改进方法:局部直方图均衡化

为解决全局均衡化的局限,局部直方图均衡化(如CLAHE,限制对比度自适应直方图均衡化)应运而生:

  • 将图像分成多个小区域(称为“块”),对每个块单独做均衡化,再通过插值拼接,避免全局映射的弊端。
  • 加入对比度限制:当某块的CDF增长过快(可能因噪声或局部过亮),限制其最大斜率,防止噪声放大。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6d23b2c2aca747b184fe6c6c9694d8d6.png

在这里插入图片描述

在这里插入图片描述

CLAHE代码实现

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>using namespace cv;
using namespace std;// 优化的CLAHE均衡化
Mat applyCLAHE(const Mat& src) {Mat ycrcb;cvtColor(src, ycrcb, COLOR_BGR2YCrCb);  // 转换到YCrCb颜色空间vector<Mat> channels;split(ycrcb, channels);  // 分离通道,[0]为亮度通道Y// 关键参数优化:// clipLimit=3.0:控制对比度增强程度,平衡增强效果与噪声放大// tileSize=8x8:较小的块尺寸减少块效应,同时保持局部对比度Ptr<CLAHE> clahe = createCLAHE(3.0, Size(8, 8));clahe->apply(channels[0], channels[0]);  // 仅对亮度通道应用CLAHEmerge(channels, ycrcb);  // 合并通道cvtColor(ycrcb, ycrcb, COLOR_YCrCb2BGR);  // 转换回BGR颜色空间return ycrcb;
}int main(int argc, char**argv) {// 检查输入参数if (argc < 2) {cout << "用法: " << argv[0] << " 图像路径 [输出文件名]" << endl;return -1;}// 读取图像Mat image = imread(argv[1]);if (image.empty()) {cout << "无法读取图像: " << argv[1] << endl;return -1;}// 应用优化的CLAHE均衡化Mat clahe_result = applyCLAHE(image);// 显示结果namedWindow("原始图像", WINDOW_NORMAL);namedWindow("优化的CLAHE均衡化", WINDOW_NORMAL);imshow("原始图像", image);imshow("优化的CLAHE均衡化", clahe_result);// 保存结果string output_filename = (argc > 2) ? argv[2] : "clahe_result.jpg";imwrite(output_filename, clahe_result);cout << "处理结果已保存至: " << output_filename << endl;waitKey(0);destroyAllWindows();return 0;
}

实际应用场景

  • 医学影像:增强X光、CT图像中的病灶细节。
  • 监控安防:在低光环境下让人脸、车牌更清晰。
  • 遥感图像:突出地表纹理(如植被、水体的边界)。
    在这里插入图片描述
    在这里插入图片描述

总结

直方图均衡化通过灰度映射实现对比度增强,核心是利用累积分布函数打破灰度集中分布。它操作简单、效果直观,但存在过度增强噪声和全局适配性差的问题。实际应用中,常结合局部均衡化(如CLAHE)优化效果,是图像处理中提升图像质量的基础工具。

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

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

相关文章

Web前端实战:Vue工程化+ElementPlus

1.Vue工程化 1.1介绍 模块化&#xff1a;将js和css等&#xff0c;做成一个个可复用模块组件化&#xff1a;我们将UI组件&#xff0c;css样式&#xff0c;js行为封装成一个个的组件&#xff0c;便于管理规范化&#xff1a;我们提供一套标准的规范的目录接口和编码规范&#xff0…

ECMAScript2021(ES12)新特性

概述 ECMAScript2021于2021年6月正式发布&#xff0c; 本文会介绍ECMAScript2021(ES12)&#xff0c;即ECMAScript的第12个版本的新特性。 以下摘自官网&#xff1a;ecma-262 ECMAScript 2021, the 12th edition, introduced the replaceAll method for Strings; Promise.any,…

Tlias 案例-整体布局(前端)

开发流程前端开发和后端开发是一样的&#xff0c;都需要阅读接口文档。 准备工作&#xff1a; 1&#xff1a;导入项目中准备的基础过程到 VsCode。2&#xff1a;启动前端项目&#xff0c;访问该项目3&#xff1a;熟悉一下基本的布局<script setup></script><tem…

三十二、【Linux网站服务器】搭建httpd服务器演示虚拟主机配置、网页重定向功能

httpd服务器功能演示一、虚拟主机配置虚拟主机技术全景虚拟主机目录规范1. 基于端口的虚拟主机&#xff08;8080/8081&#xff09;2. 基于IP的虚拟主机&#xff08;192.168.1.100/192.168.1.101&#xff09;3. 基于域名的虚拟主机&#xff08;site1.com/site2.com&#xff09;二…

串行化:MYSQL事务隔离级别中的终极防护

在现代应用程序中&#xff0c;数据的一致性和可靠性至关重要。想象一下&#xff0c;如果在一个银行系统中&#xff0c;两个用户同时试图转账到同一个账户&#xff0c;最终的数据结果可能会出乎意料。为了避免这种情况&#xff0c;MYSQL提供了不同的事务隔离级别&#xff0c;其中…

RAG:检索增强生成的范式演进、技术突破与前沿挑战

1 核心定义与原始论文 RAG&#xff08;Retrieval-Augmented Generation&#xff09;由Facebook AI Research团队于2020年提出&#xff0c;核心思想是将参数化记忆&#xff08;预训练语言模型&#xff09;与非参数化记忆&#xff08;外部知识库检索&#xff09;结合&#xff0c…

2024年蓝桥杯Scratch10月图形化stema选拔赛真题——旋转的图形

旋转的图形编程实现旋转的图形。具体要求1&#xff09;点击绿旗&#xff0c;在舞台上出现滑杆形式的变量 r&#xff0c;取值范围为-1、0、1&#xff0c;默认值为 0&#xff0c;如图所示&#xff1b;2&#xff09;1秒后&#xff0c;在舞台上绘制出一个红色正方形&#xff08;边长…

【音视频】WebRTC 开发环境搭建-Web端

一、开发环境搭建 1.1 安装vscode 下载VSCode&#xff1a;https://code.visualstudio.com/&#xff0c;下载后主要用于开发Web前端页面&#xff0c;编写前端代码 安装完成后下载Live Server插件&#xff0c;用于本地开发&#xff0c;实时加载前端页面 1.1.1 前端代码测试 下…

力扣54:螺旋矩阵

力扣54:螺旋矩阵题目思路代码题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 思路 思路很简单创建一个二维数组然后按照箭头所示的顺序一层一层的给二维数组相应的位置赋值即可。难点是我们是一层一层的赋值…

【CSS】设置表格表头固定

1.设置thead样式在thead元素中增加样式&#xff1a;position: sticky;top: 0;2.设置table样式在table元素中增加样式&#xff1a;border-collapse: separate; /* 分离边框模式 */ border-spacing: 0;3.设置表头伪元素样式增加样式&#xff1a;th::after {content: ;position: a…

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现标签条码一维码的检测(C#代码,UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现标签条码一维码的检测&#xff08;C#代码&#xff0c;UI界面版&#xff09;&#xff09;工业相机使用YoloV8模型实现标签条码一维码的检测工业相机通过YoloV8模型实现标签条码的检测的技术背景在相机SDK中获取图像转换…

如何编写好的测试用例?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快对于软件测试工程师来说&#xff0c;设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在…

《Java 程序设计》第 12 章 - 异常处理

大家好&#xff01;今天我们来学习《Java 程序设计》中的第 12 章 —— 异常处理。在编程过程中&#xff0c;错误和异常是不可避免的。一个健壮的程序必须能够妥善处理各种异常情况。本章将详细介绍 Java 中的异常处理机制&#xff0c;帮助大家编写出更稳定、更可靠的 Java 程序…

STM32CubeIDE新建项目过程记录备忘(二) GPIO输出demo:LED闪烁

利用前面创建好的基础模板项目文件&#xff0c;创建第一个应用项目&#xff0c;单片机的hello world&#xff1a;LED闪烁。打开模板文件文件--从文件系统中打开项目&#xff1a;在弹出的窗口中选择之前创建的模板项目文件并打开。复制粘贴新项目 在项目管理器&#xff0c;复制之…

HTML基础P2 | JS基础讲解

什么是JS JS是一个网页的脚本语言&#xff0c;你可以理解为在HTML中写类似于JAVA等高级编程语言的代码&#xff0c;使得网页可以实现一些包含逻辑处理的交互操作 简单上手例子 接下来&#xff0c;给大家一个简单的小例子来感受一下 <!DOCTYPE html> <html lang&qu…

QT笔记(2)——vscode + CMAKE + qtcreate的操作方式

1.vscode 下载cmake&#xff0c;clangd&#xff0c;qtConfigure&#xff0c;cmake tool的相关插件支持 2. qtConfigure插件配置 根据自己下载的qt目录下寻找如图的相关工具 3. qt环境变量配置 在系统变量的path中添加qt编译需要的环境变量。 4.下载Cmake支持 CMake下…

sed编程入门

一.sed是啥sed&#xff08;流编辑器&#xff0c;Stream Editor&#xff09;是 Unix/Linux 系统中强大的文本处理工具&#xff0c;常用于对文本进行替换、删除、插入、追加等操作。它逐行处理输入文本&#xff0c;并根据提供的脚本命令修改文本&#xff0c;最后输出结果。二.基本…

知识速查大全:python面向对象基础

目录 一、面向对象的基本概念 二、类和对象 1.类 2.对象 三、属性&#xff08;数据&#xff09;和方法 1.数据 1.1.实例数据 1.2.类数据 2.方法 2.1.实例方法 2.2.类方法 3.数据和方法的综合使用 四、面向对象三大特性 1.封装 2.继承 2.1.单继承 2.2.多继承 2.3.混合类 2.4.方法…

Linux系统编程Day1-- 免费云服务器获取以及登录操作

一、 学生党如何“白嫖”或免费使用云服务器&#xff1f; 作为学生党&#xff0c;资金有限的情况下确实不容易长期负担服务器费用。但好消息是&#xff0c;有多种方式可以“白嫖”或低成本使用云服务器&#xff0c;尤其是针对学生身份、学习用途和开发者计划。 1、使用各大云平…

15.11 单卡训练770M参数模型!DeepSpeed ZeRO-3实战:RTX 4090显存直降6.8GB

单卡训练770M参数模型!DeepSpeed ZeRO-3实战:RTX 4090显存直降6.8GB 实战 DeepSpeed ZeRO-2 和 ZeRO-3 单机单卡训练 为什么需要单机单卡训练场景? 虽然 DeepSpeed 的 ZeRO 技术主要面向分布式训练场景,但单机单卡训练仍然具有重要实践价值: 开发调试:在资源有限情况下…