当前位置: 首页 > news >正文

【图像处理OpenCV(C++版)】——4.6 限制对比度的自适应直方图均衡化

前言

😊😊😊欢迎来到本博客😊😊😊

🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。

😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–>搜索你要查询的算子名称或相关知识点,或者通过这篇博客👉通俗易懂OpenCV(C++版)详细教程——OpenCV函数快速查找(不断更新中)]查阅你想知道的知识,即可食用。

🎁🎁🎁支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!😙😙😙


文章目录

    • 学习目标
    • 一、概念及原理
      • 1.1 相关概念及原理
    • 二、 代码实现
    • 三、 总结

学习目标

  • 熟悉自适应直方图均衡化概念及原理
  • C++实现自适应直方图均衡化案例

  上一节介绍了更为方便的方法来自动调节图像对比度——全局直方图均衡化但是原图中比较亮的区域,经过全局直方图均衡化处理后会出现了失真的情况,而且出现了明显的噪声。该如何处理呢?

一、概念及原理

1.1 相关概念及原理

  关于自适应直方图均衡化步骤如下:

  首先,将图像划分为不重叠的区域块然后,对每一个块分别进行直方图均衡化。在没有噪声影响的情况下,每一个小区域的灰度直方图会被限制在一个小的灰度级范围内;但是如果有噪声,每一个分割的区域块执行直方图均衡化后,噪声会被放大。最后,为了避免出现噪声这种情况,利用“限制对比度(Contrast Limiting)”的方式,如果直方图的bin超过了提前预设好的“限制对比度”,那么会被裁减,然后将裁剪的部分均匀分布到其他的bin,这样就重构了直方图。
————————————————
小知识:灰度与彩色直方图bin的含义
   1、计算颜色直方图时,横坐标是颜色空间,纵坐标是该颜色的像素点的数量。
   2、对于RGB而言,每个通道都有0到255个灰度集,即一共256个。如果采用bins=1的思路,则有 256 x 256 x 256 个横坐标,并且横坐标对应的纵坐标的值也比较少(一个图中像素值相同的也不多)
   3、为解决这种问题,采用了合并的思想,也就出现了bin。计算颜色直方图需要将颜色空间划分为若干个小的颜色区间。对于每个颜色通道(R,G,B),每32个划分到一个bin里面(具体一个bin中的区间为多少可以视情况而定)。排列组合后,有8 x 8 x 8 一共有512 bin ,也就是直方图的横坐标共512个刻度。

	R:0到255 划分为 8个binG:0到255 划分为 8个binB:0到255 划分为 8个bin举个例子:假设一个像素的R,G,B,3个通道的取值分别为2,5,4,那么在bins下的坐标就应该为(1,1,1)。因为2相对于R通道来说属于第一个bins,后面的同理。

  如下图所示,假设设置“限制对比度”为50,第3个bin所对应的像素个数大于50,然后将多出的将会均匀分布到每一个bin,重构后的直方图如图(右)所示,接下来利用重构后的直方图进行均衡化操作。

  可以看到,此时的直方图又会整体上升了一个高度,但也有部分bin会超过我们设置的上限(如地5个bin)。当然,在实现的时候有很多解决方法,可以多重复几次裁剪过程,使得上升的部分变得微不足道,也可以用另一种常用的方法

  示例: 假设图中裁剪值为ClipLimit=50
    (1) 求出直方图中高于该值的部分的和TotalNum (图中只有一个bin超过ClipLimit,假设为82,即82-50=32);
    (2) 假设将TotalNum均分给所有灰度级,直方图整体上升的高度L=TotalNum/N,即32/(256/16)=2
    (3) 同时以upper= ClipLimit-L为界限对直方图进行如下处理:

      1) 若幅值高于ClipLimit,直接置为ClipLimit即图中第5个bin
      2) 若幅值处于UpperClipLimit之间,将其填补至ClipLimit
      3) 若幅值低于Upper,直接填补L个像素点;

  经过上述操作,用来填补的像素点个数通常会略小于TotalNum,还有一些剩余的像素点没分出去。可以再把这些点均匀地分给那些目前幅值仍然小于ClipLimit的灰度值。

二、 代码实现

  关于OpenCV实现的限制对比度的自适应直方图均衡化函数,其实在OpenCV中并没有提及相关函数,提供了函数createCLAHE()来构建指向CLAHE对象的指针,其中默认设置“限制对比度(clipLimit=(40.0)),块的大小为8×8

