直方图均衡化的原理及实现

一、直方图

1.1 直方图的概念

在图像处理中, 经常用到直方图, 如颜色直方图、 灰度直方图等。

图像的灰度直方图就描述了图像中灰度分布情况, 能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级的函数, 描述的是图像中具有该灰度级的像素的个数: 其中, 横坐标是灰度级, 纵坐标是该灰度级出现的率。如下图所示


1.2 直方图的性质

① 直方图反映了图像中的灰度分布规律。 它描述每个灰度级具有的像素个数, 但不包含这些像素在图像中的位置信息。 图像直方图不关心像素所处的空间位置, 因此不受图像旋转和平移变化的影响, 可以作为图像的特征。

② 任何一幅特定的图像都有唯一的直方图与之对应, 但不同的图像可以有相同的直方图。

③如果一幅图像有两个不相连的区域组成, 并且每个区域的直方图已知, 则整幅图像的直方图是该两个区域的直方图之和。

1.3 直方图的应用

下图是四种常见的直方图的灰度分布规律

如果需要将上图中灰度偏暗、偏亮或偏集中的直方图调整为灰度均匀分布的直方图,就需要用到直方图均衡化算法。

二、直方图均衡化

2.1 直方图均衡化的概念

直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布通过累积分布函数变成近似均匀分布,从而增强图像的对比度。为了将原图像的亮度范围进行扩展, 需要一个映射函数, 将原图像的像素值均衡映射到新直方图中, 这个映射函数有两个条件:

①不能打乱原有的像素值大小顺序, 映射后亮、 暗的大小关系不能改变;

② 映射后必须在原有的范围内,即像素映射函数的值域应在0和255之间;

综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

2.2 累积分布函数的数学原理

因为图像由一个个像素点组成,所以图像直方图均衡化是通过离散形式的累积分布函数求解的,直方图均衡化过程中,映射方法是:

其中,s_k指当前灰度级经过累积分布函数映射后的值,n是图像中像素的总和,n_j是当前灰度级的像素个数,L是图像中的灰度级总数。

(直方图均衡化数学原理,详细查看:> https://blog.csdn.net/superjunenaruto/article/details/52431941)

2.3 直方图均衡化的步骤

①依次扫描原始灰度图像的每一个像素, 计算出图像的灰度直方图;

②计算灰度直方图的累积分布函数;

③根据累积分布函数和直方图均衡化原理得到输入与输出之间的映射关系。

④最后根据映射关系得到结果进行图像变换

2.4 参考下面这个例子可以更直观的理解直方图均衡化的原理及过程

三、代码块及实现效果

3.1 代码块

import cv2
import numpy as np
from matplotlib import pyplot as plt'''
calcHist-计算图像直方图
函数原型:calcHist(images,channels,mask,histSize,ranges,hist=None,accumulate=None)
images:图像矩阵,例如:[image]
channels:通道数,例如:0
mask:掩膜,一般为:None
histSize:直方图大小,一般等于灰度级数
ranges:横轴范围
'''# 获取灰度图像
img = cv2.imread("D:\pycharm\exercise\spring festival holiday\lenna.PNG", 0)# 灰度图像的直方图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure()#新建一个图像
plt.title("Grayscale Histogram")
plt.xlabel("Bins")#X轴标签
plt.ylabel("# of Pixels")#Y轴标签
plt.plot(hist)
plt.xlim([0,256])#设置x坐标轴范围
plt.show()'''
equalizeHist—直方图均衡化
函数原型: equalizeHist(src, dst=None)
src:图像矩阵(单通道图像)
dst:默认即可
'''
# 灰度图像直方图均衡化
dst = cv2.equalizeHist(img)# 直方图
hist = cv2.calcHist([dst],[0],None,[256],[0,256])plt.figure()
plt.hist(dst.ravel(), 256)
plt.show()cv2.imshow("Histogram Equalization",np.hstack([img, dst]))
cv2.waitKey(0)

3.2 处理效果

源图直方图

均衡化处理后的直方图

源图与均衡化处理后的对比效果

3.3 彩色直方图均衡化代码块

# 彩色图像直方图均衡化
img = cv2.imread("lenna.png", 1)
cv2.imshow("src", img)# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst_rgb", result)cv2.waitKey(0)

四、参考资料:

1、直方图均衡化原理:https://www.cnblogs.com/tianyalu/p/5687782.html

2、直方图均衡化的数学原理:https://blog.csdn.net/superjunenaruto/article/details/52431941

3、直方图均衡化方面的知识和方法:https://zhuanlan.zhihu.com/p/44918476

直方图均衡化的原理及实现相关推荐

  1. 直方图均衡化算法原理及bins的理解

    原理部分转载于:直方图均衡化算法原理与实现 bin的理解和直观展示见 part2 part1 直方图均衡化算法原理 我们知道提高图像对比度的变换函数f(x)需要满足以下条件: f(x)在0<=x ...

  2. opencv基础---直方图均衡化(原理equalizeHist)

    直方图均衡化的作用是图像增强. 有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布. 第一个问题.均衡化过程中,必须要保证两个条件:①像素无论怎么映射, ...

  3. 直方图均衡化算法原理详解

    算法 经典算法 下面以一幅3*2像素的简单图片(图C)为例,来说明灰度直方图均衡化的算法. (图C) 图C的直方图: 注意看百分位(Percentile)这一项.一般软件的百分位是 当前色阶的像素数量 ...

  4. 限制对比度自适应直方图均衡化算法原理、实现及效果

    一.自适应直方图均衡化(Adaptive histgram equalization/AHE) 1.简述 自适应直方图均衡化(AHE)用来提升图像的对比度的一种计算机图像处理技术.和普通的直方图均衡算 ...

  5. 线性变换,分段线性变换,伽马变换,直方图正规化,直方图均衡化,局部自适应直方图均衡化的原理以及python代码

    1.基础概念 1.1 图像灰度直方图 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率.图像的对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度 ...

  6. OpenCV图像处理学习二十,图像直方图均衡化原理与实现

    一.图像直方图的概念 图像直方图,是指对整个图像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图.直方图反映了图像灰度的分布情况,是图像的统计学特征.图像的灰度直方 ...

  7. 对比度受限直方图均衡化CLAHE算法原理及Opencv C++代码实现

    在上一篇博客中讲解了直方图均衡化的原理. 一文深入理解直方图均衡化的原理 虽然直方图均衡简单.高效:但是,图像中不同的区域灰度分布相差甚远,对它们使用同一种变换常常产生不理想的效果: 实际应用中,常常 ...

  8. 直方图均衡化原理与实现

    直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布变成近似均匀分布,从而增强图像的对比度.直方图 ...

  9. python图像直方图与直方图均衡化

    图像直方图以及灰度与彩色图像的直方图均衡化 图像直方图: 图像的直方图用来表征该图像像素值的分布情况.用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目 ...

  10. python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...

最新文章

  1. 大数据学习——sparkRDD
  2. python属性使用教程_Python对象的属性访问过程详解
  3. Head First JSP---随笔九(部署Web应用)
  4. java 求数组最大子序列之和
  5. ES6前端就业课第三课之class
  6. ElasticSearch5.5.1插件分类
  7. vue中异步组件的使用与配置说明
  8. 如何在屏幕实时显示自己键盘的输入字符?
  9. 微信公众号url服务器在哪里,微信公众号url认证(服务器认证)
  10. Win7 局域网内访问Sql2005
  11. Mo's Algorithm
  12. java ee无法安装_为什么要导入javax.servlet。*; 安装Java EE仍无法解决 面向Java EE开发人员的Eclipse...
  13. kaggle:PUBG Finish Placement Prediction
  14. java进销存系统源码_青云源码——最新企业进销存管理系统源码分享
  15. MAGIX Sound Forge Audio Studio v16.0.0.39 WiN 音频编辑软件
  16. 把失败看成常态 把成功当作偶然”——与庞加莱猜想“封顶”者之一、中山大学教授朱熹平面对面
  17. 【Al TIME】博硕论坛064期 | 清华计算机系大佬齐论Al
  18. Java对比GO的优劣势
  19. 目前最好的python教程_目和毫米的换算
  20. 谈我们为什么学不好编程2——你是否已进入“等死模式”?

热门文章

  1. 大数据学习笔记60:构建Spark机器学习系统
  2. 微软内置真正linux_如何使用Microsoft Word的内置屏幕截图工具
  3. Soui教程_v20201024
  4. 蓝丝雨零基础DNF脚本开发速成系列
  5. android 横向长图,Android实现截超长图
  6. c语言的开发环境的下载,Windows安装C语言开发环境
  7. 修改ns服务器,修改你的域名ns服务器地址
  8. unity直播推流方式_干货,抖音无人直播技术(建议收藏)
  9. ant design vue离线文档
  10. 《Python金融大数据风控建模实战》 第5章 变量编码方法