【opencv】20.直方图均衡化的数学原理
本文只讲数字图像处理,即离散化后的公式,至于积分形式的分析,网上很多。
具体的数学推导可以参考这篇博客直方图均衡化。
如果想自己代码实现直方图均衡化,相关源代码可以参考(不使用api)使用C++实现彩色图像直方图均衡化的三种方法。
如果要直接使用opencv
的api,直接一个函数搞定,用法如下:
void equalizeHist(InputArray src,OutputArray dst)
在实际均衡化过程中,核心步骤如下:
说明:xix_ixi是灰度值,取值[0~255]
,iii也取值为[0~255]
,xxx是一个像素(原始的),f(x)f(x)f(x)是直方图均衡化之后的值。
- 1.计算灰度图的直方图;
- 2.遍历灰度直方图,对灰度值从 0~255 累计求和(图像计算中,积分可以用求和来近似替代),对求和结果除以图像的像素总数,然后乘以 L−1\color{red}L-1L−1得到函数结果 得到函数结果 f(xi)f(x_i)f(xi)。
f(xi)=(L−1)∑0xih(xi)w∗h\color{red}f(x_i)=(L-1)\sum_{0}^{x_i} {\frac{h(x_i)}{w*h}}f(xi)=(L−1)0∑xiw∗hh(xi)
如果写成迭代的式子,就是下面这样:
f(xi)=f(xi−1)+(L−1)h(xi)w∗h=(L−1)∑0xi−1h(xi−1)w∗h+(L−1)h(xi)w∗h\color{red} \begin{aligned} f(x_i) &= f(x_{i-1})+(L-1)\frac{h(x_{i})}{w*h} \\ &=(L-1)\sum_{0}^{x_{i-1}} {\frac{h(x_{i-1})}{w*h}}+(L-1)\frac{h(x_{i})}{w*h} \\ \end{aligned} f(xi)=f(xi−1)+(L−1)w∗hh(xi)=(L−1)0∑xi−1w∗hh(xi−1)+(L−1)w∗hh(xi)
不过这种方式会产生小数,然后又取整,每次像素值都取整,有精度损失,虽然影响不大,但是更好的方式是对该像素和该像素之前的像素数量求和,count+=h(xi)count+=h(x_i)count+=h(xi),
f(xi)=(L−1)countw∗h\color{red}f(x_i)=(L-1)\frac{count}{w*h}f(xi)=(L−1)w∗hcount
这个公式就是,当xi=80x_i=80xi=80 时,灰度值为80的像素在直方图均衡化之后的灰度值为f(xi)\color{red}f(x_i)f(xi)。 - 3.将每一个灰度值累积求和的结果f(xi)f(x_i)f(xi)存储在一个大小为 256 的
int
数组中,存储的位置为 iii; - 4.遍历输入图像每一个像素,记点值为xxx,修改其像素值使等于f(x)f(x)f(x)。
- 5.均衡化结束。
例子:
假设一幅图中的像素范围是 [10~160],有100个像素取值(因为有些像素值可能并没有,例如,一张图中像素值为75的像素一个都没有),直方图均衡化的做法就是:
其实累计求和就是下面这样,假设灰度图片总共有total=2550个像素:
origin_pixel_value | 0 | 1 | … | 10 | 11 | 12 | 13 | … | 160 | … | 255 |
---|---|---|---|---|---|---|---|---|---|---|---|
num | 0 | 0 | 0 | 250 | 500 | 10 | 800 | … | 100 | 0 | 0 |
calculate: vnext=vpre+255∗numtotalv_{next}=v_{pre}+255* \frac{num}{total}vnext=vpre+255∗totalnum 例:v10=v9+255∗2502550v_{10}=v_{9}+255* \frac{250}{2550}v10=v9+255∗2550250, v255=v254+255∗02550v_{255}=v_{254}+255* \frac{0}{2550}v255=v254+255∗25500 |
v0=0v_0=0v0=0 | v1=v0+0v_1=v_0+0v1=v0+0 | 0 | v10=v9+255∗2502550v_{10}=v_{9}+255* \frac{250}{2550}v10=v9+255∗2550250 | v11 | v12 | v13 | v160 | v255 | ||
final_pixel_value | 0 | 0 | 0 | 25 | 75 | 76 | 156 | 255 | 255 | 255 |
由上表可知,本来像素范围在[10~160]
,直方图均衡化之后,像素范围变为了[25~255]
,动态范围大大增加;
- 原来的低亮度像素值为
10
的变为了25
,11
的变为了75
,12
的变为了76
,13
变为了156
,160
变成了255
。可以看出该像素对应的灰度值在整幅图中的个数越多,变换后的灰度值就越大。 - 本来像素
12
和像素13
只相差1
,直方图均衡化之后,变为了76
和156
,对比度显著变大,之所以会这样,就是因为像素13
比像素12
的灰度值个数多,并且多的不是一个量级。 - 但是由于直方图均衡化是递增的,对于原来像素
11
和像素12
只相差1
,直方图均衡化之后,变为了75
和76
,所以即使二者像素个数相差几百个,对比度也没有增大。 - 因此灰度值更高时,而像素数量骤减的话,并不会拉升对比度。只对灰度值更高,像素数量陡增时,才会拉升对比度。
假设该图像有total=25500个像素,即像素个数扩大了10倍,本例把像素值为160的像素增大到了3000个:
origin_pixel_value | 0 | 1 | … | 10 | 11 | 12 | 13 | … | 160 | … | 255 |
---|---|---|---|---|---|---|---|---|---|---|---|
num | 0 | 0 | 0 | 250 | 500 | 10 | 800 | … | 3000 | 0 | 0 |
calculate: vnext=vpre+255∗numtotalv_{next}=v_{pre}+255* \frac{num}{total}vnext=vpre+255∗totalnum 例:v10=v9+255∗25025500v_{10}=v_{9}+255* \frac{250}{25500}v10=v9+255∗25500250, v255=v254+255∗025500v_{255}=v_{254}+255* \frac{0}{25500}v255=v254+255∗255000 |
v0=0v_0=0v0=0 | v1=v0+0v_1=v_0+0v1=v0+0 | 0 | v10=v9+255∗25025500v_{10}=v_{9}+255* \frac{250}{25500}v10=v9+255∗25500250 | v11 | v12 | v13 | v160 | v255 | ||
calculate_pixel_value | 0 | 0 | 0 | 2.5 | 7.5 | 7.6 | 15.6 | 255 | 255 | 255 | |
final_pixel_value | 0 | 0 | 0 | 3 | 8 | 8 | 16 | 255 | 255 | 255 |
由上表可知,本来像素范围在 [10~160]
,直方图均衡化之后,像素范围变为了 [3~255]
,动态范围大大增加;
原来的低亮度像素值为10
的变为了3
,11
的变为了85
,12
的变为了8
, 13
变为了16
,160
变成了255
。可以看出该像素对应的灰度值在整幅图中的个数越多,变换后的灰度值就越大。
图像中像素灰度值数量最多的变亮了,那么整幅图看起来就更亮,对比度更高,更清晰了。
【opencv】20.直方图均衡化的数学原理相关推荐
- 【OpenCV 】直方图均衡化,直方图计算,直方图对比
目录 1.直方图均衡化¶ 1.1 原理 1.2 直方图均衡化 1.3 直方图均衡化原理 1.4 代码实例 1.5 运行效果 2. 直方图计算¶ 2.1 目标 2.2 直方图 2.3 代码实例 2.4 ...
- OpenCV中直方图均衡化
OpenCV中直方图均衡化 首先知道直方图是个什么鬼?在一幅图像中,直方图所体现的是每个像素值在所有的像素中所占的比例:例值为127的像素点的个数/图像总的像素点的个数\color{#f00}值为12 ...
- OpenCV equalizeHist直方图均衡化的实例(附完整代码)
OpenCV equalizeHist直方图均衡化的实例 OpenCV equalizeHist直方图均衡化的实例 OpenCV equalizeHist直方图均衡化的实例 #include &quo ...
- Python+OpenCV:直方图均衡化(Histogram Equalization)
Python+OpenCV:直方图均衡化(Histogram Equalization) ####################################################### ...
- python opencv 直方图均衡_深入理解OpenCV+Python直方图均衡化
原标题:深入理解OpenCV+Python直方图均衡化 正文 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法. 基本思想:把原始图的直方图变换为均匀分 布的形式,这样就增加了像素灰度 ...
- opencv基础---直方图均衡化(原理equalizeHist)
直方图均衡化的作用是图像增强. 有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布. 第一个问题.均衡化过程中,必须要保证两个条件:①像素无论怎么映射, ...
- 对比度受限直方图均衡化CLAHE算法原理及Opencv C++代码实现
在上一篇博客中讲解了直方图均衡化的原理. 一文深入理解直方图均衡化的原理 虽然直方图均衡简单.高效:但是,图像中不同的区域灰度分布相差甚远,对它们使用同一种变换常常产生不理想的效果: 实际应用中,常常 ...
- OpenCv:直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)
总结了使用Python OpenCv处理图像直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)的方法. 目录 直方图均衡化(HE) 自适应直方图均衡化(AH ...
- 图像直方图均衡化(Equalization)数学原理和纯C语言实现
图像处理入门 C语言生成RGB24格式图像 图像缩放之最近邻内插法 图像直方图均衡化数学原理和程序实现 目录 图像处理入门 一.图像均衡化数学原理 1.转化为数学问题 2.需要用到的知识 3.数学推理 ...
最新文章
- 16年前卖猪肉的北大高材生如今怎么样了?
- 「SAP技术」SAP MM 委外加工采购流程里副产品的收货
- 斯坦福大学、DARPA与硅谷公司共同分析前沿科技发展趋势
- 计算机编辑功能在哪,注册表编辑器怎么打开-电脑的剪切板在哪里 电脑剪切板里面的内容怎么修改...
- 这款IDEA插件,可以让你用中文编码哟
- df、du、fdisk、lsblk区别
- 10601 - Cubes(Ploya)
- 【前端】递归之引起堆栈溢出解决方案
- jqGrid的autoencode参数设置为true在客户端可能引发的编码问题
- linux下c语言tcp文件传输,C语言实现TCP通信
- js 数组遍历for..in弊端
- 十.激光SLAM框架学习之LeGO-LOAM框架---算法原理和改进、项目工程代码
- python实现打飞机小游戏
- Win10 代码行数统计工具CLOC的安装和使用
- hmcl手机版_hmcl启动器正版
- Android的六大布局详解
- 故障树分析 - 事件概率模型
- 百度 BAE 项目部署
- 谷歌宣布加入“反微软联盟”
- iOS小技能:安全措施
热门文章
- day19 生成器函数
- 微服务实践分享(8) 控制调用中心
- http 协议上传文件multipart form-data boundary 说明--转载
- 机器学习Sklearn实战——极限森林、梯度提升树算法
- Facebook首席工程负责人胡鲁辉:数字化2.0的理念、架构与业务模型丨鲸犀峰会
- 使用 TOGAF 9.1 框架與 ArchiMate 3.0 建模語言
- 这六段代码隐藏着深度学习的前世今生!
- LeetCode_349. 两个数组的交集
- Linux-Raid0、Raid1、Raid5、Raid10初探
- 并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