#include <iostream>
#include <opencv2/opencv.hpp> 
# include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv ;int main() {Mat src = imread(D:/VSCodeFile/0penCV_CSDN/image/img3.jpg);//Mat src;if (src.empty() {cout<<“the image is empty!" << endl;//全局直方图均衡化Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);Mat dst;equalizeHist(gray, dst);//限制对比度的自适应直方图均衡化//构建CLAHE 对象Ptr<CLAHE> clahe = createCLAHE(2.0, Size(8, 8));Mat dst1;// 限制对比度的自适应直方图均衡化clahe->apply(gray, dst1);//图片显示imshow("原图", src);imshow("直方图均衡化演示", dst);imshow("对比度增强", dst1);waitKey (0) ;return 0;
}

  结果显示了对原图进行全局直方图均衡化(HE)和限制对比度自适应直方图均衡化(CLAHE)的效果,仔细观察会发现原图中比较亮的区域,经过HE处理后出现了失真的情况(两个人体已经模糊),而且出现了明显的噪声,而CLAHE避免了这两种情况。

在这里插入图片描述

  对比度增强只是图像增强方法中的一种手段,目前提到的对比度拉伸的方法受图像噪声的影响会很明显,在下一章内容开始介绍去除噪声的方法,去噪之后再使用对比度增强技术效果会更好


三、 总结

  最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。OpenCV是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,有什么问题希望大家可以积极评论交流,我也会及时更新,来督促自己学习进度。希望大家觉得不错的可以点赞、关注、收藏。


🚶🚶🚶今天的文章就到这里啦~
喜欢的话,点赞👍、收藏⭐️、关注💟哦 ~

相关文章:

【图像处理OpenCV(C++版)】——4.6 限制对比度的自适应直方图均衡化

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…...

设计模式--工厂模式

这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的接口来指向新创建的对象。   工厂模式主要使用了C的多态特性。将存在继承关系的类&a…...

算法笔记(十三)—— 树形DP及Morris遍历

树形DP&#xff1a; Question1: 以X为头结点的树&#xff0c;最大距离&#xff1a; 1. X不参与&#xff0c;在左子树上的最大距离 2. X不参与&#xff0c;在右子树上的最大距离 3. X参与&#xff0c;左树上最远的结点通过X到右树最远的结点 最后的结果一定是三种情况的最大…...

【Classical Network】EfficientNetV2

原文地址 原文代码 pytorch实现1 pytorch实现2 详细讲解 文章目录EfficientNet中存在的问题NAS 搜索EfficientNetV2 网络结构codeEfficientNet中存在的问题 训练图像尺寸大时&#xff0c;训练速度非常慢。train size 512, batch 24时&#xff0c;V100 out of memory在网络浅…...

索引类型FULLTEXT、NORMAL、SPATIAL、UNIQUE的区别

SQL索引的创建及使用请移步另一篇文章 (188条消息) SQL索引的创建及使用_sql索引的建立与使用_t梧桐树t的博客-CSDN博客 索引的种类 NORMAL 表示普通索引&#xff0c;大多数情况下都可以使用 UNIQUE 表示唯一索引&#xff0c;不允许重复的索引&#xff0c;如果该字段信息…...

稳定、可控、高可用:运维最应该加持哪些技术 buff?

如何保障开发需求高效交付&#xff0c;系统高峰扛得住、长期平稳&#xff0c;是项目组中的每位技术人必须面对的问题。 本文大纲 1、强稳定性Buff 2、风控服务实时性Buff 3、高资源利用率Buff 1.强稳定性Buff 强稳定性背后有三大挑战&#xff0c;其一是应对发布变更引起故障问…...

动态网站开发讲课笔记02:Java Web概述

文章目录零、本讲学习目标一、 XML基础&#xff08;一&#xff09;XML概述1、XML2、XML与HTML的比较&#xff08;二&#xff09;XML语法1、XML文档的声明2、XML元素的定义3、XML属性的定义4、XML注释的定义5、XML文件示例&#xff08;三&#xff09;DTD约束1、什么是XML约束2、…...

如何保护 IP 地址的隐私问题

是不是只有运营商才能查到某个人的住址信息呢&#xff1f;在大数据时代的今天&#xff0c;各种互联网应用收集了大量的数据信息&#xff0c;它们其实也可以根据这些信息&#xff0c;推断出某个人的大致地址位置。例如百度地图会一直用 App SDK 以及网页的方式记录 IP 和地址位置…...

高并发系统设计之限流

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录限流算法计数器算法滑动窗口漏桶算法令牌桶算法限流算法实现Guava RateLimiter实现限流令牌预分配预热限流Nginx 限流limit_connlimit_req黑白名单限流这篇文章来讲讲限流&#xff0c;在高并发系统中…...

