详解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遍历类中所有成员的方法
Mar 18 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
从django的中间件直接返回请求的方法
May 30 Python
python中字符串的操作方法大全
Jun 03 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 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学习笔记 类的声明与对象实例化
2011/06/13 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
2017/09/14 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
node使用request请求的方法
2019/12/20 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
js实现金山打字通小游戏
2020/07/24 Javascript
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
python导入pandas具体步骤方法
2019/06/23 Python
Python数组并集交集补集代码实例
2020/02/18 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
丑小鸭教学反思
2014/02/03 职场文书
12月红领巾广播稿
2014/02/13 职场文书
开学典礼演讲稿
2014/05/23 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
环境卫生整治简报
2015/07/20 职场文书