直方图均衡化是一种图像处理方法,用来提高图像的对比度,本博客涉及到直方图的应用PYTHON+OPENCV2

如果一个图像的像素取值范围在很狭窄的一个区域内,那么图像的细节就不是那么的明显,如果可以将图像的像素分布范围均衡化,那么能够提高图像的对比度,如下图所示:

使用python+opencv2计算一幅图像的直方图,图像如下图:

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('wiki.jpg',0)
hist,bins = np.histogram(img.flatten(),256,[0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()
plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()


由直方图可以发现,图像的像素分布相对较狭窄。
进行直方图均衡化:

cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')
img2 = cdf[img]

此时img2即为均衡化之后的图像,我们重新计算其像素直方图得到下图:

对比度明显提高,细节也相对明显了一些。
有时候数据集中的图像数据是在不同的光照下或者场景下拍到的,比如说人脸的照片,通过直方图均衡化,面部识别中,在训练面部数据之前,将面部图像均衡化以使它们全部具有相同的照明条件。

Histograms Equalization in OpenCV 自带函数应用

opencv中有自带的函数 cv2.equalizeHist()它的输入只能是灰度图,输出是直方图均衡化后的图像。
代码:

img = cv2.imread('wiki.jpg',0)
equ = cv2.equalizeHist(img)
res = np.hstack((img,equ)) #stacking images side-by-side
cv2.imwrite('res.png',res)

得到的结果:

所以现在你可以拍摄不同光线条件的不同图像,均衡它并检查结果。
当图像的直方图被限制在特定区域时,直方图均衡是好的。 在直方图覆盖大区域的强度变化较大的地方,即存在亮像素和暗像素时,它将无法正常工作。

CLAHE(对比度有限自适应直方图均衡)

我们刚看到的第一个直方图均衡,考虑了图像的全局对比度。 在许多情况下,这不是一个好主意。 例如,下图显示了全局直方图均衡后的输入图像及其结果。

确实,直方图均衡后背景对比度有所改善。但比较两个图像中的雕像的脸。由于亮度过高,我们丢失了大部分信息。这是因为它的直方图并不局限于特定区域,正如我们在之前的案例中看到的那样(尝试绘制输入图像的直方图,您将获得更多的直觉)。

因此,为了解决这个问题,使用自适应直方图均衡。在此,图像被分成称为“图块”的小块(在OpenCV中,tileSize默认为8x8)。然后像往常一样对这些块中的每一个进行直方图均衡。所以在一个小区域内,直方图会限制在一个小区域(除非有噪音)。如果有噪音,它会被放大。为避免这种情况,应用对比度限制。如果任何直方图区间高于指定的对比度限制(在OpenCV中默认为40),则在应用直方图均衡之前,将这些像素剪切并均匀分布到其他区间。均衡后,为了去除图块边框中的瑕疵,应用双线性插值。

下面的代码片段显示了如何在OpenCV中应用CLAHE:

import numpy as np
import cv2img = cv2.imread('tsukuba_l.png',0)
# create a CLAHE object (Arguments are optional).
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv2.imwrite('clahe_2.jpg',cl1)

得到的改善结果:


参考资料:

  1. 直方图均衡化(Histogram equalization)与直方图规定化
  2. Histograms - 2: Histogram Equalization
  3. Wikipedia page on Histogram Equalization

直方图均衡图像对比度(histogram equalization)PYTHON+OPENCV2相关推荐

  1. opencv图像对比度亮度调节

    图像对比度亮度调节 #include <opencv2/highgui.hpp> #include <iostream>using namespace std; using n ...

  2. Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)

    Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization) ############ ...

  3. 数字图像处理:直方图均衡(Histogram Equalization)的原理及处理介绍

    一.引言 本系列文章记录老猿自学冈萨雷斯<数字图像处理>的感悟和总结,不过估计更新会比较慢,白天要工作,都是晚上抽空学习,学习完一章再回头总结,想学的朋友可以自己下载英文原版(目前到第四版 ...

  4. OpenCV直方图均衡Histogram Equalization

    OpenCV直方图均衡Histogram Equalization 直方图均衡Histogram Equalization 目标 理论 什么是图像直方图? 什么是直方图均衡化? 它是如何工作的? 代码 ...

  5. python图像对比度增强图片清晰度_Python 图像对比度增强的几种方法(小结)

    图像处理工具--灰度直方图 灰度直方图时图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率. 例子:矩阵 图片来自网络,侵删! 上面图片的灰度直方图 python实现 #!usr/b ...

  6. Python+OpenCV:直方图均衡化(Histogram Equalization)

    Python+OpenCV:直方图均衡化(Histogram Equalization) ####################################################### ...

  7. opencv Histogram Equalization 直方图均衡。

    在本节中, 我们将学习直方图均衡化的概念,并使用它来提高我们图像的对比度. Theory 考虑一幅图像,它的像素值被限制在一些特定的值范围内.例如,更亮的图像将所有像素限制在高值.但是一个好的图像应该 ...

  8. python histogram equalization

    python 实现直方图等化(histogram equalization) Digital image processing中的Histogram equalization 的作用是强化对比度,也就 ...

  9. Python 图像对比度增强的几种方法

    Python 图像对比度增强的几种方法 图像处理工具--灰度直方图 python实现 结果 线性变换 线性变换python实现 线性变换结果 直方图正规化 直方图正规化python实现 直方图正规化结 ...

  10. python opencv图像对比度增强_图像增强、锐化, Python-OpenCV 来实现 4 种方法!

    图像增强目的使得模糊图片变得更加清晰.图片模糊的原因是因为像素灰度差值变化不大,如片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉 解决这个问题的最直接简单办法,放大像素灰 ...

最新文章

  1. TensorFlow(1)TensorFlow基础(整体介绍)
  2. 脑机综述(一) | 脑机接口在康复医学中的应用进展
  3. python3知识点之---------字符串的介绍
  4. 自定义input[type=file]的兼容样式
  5. 洛谷P1120小木棒 爆搜+剪枝
  6. pandas操作sql数据库
  7. UICollectionView 应用
  8. FireBug 调试JS
  9. 【英语学习】【加州教材】【G5】【科学】Science目录及术语表
  10. M1芯片Macbook最简单从11.3降级到11.2.3教程
  11. 计算机CG技术未来发展前景,CG就业前景怎么样?
  12. Nintendo Switch 解砖指引(翻译)
  13. 较强冷空气影响中东部地区 江南华南等地有小到中雨
  14. sun.net.ftp.FtpClient介绍
  15. h3c交换机重启_h3c交换机重置命令_h3c交换机如何初始化
  16. 【微软 Azure 认知服务】零基础搭建微软 Azure AI 认知服务实验分享
  17. 如何让爆满的C盘腾出 10G空间
  18. 使用aspose.word.for.java解析word文档图片并替换
  19. linux内核和发行版有什么区别?附镜像包以及如何查看Linux系统内核版本和发行版本
  20. ASEMI线性稳压电源芯片AMS1117-3.3参数及接线电路图

热门文章

  1. poj1836——dp,最长上升子序列(lis)
  2. [javascript] Promise API
  3. [转][Lucene.Net] 基本用法
  4. 关于Qt学习之路2:8、添加动作 这一节课 发现里面的程序运行后没有图标
  5. 线程编程(thread programming)介绍
  6. 所有子模块都要执行的checkstyle检查
  7. Linux的巡检命令
  8. 为什么Windows7打开项目的方式是灰的不能修改
  9. asp.net 中http协议及相关知识(零碎知识记录)
  10. Heap与Stack的区别(转载,刚看到的)