python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化
本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下:
官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_histogram_equalization.html
考虑一个图像,其像素值仅限制在特定的值范围内。例如,更明亮的图像将使所有像素都限制在高值中。但是一个好的图像会有来自图像的所有区域的像素。所以你需要把这个直方图拉伸到两端(如下图所给出的),这就是直方图均衡的作用(用简单的话说)。这通常会改善图像的对比度。
建议阅读关于直方图均衡的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()
你可以看到,直方图位于更亮的区域。我们需要完整的频谱。为此,我们需要一个转换函数,它将更亮区域的输入像素映射到全区域的输出像素。这就是直方图均衡所做的。
现在我们找到了最小的直方图值(不包括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,就像之前一样,结果如下:
另一个重要的特征是,即使图像是一个较暗的图像(而不是我们使用的更亮的图像),在均衡之后,我们将得到几乎相同的图像。因此,它被用作一种“参考工具”,使所有的图像都具有相同的光照条件。这在很多情况下都很有用。例如,在人脸识别中,在对人脸数据进行训练之前,人脸的图像是均匀的,使它们具有相同的光照条件。
OpenCV中的直方图均衡化
OpenCV有一个函数可以这样做,cv.equalizeHist()。它的输入只是灰度图像,输出是我们的直方图均衡图像。
img = cv.imread('wiki,jpg', 0)
equ = cv.equalizeHist(img)
res = np.hstack((img, equ)) # 并排叠加图片
cv.imwrite('res.png', res)
所以现在你可以用不同的光条件来拍摄不同的图像,平衡它,并检查结果。
当图像的直方图被限制在一个特定的区域时,直方图均衡是很好的。在那些有很大强度变化的地方,直方图覆盖了一个大区域,比如明亮的和暗的像素,这样的地方就不好用了。
CLAHE(对比有限的自适应直方图均衡/Contrast Limited Adaptive Histogram Equalization)
我们刚刚看到的第一个直方图均衡化,考虑到图像的全局对比。在很多情况下,这不是一个好主意。例如,下图显示了一个输入图像及其在全局直方图均衡之后的结果。
在直方图均衡化之后,背景对比得到了改善。但是比较两幅图像中的雕像的脸。由于亮度过高,我们丢失了大部分的信息。这是因为它的直方图并不局限于一个特定的区域,就像我们在前面的例子中看到的那样。
为了解决这个问题,可以使用了自适应直方图均衡。在这一点上,图像被划分为几个小块,称为“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学习笔记之直方图均衡化
本文地址: http://www.cppcns.com/jiaoben/python/220098.html
python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化相关推荐
- python归一化处理_详解python实现数据归一化处理的方式:(0,1)标准化
在机器学习过程中,对数据的处理过程中,常常需要对数据进行归一化处理,下面介绍(0, 1)标准化的方式,简单的说,其功能就是将预处理的数据的数值范围按一定关系"压缩"到(0,1)的范 ...
- python列表拆包_详解python 拆包可迭代数据如tuple, list
详解python 拆包可迭代数据如tuple, list 拆包是指将一个结构中的数据拆分为多个单独变量中. 以元组为例: >>> a = ('windows', 10, 25.1, ...
- python操作目录_详解python中的文件与目录操作
详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...
- python模式匹配算法_详解Python 最短匹配模式
问题 你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配. 而你想修改它变成查找最短的可能匹配. 解决方案 这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字 ...
- python xlrd安装_详解python中xlrd包的安装与处理Excel表格
一.安装xlrd 地址 下载后,使用 pip install .whl安装即好. 查看帮助: >>> import xlrd >>> help(xlrd) Help ...
- python制作界面_详解python做UI界面的方法
详解python做UI界面的方法 更新时间:2019年02月27日 14:44:34 投稿:laozhang 在本文里我们给大家整理了关于python做UI界面的方法和具体步骤,对此有需要的朋友们可以 ...
- python namedtuple用法_详解Python中namedtuple的使用
namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...
- python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...
- python udp编程_详解python UDP 编程
前面我们讲了 TCP 编程,我们知道 TCP 可以建立可靠连接,并且通信双方都可以以流的形式发送数据.本文我们再来介绍另一个常用的协议–UDP.相对TCP,UDP则是面向无连接的协议. UDP 协议 ...
最新文章
- MySQL日期函数的用法几则
- python编程思路不清晰_安利一波Python编程中非常实用的那些黑魔法
- server2003进入oracle,windows server 2003安装oracle
- android自定义游戏闯关图,Android自定义View(四) -- Canvas
- 可见光能量范围_JACS:游书力团队通过可见光促进的吲哚衍生物分子内去芳构化合成环丁烷稠合的四环吲哚螺环...
- pythonturtle画点的指令_简述python的turtle绘画命令及解释
- java ajax传输图片_Java使用Ajax实现跨域上传图片功能
- python中keyboardinterrupt_为什么我不能在python中处理KeyboardInterrupt?
- python爬虫系列:做一个简单的动态代理池
- 蚂蚁回应渠道之争;微软更新致大规模服务中断;OpenSSH 8.4 发布 | 极客头条
- 案例 自动办公_国浩分享 | 非诉讼律师办公神器盘点
- c 语言游戏代码大全,C语言经典游戏代码
- AdminLTE-2.4.10源码包
- ps基础入门3-文字样式
- elasticsearch中基于slop参数实现近似匹配
- 阿里云账号注册流程方法(图文教程)
- DevOps/SRE 成长计划
- 认识Oracle DBFS文件系统
- 【BZOJ 1064】【NOI 2008】假面舞会
- eNSP第二篇:Eth-trunk,链路聚合,常用命令,二层链路聚合和三层链路聚合