详解python OpenCV学习笔记之直方图均衡化


Posted in Python onFebruary 08, 2018

本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下:

官方文档 ? https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_histogram_equalization.html

考虑一个图像,其像素值仅限制在特定的值范围内。例如,更明亮的图像将使所有像素都限制在高值中。但是一个好的图像会有来自图像的所有区域的像素。所以你需要把这个直方图拉伸到两端(如下图所给出的),这就是直方图均衡的作用(用简单的话说)。这通常会改善图像的对比度。

详解python OpenCV学习笔记之直方图均衡化 

建议阅读关于直方图均衡的wikipedia页面Histogram Equalization,了解更多有关它的详细信息。它给出了一个很好的解释,给出了一些例子,这样你就能在读完之后理解所有的东西。同样,我们将看到它的Numpy实现。之后,我们将看到OpenCV函数。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('wiki.jpg', 0)

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

cdf = hist.cumsum()
cdf_normalized = cdf*float(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()

详解python OpenCV学习笔记之直方图均衡化

你可以看到,直方图位于更亮的区域。我们需要完整的频谱。为此,我们需要一个转换函数,它将更亮区域的输入像素映射到全区域的输出像素。这就是直方图均衡所做的。

现在我们找到了最小的直方图值(不包括0),并应用了在wiki页面中给出的直方图均衡等式。但我用在Numpy的遮罩数组的概念数组上。对于遮罩数组,所有操作都是在非遮罩元素上执行的。

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]

现在我们计算它的直方图和cdf,就像之前一样,结果如下:

详解python OpenCV学习笔记之直方图均衡化

另一个重要的特征是,即使图像是一个较暗的图像(而不是我们使用的更亮的图像),在均衡之后,我们将得到几乎相同的图像。因此,它被用作一种“参考工具”,使所有的图像都具有相同的光照条件。这在很多情况下都很有用。例如,在人脸识别中,在对人脸数据进行训练之前,人脸的图像是均匀的,使它们具有相同的光照条件。

OpenCV中的直方图均衡化

OpenCV有一个函数可以这样做,cv.equalizeHist()。它的输入只是灰度图像,输出是我们的直方图均衡图像。

img = cv.imread('wiki,jpg', 0)
equ = cv.equalizeHist(img)
res = np.hstack((img, equ)) # 并排叠加图片
cv.imwrite('res.png', res)

详解python OpenCV学习笔记之直方图均衡化

所以现在你可以用不同的光条件来拍摄不同的图像,平衡它,并检查结果。

当图像的直方图被限制在一个特定的区域时,直方图均衡是很好的。在那些有很大强度变化的地方,直方图覆盖了一个大区域,比如明亮的和暗的像素,这样的地方就不好用了。

CLAHE(对比有限的自适应直方图均衡/Contrast Limited Adaptive Histogram Equalization)

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

详解python OpenCV学习笔记之直方图均衡化

在直方图均衡化之后,背景对比得到了改善。但是比较两幅图像中的雕像的脸。由于亮度过高,我们丢失了大部分的信息。这是因为它的直方图并不局限于一个特定的区域,就像我们在前面的例子中看到的那样。

为了解决这个问题,可以使用了自适应直方图均衡。在这一点上,图像被划分为几个小块,称为“tiles”(在OpenCV中默认值是8x8)。然后每一个方块都是像平常一样的直方图。因此,直方图会限制在一个小区域(除非有噪声)。如果噪音在那里,它就会被放大。为了避免这种情况,会应用对比限制。如果任何直方图bin超出指定的对比度限制(默认情况下是40),在应用直方图均衡之前,这些像素被裁剪并均匀地分布到其他bin。均衡后,删除边界中的工件,采用双线性插值。

cv.createCLAHE([, clipLimit[, tileGridSize]])

import numpy as np
import cv2 as cv

img = cv.imread('tsukuba_1.png', 0)

# create a CLAHE object (Arguments are optional).
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)

cv.imread('clahe_2.jpg', cl1)

详解python OpenCV学习笔记之直方图均衡化

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取本地计算机名字的方法
Apr 29 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
pandas中Timestamp类用法详解
Dec 11 Python
python实现windows下文件备份脚本
May 27 Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
python ChainMap 合并字典的实现步骤
Jun 11 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 Python
python OpenCV学习笔记实现二维直方图
Feb 08 #Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 #Python
Python编程argparse入门浅析
Feb 07 #Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 #Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 #Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 #Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 #Python
You might like
php正则
2006/07/07 PHP
一个多文件上传的例子(原创)
2006/10/09 PHP
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
使用Apache的rewrite
2021/03/09 Servers
javascript中的对象创建 实例附注释
2011/02/08 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Python 文件操作的详解及实例
2017/09/18 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
给老婆大人的检讨书
2014/02/24 职场文书
销售人员工作自我评价
2014/09/21 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技