图1是一个特别简单的ISP,只画出了ISP的刚需模块,其中降噪是贯穿ISP的重量级模块,不同的厂家有不同的结构,但是一般来说,ISP中的图像降噪会在RAW域或者是YUV域。
在RAW域做降噪的好处是噪声形态没有被改变,此时的噪声还是来自sensor的白噪声,在这个位置做降噪不能开太大的力度,如果降噪力度过大,图像中的边界和细节就会被抹平,会影响图像最终的清晰度,但是不做RAW域降噪也会有问题。
回忆一下Demosaic算法,这是一个需要上下左右像素做插值的算法,这就是说,如果某个像素含有噪点,一个噪点会被插值成好几个,此时的噪声形态被破坏,白噪声被插值成了结构性噪声,降噪难度进一步增大,再加上Gamma抬升暗区噪声,此时图像中的噪声不仅被改变了形态还被放大了不少,所以RAW域降噪是有必要的。
想想看,RAW域降噪不敢开太大,但是仅Demosaic和Gamma两个模块都对噪声有这么大的影响,更何况商用ISP不止这两个模块,那么到了YUV域,噪声放大加上形态改变,YUV域是不是得再一次降噪,才能保证输出图像的视觉效果呢?所以通常ISP中至少存在2个降噪模块,一个在RAW域,一个在YUV域。
1.1. 降噪须知
1.1.1. 噪声模型
图像噪声可以分为模式噪声和随机噪声,这两种噪声产生的原因不一样,解决它的方法也不一样。
一般由硬件本身缺陷带来的噪声称为模式噪声,比如现在广泛使用的CCD Sensor或CMOS Sensor,这种由器件本身带来的噪声通过细心设计器件或者是电路可以进行降噪,但是不能完全避免,所以ISP中设计了去坏点(defect correct)来应对这种固定噪声。
图像中的随机噪声更加复杂一些,一般分为热噪声(thermal noise),散粒噪声(shot noise)、1/f噪声(flicker noise)等。为了能更好的降噪,通过大量的研究,学者们发现这些噪声符合一些数学模型,因而噪声也以其符合的数学模型命名,ISP中比较常见的就是高斯噪声、椒盐噪声和乘性噪声。如图2所示,从左往右依次为原图、方差为0.03高斯噪声、噪声密度为0.03的椒盐噪声和方差为0.04的乘性噪声,图像都是用matlab的imnoise函数生成的。(噪声有正有负,为了能看的更清楚,下图显示噪声的时候取了绝对值。)
以前楼主看噪声的时候很疑惑,这些噪声不都是无规律的样子吗?和数学公式能有什么关系?看懂它又能有啥用处?看了一段时间之后,楼主看出了一些门道,首先即使不看数学公式,从图2也可以直接看出,不同噪声看起来似乎不太一样吧,其次,需要分别来说。
1. 椒盐噪声
椒盐噪声是图2从左往右第三幅,看起来颗粒感很重,噪点之间很孤立同时噪点都很亮,对比着看椒盐噪声的数学公式:
(1)
是低噪声阈值(Low的缩写),通常设置为0,代表黑色。H 是高噪声阈值(High的缩写),通常设置为最大亮度值(例如在8位图像中为255),代表白色。 是噪声密度,表示每个像素被噪声替换的概率,所以公式(1)的意思是,对于图像中的每个像素 ,以概率 被随机替换为一个特定值(通常是0或255,代表黑色或白色),以概率保持原始像素值不变。
再对比椒盐噪声的图像,和公式要表达的意思很符合,噪点的颜色很亮,说明不是最大值就是最小值,且和周围的其他像素没啥联系,说明噪点是孤立存在的。
2. 高斯噪声
图2从左往右第二幅,和椒盐噪声相比,高斯的噪点就没椒盐噪声那么亮,而且高斯噪声看起来成团杂糅在一起,对比着看高斯噪声的数学公式:
(2)
x是随机变量,在图像中可以是像素值,μ是噪声的均值,通常为0,σ 是噪声的标准差,决定了噪声的强度。
图3是高斯分布的概率密度函数,最大值和最小值占的面积比较小,噪声值大多集中在中间区域。表现在噪声图上就变成了,特别亮和特别暗的点都比较少,而中间部分由于亮度相近就团在了一起,看起来灰蒙蒙的。
3. 乘性噪声
图2从左往右最后一幅是乘性噪声,乘性噪声可以看出图像的大致轮廓,这是因为乘性噪声和图像内容有关,乘性噪声的公式如下:
(3)
n(x)是一个随机过程,通常假设为高斯分布,均值是0,标准差为σ,k是系数,最终叠加在原图上的噪声还要再乘以I(x),这就说明乘性噪声和原图有关。在ISP中,乘性噪声是ISP中的一些模块把噪声放大了,比如gamma会抬暗区噪声,为了解决这个问题,一般会用计算不同亮度下的噪声增益,用于指导降噪。
一般ISP中的噪声就是以上三大类,椒盐噪声是sensor缺陷造成的,由去坏点模块解决,高斯噪声一般就是热噪声,是一种随机噪声,由降噪模块解决,乘性噪声一般也被当成高斯噪声处理了,所以ISP中常用的噪声模型就两种,椒盐噪声和高斯噪声。
1.1.2. 噪声客观评价标准
按照本号的一贯宗旨,既然提了RAW域降噪,本该给出RAW域降噪的效果,但是RAW域在ISP的位置比较靠前,其降噪的效果受到后面几个模块的直接影响,如果要看RAW域降噪的效果,需要调试Demosaic、CCM和Gamma才有说服力,因此RAW域的降噪先放放,安排在ISP基础版完成之后,先给出YUV域的降噪效果。
本号之前已经写了多个降噪算法,给输入图像降噪加入高斯噪声,用这些算法做个YUV域的降噪效果对比。为了客观的评价降噪效果,光用眼睛看是不行的,要用PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)作为客观评价标准,PSNR的计算公式如下:
(4)
其中MAX是图像可能的最大像素值,楼主测试的时候都把图像值限制到了0~1范围,所以MAX就等于1。MSE(Mean Squared Error,均方误差)是原始图像与去噪后图像之间的平均误差的平方,计算公式为:
(5)
其中|X|是图像中的像素总数,x是图像域中的坐标,y_in是原始图像在坐标x处的像素值,y_out是去噪后图像在坐标x处的像素值。PSNR衡量的是原始图像和去噪后图像之间的相似度,PSNR值越高,表示去噪后的图像质量越接近原始图像。然而,需要注意的是PSNR并不总是与人类视觉感知的图像质量完全一致。
1.2. 图像降噪有哪些算法
图像降噪算法有很多,楼主大概列了一下自己听说过的图像降噪算法,画了一个算法导图如图4所示,目前本号使用的都是空域降噪(红色部分标出),也是最简单的图像降噪算法。
目前ISP中用的比较多的是空域降噪(Spatial Denoise)和时域降噪(Temporal Denoise)两大类,深度学习一般只存在于高端ISP中,先不管它,那么重点就在空域降噪和时域降噪,这二者的不同在于空域只使用单幅图像就可以降噪了,但是时域需要多幅图像才可以,所以时域降噪更加复杂。
时域降噪也称3D降噪是ISP中最复杂的算法,没有之一,其理论基础是高斯白噪声的均值为0,这就是说,对于多幅图像组成的视频来说,其噪声在时间上是符合高斯分布的,针对这一特性,只要把多帧叠加起来,就可以让噪声趋近于0,比如给Lena图添加均值为0,方差为0.03的高斯噪声,叠加30幅图像求均值获得的降噪效果如下图5所示:
从图5可以看出噪声降的很干净,降噪的结果几乎可以媲美原图,但实际情况没有这么简单,视频中存在运动的物体,如果简单的多帧叠加,会产生鬼影(图6所示),一般常用的解决方法是用帧差法做运动检测,针对图像中的运动部分做空域降噪或者是运动补偿,只有静止部分才做时域均值叠加,不过考虑到运动的复杂性,帧差法一般都做不好,需要引入其他的算法做为辅助。
图6是从论文《SPATIO-TEMPORAL NOISE REDUCTION METHOD OPTIMIZED FOR REAL-TIME IMPLEMENTATION》中截取的,关于运动补偿做时域降噪的例子,从手的位置可以看出运动补偿后的效果明显好于没有运动补偿的效果。
此外,时域降噪一般会涉及到卡尔曼滤波,卡尔曼滤波也是需要花点儿时间才能掌握的,后期如果有时间,楼主再写一篇关于时域降噪的算法。总之,时域降噪不仅仅涉及到卡尔曼滤波、运动检测和运动补偿这样的复杂算法,还需要对这些算法做一些改进。
1.3 降噪效果大比拼
在降噪算法中,均值滤波、中值滤波、高斯滤波都太低端了,楼主就不拿出来做降噪效果对比了。先对图像加入高斯噪声,再转到YUV域(如图7所示),对Y、U、V三个分量分别降噪,接下来用双边滤波、联合双边滤波和NLM滤波做一下效果对比。
联合双边滤波用Y分量做值域权重,对UV进行双边指导滤波,得到的对比效果如下图7所示,从左往右依次为:双边滤波结果,联合双边滤波结果和NLM滤波结果。
图8中双边滤波窗口9x9,值域sigma为0.1,空域sigma为4。联合双边滤波的参数和双边滤波的参数相同,只是使用Y作为值域权重。nlm的搜素窗口为9x9,匹配窗口为3x3,相似度匹配阈值为0.1,sigma为0.1。
从图8中不太能看出哪个降噪效果更好,但是可以参考psnr值,双边滤波的psnr值为26.3056,联合双边滤波的psnr值为28.7839,NLM的psnr值为27.2514。所以结论是联合双边滤波的效果最优,这是因为UV是色度分量,其图像细节的丰富程度远不如Y分量,如果用UV做值域权重,会造成UV分量产生色偏,降噪力度越大这种效应越明显,如果有网友希望自己试一下效果,可以后台私信楼主要代码。
用这种自己添加噪声再降噪的方法可以客观的评价自己设计或者改进的降噪算法是否够好,但是与真实Sensor中的噪声还是有一些差别,不过不影响学习算法原理。
另外分享一下楼主学习降噪的一个收获:不要认为降噪是把噪声从图像中去除,降噪的本质是把噪声从高频打到低频,这是一个针对噪声的能量搬移过程。举个例子,最简单的3x3均值滤波,在做完降噪后,噪声也还在图像里,噪声的能量也没有消失,它只是把3x3窗口中的能量重新分配了一遍。