尽管我们通过各种方法来采集高质量的图像,但是有的时候还是不够好,需要通过图像增强技术提高其质量。
图像增强技术:主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度值放大到指定的程度,使得图像看起来更加清晰。
对比度增强的几种常用的方法:线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化;
这些方法计算代价小,但是却产生了较为理想的效果。
灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。即,统计0~255之间每个灰度级对应的像素个数。图像对比度通过灰度级范围来度量,灰度级范围越大代表对比度越高;反之,对比度越低的图像在视觉上给人的感觉是看起来不够清晰。Matplotlib提供计算直方图的函数hist。
如果a>1,则输出图像O的对比度比I 有所增大;如果0<a<1,则O的对比度比I 有所减小。而b值的改变,影响 的是输出图像的亮度,当b>0时,亮度增加;当b<0时,亮度减小。
线性变换计算出的输出值可能要大于255,需要将这些值截断为255,而不是取模运算;
上述线性变换是对整个灰度级范围使用了相同的参数,有的时候也需要针对不同的灰度级范围进行不同的线性变换;
分段线性变换:经常用于降低较亮或较暗区域的对比度来增强灰度级处于中间范围的对比度,或者压低中间范围的对比度来增强较亮或较暗区域的对比度。
可以看出,上述两种线性变换的参数需要根据不同的应用及图像自身的信息进行合理的选择,可以需要进行多次的测试,所以选择合适的参数是相当的麻烦。
自动选择a 和 b 的方法:直方图正规化
函数minMaxLoc函数不仅可以计算出矩阵的最大值和最小值,还可以求出最大值最小值的位置。
正规化函数 normalize
OpenCV中提供函数
void normalize(InputArray src, OutputArray dst, doubel alpha = , double beta = 0, int norm_tyoe=NORM_L2, int dtype = -1, InputArray mask = noArray())
norm_type:
norm_ty pe=NORM_L1: 1-范数——计算矩阵中值的绝对值的和
norm_ty pe=NORM_L2 2-范数——计算矩阵中值的平方和的开方
norm_type=NORM_INF ∞-范数——计算矩阵中值的绝对值的最大值
norm_type=NORM_MINMAX 计算src的最小值srcmin,src的最大值 srcmax
注意,使用normalize可以处理多通道矩阵,分别对每一个通道进行正规化操作。
伽马变换就是令,0≤r<H,0≤c<W
在对图像进行伽马变换时,应先将图像的灰度值归一化到[0,1]范围,然后再进行幂运算。如果原矩阵是CV_8U类型的,那么在进行幂运算时,大于255的值会自动截断为255。
伽马变换在提升对比度上有比较好的效果,但是需要手动调节γ值。下面介绍一种利用图像的直方图自动调节图像对比度的方法。
全局直方图均衡化操作是对图像I 进行改变,使得输出图像O的灰度直方图hist O 是“平”的,即每一个灰度级的像素点个数是“几乎相等”的。即
直方图均衡化在提升图像对比度上有显著的效果。但是直方图均衡化的结果 容易受噪声、阴影和光照变换的影响。
自适应直方图均衡化首先将图像划分为不重叠的区域块,然后对每一个块分别进行直方图均衡化。
显然,在没有噪声影响的情况下,每一个小区域的灰度直方图会被限制在一个小的灰度级范围内,但是如果有噪声,每一个分割的区域块执行直方图均衡化后,噪声会被放大。
限制对比度:如果直方图的bin 超过了提前预设的限制对比度,那么会被裁剪,然后将裁剪的部分均匀分布到其他的bin,这样就重构了直方图。