Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >opencv(4.5.3)-python(二十四)--直方图均衡化

opencv(4.5.3)-python(二十四)--直方图均衡化

作者头像
用户9875047
发布于 2023-02-26 07:13:29
发布于 2023-02-26 07:13:29
1.2K00
代码可运行
举报
文章被收录于专栏:机器视觉全栈er机器视觉全栈er
运行总次数:0
代码可运行

翻译及二次校对:cvtutorials.com

目标

在本节中:

  • • 我们将学习直方图均衡化的概念,并利用它来改善我们图像的对比度。

理论

考虑一个图像,其像素值只局限于某些特定的数值范围。例如,较亮的图像将有所有的像素限制在高值。但是一个好的图像会有来自图像所有区域的像素。因此,你需要将这个直方图拉伸到两端(如下图所示,来自维基百科),这就是直方图均衡化的作用(简单地说)。这通常会改善图像的对比度。

我建议你阅读关于直方图均衡化的维基百科页面,以了解更多相关细节。它有一个非常好的解释,并有例子,所以在阅读后你会理解几乎所有的东西。相反,在这里我们将看到它的Numpy实现。之后,我们将看到OpenCV函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中的掩膜数组概念。对于掩膜数组,所有的操作都是在非掩膜的元素上进行的。你可以从Numpy关于掩膜数组的文档中读到更多关于它的信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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')

现在我们有了查找表,它为我们提供了关于每个输入像素值的输出像素值的信息。所以我们只需应用转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img2 = cdf[img]

现在我们像以前一样计算它的直方图和Cdf(你来做),结果看起来像下面。

另一个重要的特点是,即使图像是一个较暗的图像(而不是我们使用的一个较亮的图像),在均衡后,我们将得到与上述图像几乎相同的图像。因此,这被用作一个 "参考工具",使所有图像具有相同的照明条件。这在许多情况下是很有用的。例如,在人脸识别中,在训练人脸数据之前,对人脸图像进行直方图均衡化,使其具有相同的照明条件。

OpenCV中的直方图均衡化

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

下面是一个简单的代码片段,显示了它在我们使用的同一图像上的用法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img = cv.imread('wiki.jpg',0)
equ = cv.equalizeHist(img)
res = np.hstack((img,equ)) #stacking images side-by-side
cv.imwrite('res.png',res)

因此,现在你可以在不同的光线条件下拍摄不同的图像,对其进行均衡并检查结果。

当图像的直方图被限制在一个特定的区域内时,直方图均衡化是好的。在灰度变化较大的地方,即直方图覆盖较大区域的地方,它不会有好的效果,也就是说,明亮和黑暗的像素都存在。请查看附加资源中的SOF链接。

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

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

诚然,在直方图均衡化之后,背景对比度得到了改善。但比较两张图片中的雕像的脸。由于过亮,我们失去了大部分的信息。这是因为它的直方图并不像我们在以前的案例中看到的那样被限制在一个特定的区域内(试着绘制输入图像的直方图,你会得到更多的直观感受)。

因此,为了解决这个问题,采用了自适应直方图均衡化。在这个过程中,图像被分成小块,称为 "瓦片"(OpenCV中瓦片大小默认为8x8)。然后这些块中的每一个都像往常一样被直方图均衡化。因此,在一个小区域内,直方图将被限制在一个小区域内(除非有噪声)。如果有噪音,它就会被放大。为了避免这种情况,采用了对比度限制。如果任何一个直方图仓超过了指定的对比度限制(在OpenCV中默认为40),在应用直方图均衡化之前,这些像素会被剪掉并均匀地分布到其他仓。在均衡化之后,为了消除瓦片边界的伪影,将应用双线性插值。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import cv2 as cv
img = cv.imread('tsukuba_l.png',0)
# create a CLAHE object (Arguments are optional).
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv.imwrite('clahe_2.jpg',cl1)

请看下面的结果,并与上面的结果进行比较,特别是雕像区域。

其他资源

  1. 1. 维基百科关于直方图均衡化的页面[1]
  2. 2. Numpy中的掩膜数组[2]

还可以查看这些关于对比度调整的SOF问题。

  1. 1. 我如何在OpenCV中用C语言调整对比度?[3]
  2. 2. 如何用opencv均衡图像的对比度和亮度?[4]
引用链接

