Python实现直方图均衡基本原理解析


Posted in Python onAugust 08, 2019

1. 基本原理

通过一个变换,将输入图像的灰度级转换为`均匀分布`,变换后的灰度级的概率密度函数为

$$P_s(s) = \frac{1}{L-1}$$

直方图均衡的变换为

$$s = T(r) = (L-1)\int_0^r {P_r(c)} \,{\rm d}c $$

$s$为变换后的灰度级,$r$为变换前的灰度级$P_r(r)$为变换前的概率密度函数2. 测试结果

Python实现直方图均衡基本原理解析

图源自skimage

3.代码

import numpy as np
def hist_equalization(input_image):
  '''
  直方图均衡(适用于灰度图)
  :param input_image: 原图像
  :return: 均衡后的图像
  '''
  output_imgae = np.copy(input_image) # 输出图像,初始化为输入
  input_image_cp = np.copy(input_image) # 输入图像的副本
  m, n = input_image_cp.shape # 输入图像的尺寸(行、列)
  pixels_total_num = m * n # 输入图像的像素点总数
  input_image_grayscale_P = [] # 输入图像中各灰度级出现的概率,亦即输入图像直方图
  # 求输入图像中各灰度级出现的概率,亦即输入图像直方图
  for i in range(256):
    input_image_grayscale_P.append(np.sum(input_image_cp == i) / pixels_total_num)
  # 求解输出图像
  t = 0        # 输入图像的灰度级分布函数F
  for i in range(256):
    t = t + input_image_grayscale_P[i]
    output_imgae[np.where(input_image_cp == i)] = 255 * t
  return output_imgae

4. 数学证明目标变换

  • $$S = T(r) = (L-1)\int_0^rp_r(w)dw$$
  • $T(r)$为严格单调函数,可保证反映射时,消除二义性$p_r(w)$为源图像归一化后的直方图

4.1 假定

  • 图像灰度级为:$[0, L-1]$
  • 源图像中,$k$灰度级的像素个数:$n_k$
  • 源图像像素总数:$n$原图像直方
  • 图$h(r_k) = n$4.2 归一化后的直方图

$$p(r_k) = n_k / n$$

$p(r_k)$即为灰度级$r_k$在源图像中出现的概率估计

4.3 证明

概率密度函数的积分为分布函数,即对分布函数的导数为概率密度函数。

因为$p_r(r)$与$T(r)$已知,则由

$$\frac{{\rm d}r}{{\rm d}S} = \frac{p_s(s)}{p_r(r)}$$

又因为

$$S = T(r)$$


$$\frac{{\rm d}S}{{\rm d}r} = \frac{T(r)}{r}$$

联立上三式及目标变换

$$S = T(r) = (L-1)\int_0^rp_r(w)dw$$

可得

$$p_s(s) = \frac{1}{L-1}$$

故,这意味着变换之后的图像的灰度级为均匀分布,证毕。

总结

以上所述是小编给大家介绍的Python实现直方图均衡基本原理解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python中元类用法实例
Oct 10 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
Python操作Access数据库基本步骤分析
Sep 19 Python
python分割列表(list)的方法示例
May 07 Python
python下载文件记录黑名单的实现代码
Oct 24 Python
Python中常见的异常总结
Feb 20 Python
Python脚本完成post接口测试的实例
Dec 17 Python
解决Python使用列表副本的问题
Dec 19 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
Mar 12 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
python中封包建立过程实例
Feb 18 Python
解决jupyter notebook启动后没有token的坑
Apr 24 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 #Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 #Python
python判断自身是否正在运行的方法
Aug 08 #Python
Python 日期区间处理 (本周本月上周上月...)
Aug 08 #Python
python各类经纬度转换的实例代码
Aug 08 #Python
Python3.0 实现决策树算法的流程
Aug 08 #Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 #Python
You might like
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
PHP7内核之Reference详解
2019/03/14 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
python Opencv将图片转为字符画
2021/02/19 Python
Python中的Django基本命令实例详解
2018/07/15 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
ORACLE十问
2015/04/20 面试题
12月红领巾广播稿
2014/02/13 职场文书
拓展训练激励口号
2014/06/17 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
车间班组长竞聘书
2015/09/15 职场文书