直方图均衡化

想象一下,如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很广泛。所以你应该把它的直方图做一个横向拉伸(如下图),这就是直方图均衡化要做的事情。通常情况下,这种操作会改善图像的对比度。

直方图均衡.jpg

这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。

我们先来看看相应的直方图和累积直方图,然后使用 OpenCV 进行直方图均衡化。

def img_show(name,image):

"""matplotlib图像显示函数

name:字符串,图像标题

img:numpy.ndarray,图像

"""

if len(image.shape) == 3:

image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)

plt.imshow(image,'gray')

plt.xticks([])

plt.yticks([])

plt.xlabel(name,fontproperties='FangSong',fontsize=12)

if __name__=="__main__":

img = cv2.imread("data/Unequalized.jpg",0)

hist,bins = np.histogram(img.flatten(),256,[0,256])

#print(hist)

#查看累积直方图

cdf = hist.cumsum()

cdf_normalized = cdf*hist.max() / cdf.max()

#print(cdf_normalized)

#均衡化

equ = cv2.equalizeHist(img)

hist1,bins1 = np.histogram(equ.flatten(),256,[0,256])

#print(hist)

#查看均衡化后的累积直方图

cdf1 = hist1.cumsum()

cdf_normalized1 = cdf1*hist1.max() / cdf1.max()

#显示图像结果

plt.figure(figsize=(10,8),dpi=100)

plt.subplot(221)

img_show('原图',img)

plt.subplot(222)

img_show('均衡化后',equ)

plt.subplot(223)

plt.plot(cdf_normalized,color='b')

plt.hist(img.flatten(),256,[0,256],color='r')

plt.xlabel('相应的直方图(红)和累积直方图(蓝)',fontproperties='FangSong',fontsize=15)

plt.xlim([0,256])

plt.legend(('cdf','historgram'),loc = 'upper left')

plt.subplot(224)

plt.plot(cdf_normalized1,color='b')

plt.hist(equ.flatten(),256,[0,256],color='r')

plt.xlabel('均衡化相应的直方图(红)和累积直方图(蓝)',fontproperties='FangSong',fontsize=15)

plt.xlim([0,256])

plt.legend(('cdf','historgram'),loc = 'upper left')

plt.show()

直方图均衡化.png

我们可以看出来直方图大部分在灰度值较高的部分,而且分布很集中。而我们希望直方图的分布比较分散,能够涵盖整个 x 轴。所以,我们就需要一个变换函数帮助我们把现在的直方图映射到一个广泛分布的直方图中,这就是直方图均衡化。

**限制对比度自适应性直方图均衡化 CLAHE **

在上边做的直方图均衡化会改变整个图像的对比度,但是在很多情况下,这样做的效果并不好。的确在进行完直方图均衡化之后,图片背景的对比度被改变了。但是你再对比一下两幅图像中雕像的面图,由于太亮我们丢失了很多信息。

直方图均衡化.png

原理:

为了解决这个问题,我们需要使用自适应的直方图均衡化CLAHE (Contrast Limited Adaptive Histogram Equalization)。这种情况下,整幅图像会被分成很多小块,这些小块被称为“tiles”(在 OpenCV 中 tileGridSize默认是 8x8),然后再对每一个小块分别进行直方图均衡化(跟前面类似)。所以在每一个的区域中,直方图会集中在某一个小的区域中(除非有噪声干扰)。如果有噪声的话,噪声会被放大。为了避免这种情况的出现,要使用对比度限制。

CLAHE中,每一个像素邻域都要进行对比度限制,从而得到对应的变换函数,被用来降低AHE中噪声的增强,这主要是通过限制AHE中的对比度增强来实现的。像素周围邻域噪声的增强主要是由变换函数的斜率造成的,由于像素邻域的噪声与邻域的CDF成正比,因此也与邻域直方图在该中心像素位置的值成正比,CLAHE之所以能够限制对比度,是因为它在计算邻域的CDF之前在指定阈值处对直方图进行了修剪,如下图所示,这一做法不仅限制了CDF的斜率,也限制了变换函数的斜率,其中对直方图进行切割所使用的阈值,被称作修剪限制度(clip limit),这个参数不仅依赖于直方图的归一化,而且依赖于像素邻域的size大小,通常设为3到4之间。

cliplimit.jpg

对于每个小块来说,如果直方图中的 bin 超过对比度的上限的话,就把其中的像素点均匀分散到其他 bins 中,然后在进行直方图均衡化。最后,为了去除每一个小块之间“人造的”(由于算法造成)边界,再使用双线性差值,与原图做图层滤色混合操作(可选)。

实现:

def img_show(name,image):

"""matplotlib图像显示函数

name:字符串,图像标题

img:numpy.ndarray,图像

"""

if len(image.shape) == 3:

image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)

plt.imshow(image,'gray')

plt.xticks([])

plt.yticks([])

plt.xlabel(name,fontproperties='FangSong',fontsize=12)

if __name__=="__main__":

img = cv2.imread("data/tsukuba_l.jpg",0)

hist,bins = np.histogram(img.flatten(),256,[0,256])

#print(hist)

#查看累积直方图

cdf = hist.cumsum()

cdf_normalized = cdf*hist.max() / cdf.max()

#print(cdf_normalized)

#均衡化

clahe = cv2.createCLAHE(clipLimit =2.0,tileGridSize=(8,8))

equ = clahe.apply(img)

hist1,bins1 = np.histogram(equ.flatten(),256,[0,256])

#print(hist)

#查看均衡化后的累积直方图

cdf1 = hist1.cumsum()

cdf_normalized1 = cdf1*hist1.max() / cdf1.max()

#显示图像结果

plt.figure(figsize=(10,8),dpi=100)