[1] 维基百科关于直方图均衡化的页面: https://en.wikipedia.org/wiki/Histogram_equalization [2] Numpy中的掩膜数组: https://docs.scipy.org/doc/numpy/reference/maskedarray.html [3] 我如何在OpenCV中用C语言调整对比度?: https://stackoverflow.com/questions/10549245/how-can-i-adjust-contrast-in-opencv-in-c [4] 如何用opencv均衡图像的对比度和亮度?: https://stackoverflow.com/questions/10561222/how-do-i-equalize-contrast-brightness-of-images-using-opencv

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器视觉全栈er 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图像增强 | CLAHE 限制对比度自适应直方图均衡化
CLAHE是一个比较有意思的图像增强的方法,主要用在医学图像上面。之前的比赛中,用到了这个,但是对其算法原理不甚了解。在这里做一个复盘。
机器学习炼丹术
2020/07/23
18.4K0
图像增强 | CLAHE 限制对比度自适应直方图均衡化
图像处理-图像增-自适应直方图均衡化(AHE)、限制对比度自适应直方图均衡(CLAHE)
图像增强—自适应直方图均衡化(AHE)-限制对比度自适应直方图均衡(CLAHE)
AomanHao
2022/01/14
4.3K0
图像处理-图像增-自适应直方图均衡化(AHE)、限制对比度自适应直方图均衡(CLAHE)
OpenCV 图像变换之 —— 直方图均衡化
相机和图像传感器不仅可以适应场景中自然产生的对比度,还可以管理图像传感器在可用的光照水平下的曝光程度。在标准相机中,设置快门和镜头光圈以确保传感器既不太多也不太少。然而,对于传感器的可用动态范围,特定图像中的对比度范围往往太大。因此,捕获需要更长曝光时间的黑暗区域(例如阴影)和需要更短曝光的明亮区域之间存在权衡,以避免饱和“白化”。在许多情况下,在同一个图像中二者不可兼得。
为为为什么
2022/08/09
5920
OpenCV 图像变换之 —— 直方图均衡化
直方图均衡的一些变体算法
上上上上周,数字图片处理课程布置了一个作业,需要看论文实现并比较各种直方图均衡的算法:
caoqi95
2019/04/12
1.2K0
直方图均衡的一些变体算法
15: 直方图
简单来说,直方图就是图像中每个像素值的个数统计,比如说一副灰度图中像素值为0的有多少个,1的有多少个……:
CodecWang
2021/12/07
8370
15: 直方图
OpenCV—python 颜色直方图与直方图均衡化[通俗易懂]
cv2.calcHist(image,channels,mask,histSize,ranges) -> list
全栈程序员站长
2022/09/27
3.5K0
OpenCV系列之直方图-2:直方图均衡 | 二十七
考虑这样一个图像,它的像素值仅局限于某个特定的值范围。例如,较亮的图像将把所有像素限制在高值上。但是一幅好的图像会有来自图像所有区域的像素。因此,您需要将这个直方图拉伸到两端(如下图所示,来自wikipedia),这就是直方图均衡化的作用(简单来说)。这通常会提高图像的对比度。
磐创AI
2019/12/23
1.2K0
OpenCV系列之直方图-2:直方图均衡 | 二十七
【从零学习OpenCV 4】直方图均衡化
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。
小白学视觉
2019/12/24
6800
【从零学习OpenCV 4】直方图均衡化
直方图均衡的一些变体算法
上上上上周,数字图片处理课程布置了一个作业,需要看论文实现并比较各种直方图均衡的算法:
caoqi95
2019/04/18
1.1K0
直方图均衡的一些变体算法
opencv(4.5.3)-python(二十三)--直方图的寻找、绘制、分析
那么什么是直方图?你可以把直方图看作是一种图,它可以让你对图像的灰度分布有一个整体的了解。它是一个在X轴上有像素值(范围从0到255,不一定),在Y轴上有图像中相应像素数的图。
用户9875047
2023/02/26
8300
opencv(4.5.3)-python(二十三)--直方图的寻找、绘制、分析
直方图均衡 Histogram Equalization
在说明直方图均衡之前,先说说亮度直方图的概念。为了评估一个图像的色调转换,首先需要建立亮度直方图。亮度直方图就是图像中亮度分布的图表。在横轴上表示亮度值从黑色到白色;在竖轴上表示某一亮度所累积的像素数量。这里的亮度值指的是灰度等级,范围一般从 0 到 255,0 表示黑色,255 表示白色。
caoqi95
2019/03/28
2.6K0
直方图均衡 Histogram Equalization
直方图均衡化处理
直方图均衡化方法属于图像增强的范畴,是一种对图像进行灰度级修正的方法。简而言之,就是对一个灰度图像进行处理,使他的特征更加明显。通常情况下,在对图像进行进一步的处理之前,直方图均衡化是一种对灰度进行归一化处理的好方法,而且也可以增强图像的对比度。
mythsman
2022/11/14
2360
直方图均衡化处理
Python opencv图像处理基础总结(三) 图像直方图 直方图应用 直方图反向投影
图像直方图是反映一个图像像素分布的统计表,其横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。直方图的显示方式是左暗又亮,左边用于描述图像的暗度,右边用于描述图像的亮度。
叶庭云
2020/09/17
4.3K0
Python  opencv图像处理基础总结(三)  图像直方图  直方图应用  直方图反向投影
OpenCV图像处理(十七)---图像直方图均衡化
欧姆定律是指在同一电路中,通过某段导体的电流跟这段导体两端的电压成正比,跟这段导体的电阻成反比。该定律是由德国物理学家乔治·西蒙·欧姆1826年4月发表的《金属导电定律的测定》论文提出的。
用户5410712
2022/06/01
4260
OpenCV图像处理(十七)---图像直方图均衡化
使用OpenCV实现图像增强
首先我们获取了一个LPG气瓶图像,该图像取自在传送带上运行的仓库。我们的目标是找出LPG气瓶的批号,以便更新已检测的LPG气瓶数量。
小白学视觉
2020/08/10
1.7K0
OpenCV基础 | 9.直方图及直方图均衡化
基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加 了像素灰度值的动态范围,从而达到增强图像整体对比度的效果
快学Python
2021/08/09
1.3K0
掩模直方图均衡化
算法:掩模图像,也称掩膜图像,借鉴于PCB制版过程,似一块玻璃板,玻璃板上白色区域是透明的,黑色区域是不透明的。掩膜有方形掩膜和圆形掩膜等。掩模运算是将该玻璃板覆盖在原始图像透过玻璃板显示出来的部分就是掩模运算的结果图像。掩膜图像应用在感兴趣区、图像屏蔽、图像合成、结构特征提取、特殊形状图像提取等领域。
裴来凡
2022/05/28
3740
掩模直方图均衡化
灰度直方图均衡化
算法:灰度直方图均衡化是通过原始图像的灰度非线性变换,把原图像的直方图灰度范围拉开,或者转换为均匀分布的形式,增加像素灰度值的动态范围,增强图像整体对比度,得到全局均匀化的直方图,达到图像细节变清晰的效果,但其增强效果不易控制。
裴来凡
2022/05/28
5160
灰度直方图均衡化
opencv学习笔记--直方图的均值化
opencv中图像的均值化都是基于灰度图的。 直方图的均值化能提高图片的对比度。 image.png     下面介绍两种方法 自带函数均值化 cv.equalizeHist() 参数: 输入一个8比特的单通道图像 自定义均值化 上述的直方图均衡化可以可能到是一种全局意义上的均衡化,但是有的时候这种操作并不是很好,会把某些不该调整的部分给调整了。Opencv中还有一种直方图均衡化,它是一种局部局部来的均衡化,也就是是说把整个图像分成许多小块(比如按10*10作为一个小块),那么对每个小块进行均衡化。这种
用户2965768
2018/08/30
5K0
opencv学习笔记--直方图的均值化
CV学习笔记(十):直方图
在日常做CV的过程中,慢慢的就得去琢磨怎么使用一些直观的方式来展现数据,甚至来展现一些图片的区别。在Python中,我们经常会用到matplotlib这个2D绘图库来绘制图形。在matplotlib能够绘制的种类很多,在这篇文章中,我会通过绘制直方图来去展现一些常用的绘图技巧和方式。写很长的东西不一定专业,只能帮助你对一个概念有一个快速入门,知识体系能稍微系统一点而已。抛砖引玉,大家共同学习。
云时之间
2020/02/28
1.2K0
相关推荐
图像增强 | CLAHE 限制对比度自适应直方图均衡化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验