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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
python文件操作整理汇总
Oct 21 Python
详解Python的Django框架中manage命令的使用与扩展
Apr 11 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 Python
python中join()方法介绍
Oct 11 Python
Python实现的各种常见分布算法示例
Dec 13 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
python argparser的具体使用
Nov 10 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python分类测试代码实例汇总
Jul 23 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开发环境配置记录
2011/01/14 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
JavaScript基本对象
2007/01/11 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
在HTML代码中使用JavaScript代码的例子
2014/10/16 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
Python实现115网盘自动下载的方法
2014/09/30 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
python实现kNN算法
2017/12/20 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
python爬虫请求头的使用
2020/12/01 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
高中地理教学反思
2014/01/29 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
高三语文教学反思
2016/02/16 职场文书
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python