plt.subplot(221)

img_show('原图',img)

plt.subplot(222)

img_show('自适应均衡化',equ)

plt.subplot(223)

plt.plot(cdf_normalized,color='b')

plt.hist(img.flatten(),256,[0,256],color='r')

plt.xlabel('相应的直方图(红)和累积直方图(蓝)',fontproperties='FangSong',fontsize=15)

plt.xlim([0,256])

plt.legend(('cdf','historgram'),loc = 'upper left')

plt.subplot(224)

plt.plot(cdf_normalized1,color='b')

plt.hist(equ.flatten(),256,[0,256],color='r')

plt.xlabel('自适应均衡化直方图',fontproperties='FangSong',fontsize=15)

plt.xlim([0,256])

plt.legend(('cdf','historgram'),loc = 'upper left')

plt.show()

自适应均衡化.png

参考文献:

网址:直方图均衡化

Adaptive_histogram_equalization

书籍:《数字图像处理》《OpenCV-Python 中文教程》

opencv曝光过度_直方图均衡化相关推荐

  1. 不调用python函数实现直方图均衡化_直方图均衡化(HE)

    前面我们已经讲过图像的直方图,那图像的直方图均衡化又是干嘛的呢? 顾名思义:其实对直方图进行均衡化,哈哈感觉自己说的就是废话... 举个例子: import cv2 from matplotlib i ...

  2. OpenCV 自适应的直方图均衡化

    自适应的直方图均衡化 整幅图像会被分成很多小块,这些小块被称为"tiles".然后再对每一个小块分别进行直方图均衡化.如果有噪声的话,噪声会被放大.为了避免这种情况的出现要使用对比 ...

  3. 【opencv】20.直方图均衡化的数学原理

    本文只讲数字图像处理,即离散化后的公式,至于积分形式的分析,网上很多. 具体的数学推导可以参考这篇博客直方图均衡化. 如果想自己代码实现直方图均衡化,相关源代码可以参考(不使用api)使用C++实现彩 ...

  4. Opencv——灰度变换、直方图均衡化

    1.代码如下: #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main ...

  5. python opencv 直方图均衡_Python+OpenCV:全局直方图均衡化、局部直方图自适应均衡化、直方图比较(Python版)...

    1. 全局直方图均衡化 cv2.equalizeHist(src, dst=None)函数只能处理单通道的数据,src为输入图像对象矩阵,必须为单通道的uint8类型的矩阵数据.直方图均衡化可以看作是 ...

  6. opencv曝光过度_图像增强 Image Enhancement

    图像增强(Image Enhancement),其目的是要改善图像的视觉效果. 自动色阶 作用:自动调整图像中的黑白场. 原理:剪切每个通道中的阴影和高光部分,并将每个颜色通道中最亮或最暗的像素映射到 ...

  7. python批量直方图均衡化_直方图均衡化-Python实现

    需要均衡的图像 将下面的图像进行直方图均衡 1 3 9 9 8 2 1 3 7 3 3 6 0 6 4 6 8 2 0 5 2 9 2 6 0 均衡化计算过程 使用python进行直方图均衡化: # ...

  8. opencv曝光过度_使用 OpenCV 进行曝光融合(Exposure Fusion)成像

    在本教程中,我们将学习使用OpenCV的Exposure Fusion.我们将使用C ++和Python共享代码. 什么是曝光融合?曝光融合是一种将使用不同曝光设置拍摄的图像组合成一个看起来像色调映射 ...

  9. opencv曝光过度_软件开发|使用 OpenCV 进行高动态范围(HDR)成像

    在本教程中,我们将学习如何使用由不同曝光设置拍摄的多张图像创建高动态范围High Dynamic Range(HDR)图像. 我们将以 C++ 和 Python 两种形式分享代码. 什么是高动态范围成 ...

最新文章

  1. 揭晓飞桨平台提速秘诀:INT8量化加速实现“事半功倍”
  2. Linux 运维工程师的十个基本技能点
  3. JZOJ 3769. 【NOI2015模拟8.14】A+B
  4. 如何通过ActivationStart监控 Angular的路由激活事件
  5. 基于 Azure 的认知服务将文本合成语音
  6. 比赛一买香蕉问题---解题报告
  7. 开发指南专题三:JEECG微云快速开发平台项目编码规范
  8. 应用实例_兴达奇智能燃烧控制器BMU460DP现场应用实例图
  9. 使用vue创建自己的项目
  10. CentOS 6.9之LVM创建,扩容
  11. 实习生去公司都干些啥
  12. 指数分布(一种连续分布)、爱尔朗分布
  13. 深拖式多道高分辨率地震探测系统
  14. 古典概型——概率论与数理统计(宋浩)
  15. HMAC-SHA1加密算法c++与java的实现
  16. 为什么说串行比并行速度快?
  17. html颜色趋势,跟上色彩潮流!带你展望2015年的网页设计配色趋势
  18. 1002 写出这个数 (C语言实现)
  19. MFC中TeeChart插件绘图
  20. WCS系统结构逻辑实现

热门文章

  1. 服务器数据库系统,服务器数据库系统
  2. 爱菠萝V1-3600M更爱JASMINER-茉莉XAQ,成年人不做选择
  3. linux的一些学习笔记
  4. 微信小程序的开发框架
  5. 凝聚安防正能量 华安泰坚定细分市场发展之路
  6. 用Java实现抖音等各种小视频批量转换为gif动态图
  7. 产品经理应该知道的那些专业术语
  8. python两个除号什么意思_python除号_python中除号_python中的除号 - 云+社区 - 腾讯云...
  9. js时间搓化为今天明天_JavaScript获取时间戳与时间戳转化
  10. 《机器学习—李宏毅》lecture1