项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.什么是直方图(histogram)

在统计学中,直方图(Histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。一般来说用横轴表示数据类型,纵轴表示分布情况。
直方图是数值数据分布的精确图形表示。 这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Karl Pearson)首先引入。它是一种条形图。 为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 间隔必须相邻,并且通常是(但不是必须的)相等的大小。
直方图也可以被归一化以显示“相对”频率。 然后,它显示了属于几个类别中的每个案例的比例,其高度等于1。

2.图像处理中的直方图与直方图均衡化

在图像处理中,直方图是非常重要,也非常有用的一个处理要素。
一般来说图像直方图的横轴表示亮度,从左到右表示亮度从低到高。直方图的纵轴表示像素数量,从下到上表示像素从少到多。直方图在某个亮度区间的凸起越高,就表示在这个亮度区间内的像素越多。比如这个直方图的凸起就主要集中在左侧,也就是说这张照片的亮度整体偏低。

而直方图均衡则是图像对比增强的一种常用方法。一般来说,图像对比增强的方法分为两大类:一种是直接对比度增强,另外一种是间接对比度增强。直方图拉伸与直方图均衡化就是两种最常见的间接对比度增强的方法。直方图均衡化的基本思想就是把原始图像的灰度直方图从比较集中的某个灰度区间变成全部灰度范围内的均匀分布,具体的做法就是通过对图像进行非线性拉伸,重新分配图像的像素值,使一定灰度范围内的像素数量大致相同。

直方图均衡化优点:
1.均衡化后的图像明暗对比更明显。亮的地方更亮,暗的地方更暗,拉开了差距。
2.直方图被均匀分开。
3.增大图像的信息量。

直方图均衡化缺点:
1.变换后图像的灰度级减少,某些细节消失;
2.某些图像,如直方图有高峰,经处理后对比度不自然的过分增强

3.直方图均衡化的原理

在直方图均衡化的过程中,有两个问题需要搞定。一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布。
第一个问题。均衡化过程中,必须要保证两个条件:①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;②如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。
第二个问题。累积分布函数具有一些好的性质,那么如何运用累积分布函数使得直方图均衡化?比较概率分布函数和累积分布函数,前者的二维图像是参差不齐的,后者是单调递增的。直方图均衡化过程中,映射方法是
sk=∑i=1nnjn,k=0,1,2,⋯,L−1s_k = \displaystyle{\sum_{i=1}^{n}}\frac{n_j}{n}, k = 0,1,2,\cdots,L-1sk​=i=1∑n​nnj​​,k=0,1,2,⋯,L−1

其中,nnn是图像中像素的总和,nkn_knk​是当前灰度级的像素个数,LLL是图像中可能的灰度级总数。
具体的严格数学推导过程可以查看后面的参考链接。
来看看通过上述公式怎样实现的拉伸。假设有如下图像:


得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:

映射后的图像如下所示:

以上就是直方图映射均衡化的步骤,当然还有一些基于此的更优算法,比如Photoshop中的方法,在此就不一一列举了,大同小异。

4.python中的直方图均衡化实现

import numpy as np
from skimage import exposure, io, data
import matplotlib.pyplot as pltdef histdemo():image = io.imread('XXX')arr = image.flatten()plt.subplot(221)plt.imshow(image)plt.subplot(222)plt.hist(arr, bins=256, normed=1, edgecolor='None', facecolor='red')  # 原始图像直方图img1 = exposure.equalize_hist(image)arr1 = img1.flatten()plt.subplot(223)plt.imshow(img1, plt.cm.gray)  # 均衡化图像plt.subplot(224)plt.hist(arr1, bins=256, normed=1, edgecolor='None', facecolor='red')  # 均衡化直方图plt.show()histdemo()

代码详解:
matplotlib.pyplot中的hist函数可以直接绘制直方图。而hist函数的参数非常多,函数签名如下:

# This function was autogenerated by boilerplate.py.  Do not edit as
# changes will be lost
@_autogen_docstring(Axes.hist)
def hist(x, bins=None, range=None, normed=False, weights=None, cumulative=False,bottom=None, histtype='bar', align='mid', orientation='vertical',rwidth=None, log=False, color=None, label=None, stacked=False,hold=None, data=None, **kwargs):

其中,
x: 为需要计算直方图的一维数组,在代码中为arr,由图像矩阵flatten而来。
bins: 为直方图的柱数。
normed: 是否归一化
histtype:直方图的类型

代码最后输出的效果为:

参考链接:
1.https://zhuanlan.zhihu.com/p/24507450
2.https://zh.wikipedia.org/wiki/%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%9D%87%E8%A1%A1%E5%8C%96
3.https://www.zhihu.com/question/37204742 直方图均衡化的数学推导过程
4.http://blog.csdn.net/rushkid02/article/details/9178117 直方图均衡化的例子来自本文

