写本文的目的是记录自己学习过或做过的一些东西,深化理解,理清思路,便于回忆。本人处于学习阶段,欢迎指出不对的地方。
本文算法参考文献:李勇.基于Retinex理论的低照度图像增强算法研究与实现[D].西安电子科技大学,2018
本文是本人按照作者发表的原文进行复现并稍加改动,在尽力的基础上由于本人水平有限,对作者一些想法的理解和结果的复现不一定正确,需要研究此算法的朋友,在看我文章的时候最好加入自己的判断,或者直接查看原文。欢迎各位指出我不对的地方,或者与我探讨交流!需要程序可评论。
原文摘要
图像作为信息的一种载体,在通信领域与计算机领域得到了广泛的应用。海量的图像当中,因为拍摄环境因素造成的低照度图像占了很大比例。低照度图像一般包含较明显的噪声,亮度比较低,细节不明显,颜色失真严重,上述缺点降低了低照度图像的应用价值。低照度图像增强处理是图像增强领域比较重要的分支,传统的增强算法只能改善低照度图像的部分缺点,增强效果不理想。Retinex算法基于人眼视觉系统感知物体亮度和颜色模型,具有色彩恒常性,并且可以做到亮度提升、细节增强和颜色保真的统一,对低照度图像质量的提升比较全面。
本文针对整体亮度比较低的图像提出了自适应权值的多尺度Retinex算法。低照度图像包含较多的零像素点,为此引入了幅度补偿机制,解决了Retinex算法中对数变换导致图像数据截断的问题;将图像进行分块,在每一个子块内部,根据图像的平坦特性计算子块的最佳尺度参数,利用最佳尺度参数和经典尺度参数间的关系进行自适应权值计算,解决了多尺度Retinex算法使用全局滤波器效果不佳的问题;本文利用颜色通道之间的关系定义了图像的归一化亮度,然后利用归一化亮度对低照度原图和增强结果进行线性匹配,避免了图像正常亮度区域的过度增强问题。实验结果表明,自适应权值的多尺度Retinex算法在图像细节增强、亮度保持以及色彩保真方面效果较好。
针对部分区域较亮的低照度图像,本文提出了基于PLIP(Parameterized Logarithmic Image Processing)模型的Retinex低照度图像增强算法。该算法将PLIP模型的运算规则和图像卷积操作结合起来,形成了PLIP模型下的高斯滤波器,并在HSV空间下对图像亮度分量进行增强处理,有效的降低了反射分量计算过程中的超值区间问题;利用图像的背景亮度和人眼视觉的关系对增强后的亮度分量进行非线性调整,改善了图像的视觉效果;按照饱和度和亮度之间的相关关系对饱和度进行修正,改善了图像的视觉效果。实验结果表明,基于PLIP模型的Retinex增强算法在增强低照度区域的同时对高亮区域进行了饱和度修正,使高亮区域的增强结果更加符合人眼视觉效果,避免出现过度增强现象。
低照度图像的相关背景这里就不再赘述了,百度百科和一些论文里介绍的很清楚。
上述两个公式是retinex理论中最基本也是最核心的公式,之前的文章里也提到过。对于低照度图像来说,入射分量是干扰因素,我们需要求得的是反射分量,入射分量可由原始图像卷积高斯函数来近似估计,接下来就谈谈我个人对这两个公式的理解。
在上述公式中,入射分量是低频分量,反射分量是高频分量。初学者们可能对这一点不是很明白,白天的时候我们看东西很清晰,其实是因为我们能清楚的辨别每个物体的边缘,这些边缘对于一幅图像来说就是高频分量,因为这些边缘在数字图像中,其实就是像素值发生突变的点,你可以将整幅图像想象成一个二维函数,边缘就是函数值变化剧烈的地方,也就是导数大的地方。这些地方在经过傅里叶变换的时候就属于高频部分(因为一个较为陡峭的函数,需要更多的高频分量去表示,这里涉及到信号与系统的基础知识)。剩下的非边缘部分自然就是低频部分,也就是我们所说的像素值变化平坦的区域,也就是在图像这个二维函数中,导数较小或者为零的区域。
对于低照度图像而言,我们希望能在夜色中清楚地看清图像原本存在的边缘信息,然而夜色却将这些这些信息隐藏,只给我们留下一大片黑色,这样做不就是将原本参差不齐的一个二维函数,便平坦了吗。这里的夜色我们可以将它视为入射分量,图像原本包括的边缘信息,我们可以视之为反射分量。这样来想的话,就很好理解为什么入射分量是低频信息,而反射分量是高频分量。
接下来解释上述第一个函数,既然入射分量代表低频,反射分量代表高频,我们再回头去看这个函数,一个低频信号乘以一个高频信号,可以让人很容易联想到通信原理中的调制(这里指幅度调制)。载波是高频的,我们要发送的原始信号是低频的,二者相乘之后,载波信号的幅度会随着原始信号的波动特征而产生幅度的变化。而在低照度图像中,入射分量其实就起到改变原始图像高频信息幅度的作用,入射分量将原本波动很大的图像高频部分的差异缩小了,这样就相当于遮住了图像的特征,我们看到的就不是原始图像的边缘细节,而是一大片黑色(同质区)。
接下来解释上述第二个函数,其实从频域是最好理解的,既然入射分量是低频信息,那高斯函数就相当于一个低通滤波器。图像经过傅里叶变换(fftshift之后)低频部分集中在图像中心部分,而高斯函数的傅里叶变换就是它本身,时域卷积等于频域相乘,就是将图像的低频部分通过。另外还需一提,高斯函数的sigma控制着高斯函数的胖瘦,因为图像经过fft和fftshift之后,中心是最低频率,越向外围频率越高,所以高斯函数的sigma值越大则过滤后得到的高频成分越多。同样,这个公式也可以从时域理解,这里就不再解释了。
以上求得入射分量之后,便可求得反射分量,具体算法网上一搜一堆,具体过程就不再介绍。这个算法的缺陷也特别明显,就是高斯函数的sigma值是固定的。不同的sigma值其实有不同的功能,上面说过sigma越大则结果包含的高频成分越多,所以其实sigma值的选取会影响图像最终的效果是偏向增强还是偏向细节保留。
SSR算法对尺度参数的依赖比较大,较大的尺度参数可以使图像色彩保留较好,还可以抑制噪声,但是对细节的损坏比较严重,对比度增强效果较差;较小的尺度参数可以增强图像的细节,但是容易出现颜色失真和光晕现象。(原文)
举例一种情况,当sigma取值较小时,我们求得的入射分量就会包含更少的高频信息,也就是说求得的入射分量会更注重于低照度增强而不是边缘保持。之后我们为了求得反射分量,会将现在求得的入射分量从原始图像中减去,所以最终求得的反射分量会更注重于边缘细节保持而不偏向于低照度增强。当sigma取值较大时,情况与此相对应。
做一下总结:在传统ssr算法中,当sigma取值较小时,得到的最终效果图边缘保持效果更佳;当sigma取值较大时,得到的最终效果图低照度增强效果更佳。
传统SSR算法就介绍完了,当然可改进的地方还有很多,于是后面又出现了MSR算法,具体算法流程如下:
可以很明显的看出,这其实就是利用了三种不同sigma值的SSR算法分别计算,最后再将计算结果以三分之一的权重相加,得到最终的效果图。这样的做法可以从一定程度上解决SSR算法sigma值单一造成的问题。
原文作者又提出了一种改进办法,就是从三分之一权重处入手。如果我们能判断一个点到底是处于图像的边缘区域(携带高频信息),还是同质区(携带低频信息),我们就可以来更改这个权重。如果这个像素点处于边缘区域(携带高频信息),那么我们可以让sigma取值较小那个效果图的权重更大一些。如果这个像素点处于同质区(携带低频信息),那么我们可以让sigma取值较大那个效果图的权重更大一些。
有了这个想法,接下来就要看看怎么判断这个点是属于哪个区,这个判断最好是一个数值量,因为我们不仅要判断,还要最后施以一个权重。于是作者这里就提出一个新的指数:平坦指数。
σ为该像素点所在局部区域的标准差。当alpha取1,beta取0时,此公式的图像如下图所示:
可以这样理解,当一个区域标准差小时,说明该区域像素值波动很小,也就说明该像素所处的区域属于同质区,反之亦然。再给σ施以arccot函数,使同质区这一数值更大,而边缘细节区域之一数值偏小。因为我们在MSR算法阶段使用了三次SSR算法,所以我们要依靠这个数值来完成对三个图像的权重赋值,具体的赋值公式和推导如下,应该都能看懂,就不做解释:
下面是整个算法的流程图:
后面作者为了补偿亮度,还加入了亮度补偿因子,公式如下:
将其应用到整个算法之后,其公式如下:
其中R是整个改进MSR算法增强之后的结果,f是原始图像。其意义也很好理解,当亮度过大时,说明该像素点不是处于低照度区域,所以原图像所占的比重就会多一些。当亮度过小时,说明该像素点处于低照度区域,所以增强后图像所占的比重就会多一些。
接下来看看我自己复现得到的结果,这里需要提到的是,低照度图像分两类,这个算法是针对第一类低照度图像增强的:
需要matlab代码,关注vx公众号:快学图像处理 ,回复retinex即可。这篇文章纯自己独立一人复现,如有错误请见谅。