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实现递归版汉诺塔示例(汉诺塔递归算法)
Apr 08 Python
Python命名空间详解
Aug 18 Python
Python psutil模块简单使用实例
Apr 28 Python
使用Python的urllib2模块处理url和图片的技巧两则
Feb 18 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
python利用百度AI实现文字识别功能
Nov 27 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 Python
对Python 字典元素进行删除的方法
Jul 31 Python
Python列表的深复制和浅复制示例详解
Feb 12 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 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
PHP添加Xdebug扩展的方法
2014/02/12 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
python集合类型用法分析
2015/04/08 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
python 类详解及简单实例
2017/03/24 Python
代码分析Python地图坐标转换
2018/02/08 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
keras.layer.input()用法说明
2020/06/16 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
《毛主席在花山》教学反思
2014/04/20 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技
python中validators库的使用方法详解
2022/09/23 Python