ZCMU--5286: Rose的字符串(C语言)

Description 一天Rose同学想得到一个仅由01组成的字符串S&#xff0c;Jack同学为了让Rose同学开心&#xff0c;于是打算去商店购买另一个也仅由01组成的字符串T。而商店的字符串价格由它的长度决定&#xff0c;比如字符串011售价3元&#xff0c;001011售价6元&#xff0c;商店…...

MAC下搭建hadoop

一&#xff1a;简介 Hadoop是一个用Java开发的开源框架&#xff0c;它允许使用简单的编程模型在跨计算机集群的分布式环境中存储和处理大数据。它的设计是从单个服务器扩展到数千个机器&#xff0c;每个都提供本地计算和存储。特别适合写一次&#xff0c;读多次的场景。 Hado…...

Python如何实现自动登录和下单的脚本,请看selenium的表演

前言 学python对selenium应该不陌生吧 Selenium 是最广泛使用的开源 Web UI&#xff08;用户界面&#xff09;自动化测试套件之一。Selenium 支持的语言包括C#&#xff0c;Java&#xff0c;Perl&#xff0c;PHP&#xff0c;Python 和 Ruby。目前&#xff0c;Selenium Web 驱动…...

华为OD机试真题Python实现【关联子串】真题+解题思路+代码(20222023)

关联子串 题目 给定两个字符串str1和str2 如果字符串str1中的字符,经过排列组合后的字符串中 只要有一个是str2的子串 则认为str1是str2的关联子串 若不是关联子串则返回-1 示例一: 输入: str1="abc",str2="efghicaibii" 输出: -1 预制条件: 输入的…...

Flutter+【三棵树】

定义 在Flutter中和Widgets一起协同工作的还有另外两个伙伴&#xff1a;Elements和RenderObjects&#xff1b;由于它们都是有着树形结构&#xff0c;所以经常会称它们为三棵树。 这三棵树分别是&#xff1a;Widget、Element、RenderObject Widget树&#xff1a;寄存烘托内容…...

若依系统【SpringBoot】如何集成qq邮件发送【超详细,建议收藏】

若依系统的部署博主就不在这儿阐述了&#xff0c;默认大家的电脑已经部署好了若依系统&#xff0c;这里直接开始集成邮件系统&#xff0c;首先我们得需要对qq邮箱进行配置&#xff1b;一套学不会你来打我&#x1f600;&#xff1b; 一、开启我们的qq邮箱发送邮件的配置 1、先进…...

kettle使用--1.mysql多表关联导入mongoDB

文章目录1. 初步体验&#xff1a;csv 转为excelKettle概念配置mysql链接mysql 一对多关联查询结果保存到mongodb中1. 初步体验&#xff1a;csv 转为excel Windows环境下安装pdi-ce-8.0.0.0-28.zip &#xff0c;解压后执行lib下的Spoon.bat 将csv输入拖入 双击拖进去的csv&…...

2023年CDGA考试-第10章-参考数据和主数据(含答案)

2023年CDGA考试-第10章-参考数据和主数据(含答案) 单选题 1.实现主数据中心环境的三种基本方法中不包括哪种? A.参考目录 B.注册表 C.交易中心 D.混合模式 答案 A 2.参考数据还具有很多区别于其他主数据 (例如,企业结构数据和交易结构数据)的特征。以下哪项目描述错误的…...

2023年,什么行业更有发展前景?

关于有前景有发展的行业推荐&#xff0c;小课今天还是推荐咱们IT互联网行业。 很多人会说现在懂电脑的那么多,这个行业都饱和了,很多学电脑的找不到工作都改行了。但事实是现在每个行各业都需要互联网&#xff0c;需要懂电脑的技术人才&#xff0c;尤其是在云计算、大数据到来…...

致盛咨询携手亚马逊云科技进一步开拓中国市场

作为医疗保健领域的咨询公司&#xff0c;ZS需要保证服务可靠性、敏捷性和安全性的同时&#xff0c;获得经济效益。亚马逊云科技丰富的云服务产品简化了ZS基础架构的搭建&#xff0c;为ZS节省了大量的人力与资金成本。同时&#xff0c;缩短了ZS扩展基础设施的周转时间&#xff0…...

ts之 命名空间 namespace、三斜线指令、声明文件(declare 声明ts的变量函数第三方模块等 )

目录ts之 命名空间 namespacets之 命名空间 namespacets之 三斜线指令 &#xff08; 引入其他.ts文件 &#xff09;app.tsindex.tsts之 声明文件 d.ts - declare01&#xff1a;declare声明express第三方模块typings 为代码或者第三方模块 编写声明文件index.ts02&#xff1a;de…...

开源AI图像工作站落地:Pixel Fashion Atelier在数字藏品中的应用

开源AI图像工作站落地&#xff1a;Pixel Fashion Atelier在数字藏品中的应用 1. 项目概述 Pixel Fashion Atelier&#xff08;像素时装锻造坊&#xff09;是一款基于Stable Diffusion与Anything-v5的开源图像生成工作站。与传统AI工具不同&#xff0c;它采用了复古日系RPG的&…...

从PX4的FRD到Mavros的FLU:手把手教你正确配置`setpoint_raw/local`话题发布无人机目标点

从PX4的FRD到Mavros的FLU&#xff1a;无人机坐标系转换实战指南 当你在ROS环境下通过Mavros向PX4飞控发送位置指令时&#xff0c;是否遇到过无人机朝完全相反方向飞行的情况&#xff1f;这种"方向错乱"的根源往往在于坐标系理解的偏差。本文将彻底解开PX4与Mavros之间…...

Anthropic源码又泄露了,让你把这个瓜吃明白?(Claude Code被动开源)

Anthropic源码又&#xff0c;又&#xff0c;又&#xff0c;又泄露了...到底发生了什么事&#xff1f;简单说&#xff0c;Claude Code在发布npm包时&#xff0c;一不小心把一个调试50多M的.map文件给打包进去了。多了个文件而已&#xff0c;听上去&#xff0c;是不是没什么&…...

OpenClaw+gemma-3-12b-it自动化数据清洗:从杂乱Excel到规整数据库

OpenClawgemma-3-12b-it自动化数据清洗&#xff1a;从杂乱Excel到规整数据库 1. 为什么需要自动化数据清洗 上周我接手了一个市场调研项目&#xff0c;客户发来的原始数据让我头皮发麻——12个Excel文件&#xff0c;总计超过3万条记录&#xff0c;充斥着格式混乱的日期、缺失…...

C++的std--ranges编译器内联

C的std::ranges编译器内联&#xff1a;现代C的高效编程利器 随着C20标准的发布&#xff0c;std::ranges库的引入彻底改变了算法与数据结构的交互方式。这一特性不仅简化了代码编写&#xff0c;还通过编译器的内联优化显著提升了运行时性能。对于追求高效与简洁的开发者而言&am…...

【故障公告】数据库服务器磁盘 MBPS 高造成 :-: 期间全站故障

简介 langchain中提供的chain链组件&#xff0c;能够帮助我门快速的实现各个组件的流水线式的调用&#xff0c;和模型的问答 Chain链的组成 根据查阅的资料&#xff0c;langchain的chain链结构如下&#xff1a; $$Input \rightarrow Prompt \rightarrow Model \rightarrow Outp…...

技术创业中的风险管理:从内核开发到商业稳定

技术创业中的风险管理&#xff1a;从内核开发到商业稳定 技术创业的风险挑战 作为一名从Linux内核开发者转型产品经理再到科技创业者的人&#xff0c;我深刻体会到风险管理在技术创业中的重要性。技术创业过程中充满了各种风险&#xff0c;从技术风险到商业风险&#xff0c;从市…...

从‘滋滋’声到过认证:一个Buck电源的EMI实战整改笔记(附PCB布局优化技巧)

从‘滋滋’声到过认证&#xff1a;一个Buck电源的EMI实战整改笔记&#xff08;附PCB布局优化技巧&#xff09; 1. 问题浮现&#xff1a;EMI测试中的异常现象 那是一个周五的下午&#xff0c;实验室的EMI测试仪屏幕上跳动的红色曲线格外刺眼。我们团队开发的IoT设备在CE认证测试…...

DBSCAN vs K-means:5个真实数据集对比,教你选对聚类算法

DBSCAN与K-means实战对比&#xff1a;5个真实数据集下的算法选择指南 第一次接触聚类分析时&#xff0c;我被一个简单问题困扰&#xff1a;为什么同样的数据用不同算法会得到截然不同的分组结果&#xff1f;记得当时用K-means处理地理坐标数据&#xff0c;结果把绵延的海岸线硬…...

实验室服务器远程访问终极方案:SSH 反向隧道 + systemd 自动重连

&#x1f680; 实验室服务器远程访问终极方案&#xff1a;SSH 反向隧道 systemd 自动重连适用于&#xff1a; 没有公网 IP 的实验室服务器想用 VSCode / SSH / Jupyter 远程开发希望稳定、自动重连、开机自启&#x1f9e0; 一、问题背景 在很多实验室环境中&#xff1a; GPU 服…...