图像处理中的直方图与均衡化相关推荐

  1. 【数字图像处理】图像直方图均衡化、空域滤波(均值滤波、中值滤波)、图像锐化(Laplace算子)、图像傅里叶变换实验

    图像直方图均衡化.空域滤波.图像锐化.图像傅里叶变换 一.图像直方图均衡化 二.图像空域滤波 1.均值滤波(滤波次数n→3) 2.中值滤波(滤波次数n→3) 3.图像锐化(Laplace算子) 三.图 ...

  2. python绘制灰度图片直方图-python数字图像处理实现直方图与均衡化

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...

  3. 图像归一化处理 相同像素_图像处理学习笔记(九)——灰度直方图及其均衡化(理论篇)...

    本篇介绍灰度直方图和均衡化,也是属于图像灰度变换得范畴: 一.直方图 直方图:表示图像中具有某种灰度级的像素的个数,反映了图像中每种灰度出现的频率.是图像最基本的统计特征. 横坐标:灰度级: 纵坐标: ...

  4. matlab title多个标题_MATLAB中的直方图处理及均衡化

    直方图是多种空间域处理技术的基础.仿图操作能有效地用于图像增强,直方图固有的信息在其他图像处理应用中也是非常有用的,如图像压缩与分割.訪图在软件中易于计算,也适用于商用硬件设备,因此直方图成为实时图像 ...

  5. python+opencv图像处理之七:直方图均衡化

    python+opencv图像处理之七:直方图均衡化 目录 python+opencv图像处理之七:直方图均衡化 一.直方图均衡化 二.直方图绘制 三.直方图均衡化 四.有限对比适应性直方图均衡化 一 ...

  6. python绘制灰度图片直方图-python数字图像处理(9):直方图与均衡化

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...

  7. python图像直方图、获取每一个柱的个数_python数字图像处理实现直方图与均衡化...

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...

  8. 图像处理(Image Processing) ---------- 直方图均衡化 (Equalization)(C#实现)

    说到直方图均衡化,首先提一提概率论的知识. 概率论: 离散型随机变量:能用日常使用的量词度量的随机变量. 概率函数:形如  P(x = 1) = 1/6; 概率分布: 概率分布函数: . (累积概率函 ...

  9. java 灰度直方图_【数字图像处理】灰度直方图、直方图均衡化、直方图规定化...

    灰度直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少. 图像的灰度直方图是灰 ...

  10. Mtlab中函数histeq的使用及直方图的均衡化、规定化

    直方图均衡化 均衡化处理的目的是得到比原图具有更高对比度的扩展了动态范围的图像. 原理 假设灰度级为归一化至范围[0,1]内的连续量,并令pr(r)p_r(r)pr​(r)表示给定图像中灰度级的概率密 ...

最新文章

  1. 基因组组装的那些困扰,用单倍体基因组一一破解!
  2. 如何将UI5应用部署到Fiori On-Premise和On-Cloud的Launchpad上去
  3. 选择将正确答案的序号填在括号里_小学四年级数学第五单元训练题,答案非常详细,见过的都保存了...
  4. [c语言]运算符的优先级与结合性
  5. IDEA中配置Python环境并运行
  6. Magedu2_3 linux文件目录
  7. WCF的追踪分析工具——SvcPerf
  8. element中form表单resetFields()方法重置表单无效
  9. 干货分享 |全面总结XSS
  10. github视频教程-03 如何使用github上pull-request功能(VS2013)
  11. html的细节优化,网页页面的细节优化策略
  12. 经验总结:完整做完一款游戏需要经历哪些流程?
  13. 二阶系统阶跃响应实验_二阶系统阶跃响应实验报告
  14. pycharm 输入法光标跟随
  15. Unity WebGL 修改鼠标指针
  16. 如何通俗易懂的跟别人讲一下“人工智能”的发展历史?
  17. python绘制绝对值正弦曲线_Python图形绘制操作之正弦曲线实现方法分析
  18. 【CSS】 画优惠券锯齿边框样式
  19. Linux的安装、连接、系统优化
  20. 发表论文介绍(计算机类)

热门文章

  1. 【云周刊】第200期:云栖专辑 | 阿里开发者们的第6个感悟:享受折磨
  2. Java多线程学习(三)volatile关键字
  3. XAML实例教程系列 - 标记扩展(Markup Extensions)
  4. 极简静态 Web 服务器
  5. CenturyLink设定NG-PON2部署阶段 业务、无线回程为初始服务目标
  6. 用eclipse调用远程webservice生成客户端代码
  7. Python面向对象成员修饰符
  8. man ifconfig时提示:-bash: man: command not found
  9. ZooKeeper Watcher注意事项
  10. 解决eclipse打开报错:failed to create the java virtual ma