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 相关文章推荐
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
python正则表达式中的括号匹配问题
Dec 14 Python
python查找目录下指定扩展名的文件实例
Apr 01 Python
python开启多个子进程并行运行的方法
Apr 18 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
pytorch 自定义参数不更新方式
Jan 06 Python
Python requests模块安装及使用教程图解
Jun 30 Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 Python
浅析Python requests 模块
Oct 09 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
javascript History对象原理解析
2020/02/17 Javascript
Python计时相关操作详解【time,datetime】
2017/05/26 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
迷你西餐厅创业计划书范文
2013/12/31 职场文书
记帐员岗位责任制
2014/02/08 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
乐山大佛导游词
2015/02/02 职场文书
医院合作意向书范本
2015/05/08 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
Python 数据可视化之Matplotlib详解
2021/11/02 Python
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL