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连接sql server乱码的解决方法
Jan 28 Python
Python3 正在毁灭 Python的原因分析
Nov 28 Python
详解Python中的__new__()方法的使用
Apr 09 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Python 递归函数详解及实例
Dec 27 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
Python实现的爬虫功能代码
Jun 24 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
python实现堆排序的实例讲解
Feb 21 Python
Python环境搭建过程从安装到Hello World
Feb 05 Python
Python数据结构之队列详解
Mar 21 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实现转换ubb代码的方法
2015/06/18 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
PHP学习记录之数组函数
2018/06/01 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
javascript常见操作汇总
2014/09/03 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
vue实现记事本功能
2019/06/26 Javascript
python3生成随机数实例
2014/10/20 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
python实现微信小程序自动回复
2018/09/10 Python
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
python批量获取html内body内容的实例
2019/01/02 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
详解python中各种文件打开模式
2020/01/19 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
药学专业学生的自我评价分享
2014/02/06 职场文书
cf战队收人口号
2014/06/21 职场文书
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript