
《计算机视觉教程》笔记
编著:章毓晋(清华大学电子工程系)
出版社:人民邮电出版社
出版时间:20173
这个方法的基本思想是把原始图像的直方图变换为在整个灰度范围内均匀分布的形式,这样就增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。
将灰度直方图函数式(331)写成更一般的(归一化的)概率表达形式(p(f)给出了对 f 出现概率的一个估计),即
式中n是图像里像素的总个数。通过用图像里像素的总个数进行归一化,所得到的直方图各列所表示的是各灰度值像素在图像中所占的比例。
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,类似于 32节介绍的灰度映射,这里需要确定一个变换函数,也就是增强函数,这个增强函数需要满足两个条件。
可以证明满足上述两个条件,并能将f中的原始分布转换为g中的均匀分布的函数关系可由图像f(x,y)的累积直方图得到,从f到g的变换为
根据上式可从原图像的直方图直接算出直方图均衡化后图像中各像素的灰度值。
对比度增强或者称为对比度拉伸就是图像增强技术的一种,它主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来更加清晰。对比 度增强有几种常用的方法,如线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化等。
灰度直方图是图像灰度级的函数, 用来描述每个灰度级在图像矩阵中的像素个数或者占有率(概率)。
OpenCV提供了函数 calcHist 来实现直方图的构建,但是在计算8位图的灰度直方图 时,它使用起来略显复杂。下面是OpenCV源码
可以定义函数 calcGrayHist 来计算灰度直方图,其中输入参数为8位图,将返回的灰度直方图存储为一个1行256列的 Mat 类型。
图像对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之,对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰,所以通过算法调整图像的灰度值,从而调整图像的对比度是有必要的。最简单的一种对比度增强方法是通过灰度值的线性变换来实现的。
当a=1,b=0时,O为I的一个副本;如果a>1,则输出图像O的对 比度比I 有所增大;如果0<a< 1,则O的对比度比I有所减小。而b值的改变,影响的是输出图像的亮度,当b> 0时,亮度增加;当b<0时,亮度减小。
在OpenCV中实现一个常数与矩阵相乘有多种方式。
1、convertTo
注:当输出矩阵的数据类型是 CV_8U 时, 大于255的值会自动截断为255
2、矩阵乘法运算
使用乘法运算符“”, 无论常数是什么数据类型, 输出矩阵的数据类型总是和输入矩阵的数据类型相同,当数据类型是 CV_8U 时,在返回值中将大于255的值自动截断为255。
3、convertScaleAbs
直方图正规化是一种自动选取a和b的值的线性变换方法。
利用 minMaxLoc 函数不仅可以计算出矩阵中的最大值和最小值, 而且可以求出最大 值的位置和最小值的位置。 当然,
在使用过程中如果只想得到最大值和最小值, 则将其 他的变量值设为 NULL 即可。
OpenCV提供的函数: normalize()
使用函数 normalize 对图像进行对比度增强时, 经常令参数 norm_type=NORM_MINMAX , 和直方图正规化原理详解中提到的计算方法是相同的, 参数 alpha 相当于 Omax , 参数 beta 相当于 Omin 。 注意, 使用 normalize 可以处理多通道矩阵, 分别对每一个通道进行正规化 *** 作。
非线性变换 。
假设输入图像为I,宽为W、 高为H,首先将其灰度值归一化到[0,1]范围,对于8位 图来说,除以255即可。 I (r, c) 代表归一化后的第r行第c列的灰度值, 输出图像记为 O, 伽马变换就是令 O(r, c) =I(r, c) γ , 0≤r<H, 0≤c< W,
当γ=1时, 图像不变。 如果图像整体或者感兴趣区域较暗, 则令0< γ< 1可以 增加图像对比度; 相反, 如果图像整体或者感兴趣区域较亮, 则令γ>1可以降低图像对比度。
伽马变换在提升对比度上有比较好的效果, 但是需要手动调节γ值。
全局直方图均衡化 *** 作是对图像I进行改变, 使得输出图像O的灰度直方图 hist O 是“平”的, 即每一个灰度级的像素点个数是“相等”的。 注意,其实这里的“相等”不是严格意义上的等于, 而是约等于,
上述分别为I和O的累加直方图
总结,对于直方图均衡化的实现主要分四个步骤:
OpenCV实现的直方图均衡化函数 equalize-Hist , 其使用方法很简单, 只支持对 8位图 的处理。
虽然全局直方图均衡化方法对提高对比度很有效,但是均衡化处理以后暗区域的噪声可能会被放大,变得清晰可 见,而亮区域可能会损失信息。为了解决该问题, 提出了自适应直方图均衡化(Aptive Histogram Equalization) 方法。
自适应直方图均衡化首先将图像划分为不重叠的区域块(tiles) ,然后对每一个块分别进行直方图均衡化。 显然, 在没有噪声影响的情况下, 每一个小区域的灰度直方图会被限制在一个小的灰度级范围内; 但是如果有噪声, 每一个分割的区域块执行直方图均衡化后, 噪声会被放大。为了避免出现噪声这种情况, 提出了“限制对比度”(Contrast Limiting) [3],如果直方图的bin超过了提前预设好的“限制对比度”, 那么会被裁减, 然 后将裁剪的部分均匀分布到其他的bin, 这样就重构了直方图。
OpenCV提供的函数 createCLAHE 构建指向 CLAHE 对象的指针, 其中默认设置“限制 对比度”为40,块的大小为8×8。
图像增强的方法包括线性灰度增强、亮度工具来提亮图像、饱和度增亮颜色、直方图均衡化等。
1、线性灰度增强。
线性灰度增强,将图像中所有点的灰度按照线性灰度变换函数进行变换。在曝光不足或过度的情况下,图像的灰度可能局限在一个很小的灰度范围内,这时图像可能会很模糊不清。利用一个线性单值函数对图像内的每一个像素做线性拓展,将会有效地改善图像的视觉效果。
2、用亮度工具来提亮图像。
亮度是指图像曝光的光亮。传统方法上,这将取决于相机镜头的快门速度。快门速度会让最少的光线进入,而较慢的快门速度会让最多的光线进入。为增加亮度,可以把亮度滑块(工具)通过向右移动,使更多的光线进入并产生更亮的色调,而降低亮度会导致更暗的色调。
3、用饱和度增亮颜色。
饱和度是指图像中颜色的强度。当颜色完全饱和时,它看起来生动而明亮。增加饱和度将增强你的图像的色彩度,而降低饱和度将使变得具有柔和和朦胧感。
4、直方图均衡化。
将原始图像的直方图通过积分概率密度函数转化为概率密度为1(理想情况)的图像,从而达到提高对比度的作用。直方图均衡化的实质也是一种特定区域的展宽,但是会导致整个图像向亮的区域变换。
首先需要说明的是,如果你说的是一道完整的题目,则这道题目没有唯一解,因为题目中没有说明原始图像的灰度级数(比如原始图像是16个灰度级的,或者是32个灰度级的,等等)。为了给你提供一个解题思路,现在人为假设原始图像是16个灰度级的,其它灰度级的解法类似。1、图像的灰度直方图求法为:(1)先计算图像中各个灰度级的出现频率,用h(i)表示灰度级i的出现频率,其值等于灰度级出现次数/图像像素个数:h(0)=2/16h(1)=1/16h(2)=3/16h(3)=2/16h(4)=0/16h(5)=1/16h(6)=4/16h(7)=1/16h(8)=1/16h(9)=1/16h(10)=h(11)=h(12)=h(13)=h(14)=h(15)=0/16。然后以灰度级i为横轴,出现频率h(i)为纵轴即可绘制出图像对应的直方图。(2)图像进行直方图均衡化处理的过程为:先计算累积分布,用r(i)表示灰度级i的累积分布:r(0)=h(0)=2/16r(1)=r(0)+h(1)=2/16+1/16=3/16r(2)=r(1)+h(2)=3/16+3/16=6/16r(3)=r(2)+h(3)=6/16+2/16=8/16r(4)=r(3)+h(4)=8/16+0/16=8/16r(5)=r(4)+h(5)=8/16+1/16=9/16r(6)=r(5)+h(6)=9/16+4/16=13/16r(7)=r(6)+h(7)=13/16+1/16=14/16r(8)=r(7)+h(8)=14/16+1/16=15/16r(9)=r(8)+h(9)=15/16+1/16=16/16=1r(10)=r(11)=r(12)=r(13)=r(14)=r(15)=1将累积分布进行量化(量化时需要用到原始图像的灰度级数,这也是为什么前面需要说明的原因),量化后的灰度级用rq(i)表示,量化公式为rq(i)=ROUND(r(i)15),(说明:量化公式中的15等于原始图像灰度级数减1),可得:rq(0)=ROUND(r(0)15)=2rq(1)=ROUND(r(1)15)=3rq(2)=ROUND(r(2)15)=6rq(3)=ROUND(r(3)15)=8rq(4)=ROUND(r(4)15)=8rq(5)=ROUND(r(5)15)=8rq(6)=ROUND(r(6)15)=12rq(7)=ROUND(r(7)15)=13rq(8)=ROUND(r(8)15)=14rq(9)=ROUND(r(9)15)=15rq(10)=ROUND(r(10)15)=15rq(11)=ROUND(r(11)15)=15rq(12)=ROUND(r(12)15)=15rq(13)=ROUND(r(13)15)=15rq(14)=ROUND(r(14)15)=15rq(15)=ROUND(r(15)15)=15因此,原始图像中的灰度级和均化后图像中的灰度级之间的对应关系为:0->21->32->63->84->85->86->127->138->149->1510->1511->1512->1513->1514->1515->15将原始图像中对应的灰度值安装上述对应关系替换成相应的灰度值,即可得到均化图像,结果如下:38138612212146128156122(在电脑上直接做的,仅供参考。ROUND()表示四舍五入。)
根据 维基百科 上的定义, 直方图均衡(Histogram Equalization)是图像处理领域中利用直方图对对比度进行调整的方法
顾名思义, 直方图均衡是将直方图的分布(概率密度)调整为均匀分布
根据信息论, 信息的熵越大, 包含的信息也就越多, 熵的计算公式如下:
只有当 均匀分布时, 熵的值最大 对应到图像上, 当图像直方图均匀分布时, 图像对比度最大 如下图所示:
蓝色为原始图像直方图, 绿色为均衡后直方图, 对应的处理后的图像为:
可以看到, 直方图均衡处理后, 图像变得更加清晰了
知道了为什么, 就要知道怎么做 一般直方图均值有以下几个步骤:
式中, , 分别为图像的高和宽, 表示灰度值为 的像素的个数, 为变换后的灰度值, 为映射函数, 计算过程使用了累计直方图
知道怎么做了, 就要知道为什么可以这么做 这里解释下为啥可以这么做, 即公式(3)是怎么得到的
设原始直方图分为为
均衡化后的直方图分布为
映射函数为
这里映射函数必须为单调递增函数, 满足:
即对应区域间内像素点的总数是一样的, 如下图红色区域所示:
将公式(4)代入公式(5), 则有:
因而, 可以得到:
对应的离散形式为公式(3)
直方图均衡过度的强调了灰度个数的重要性, 对数量多的灰度过度的进行了增强, 而图像中, 比例比不是很多的灰度往往更重要, 因而改进的方向就是减少数量多的灰度的影响, 我这里想到的有 3 种方法:
这3种方法的映射关系曲线如下所示:
从图中可以看到, 原始的直方图均衡后图像最亮, 如下所示为几种方法的结果对比, 依次为原图, 原始直方图, 改进0, 改进1, 改进2:
可以看到, 直方图可以改善图像整体的质量, 但对于某些局部图像, 则由于直方图的性质导致过亮或者过暗
这里总结下直方图均衡化的优缺点:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)