首先我们把Noise 分成三类,分别是高斯白噪声,坏点,受伤点。这三类分别有不同的处理方法。
坏点Dead pixel是指有些像素不受拍摄景物影响,始终为固定的一个数值,通常为最大值或者最小值,也就是常说的亮点和黑点。检测坏点的算法比较容易,因为坏点和周围的像素差异非常大,检测出来之后,可以用附近点均值替换即可。
受伤点wound pixel是指有些点在低照度下,sensor gain很大的时候,会出现一定的偏差,能够被人眼明显察觉。这些受伤点输出的值不固定,同时也受拍摄景物影响,例如比周围正常像素的数值大一些,形成不太明显的亮点,有时候还会随着时间改变,一闪一闪的。对于受伤点,不是很容易被检测输出来,好在它一般只出现在暗光条件下,如果受伤点处在平坦区域,那么可以用最大值(最小值)替换,或者中值滤波等方法消除,如果正好处在边缘上,那么就较难辨别出来,中值滤波等处理方法会使得图像模糊。坏点和受伤点对应到课本中就是椒盐噪声。
一般我们说的噪声都是指高斯白噪声,噪声的大小和sensor的增益大小成比例关系,同时ISP中的很多运算(例如Gamma,LSC,AWB,CCM等)都会放大Noise幅度。从频域来看,噪声遍布整个频域。对于高频噪声,比较容易消除,但是高频噪声和实际景物容易混淆,消除噪声的时候也会使得图像模糊。对于低频噪声,就需要花代价来消除,在任何二维空间域的去噪算法中,都需要一个以当前像素为中心的窗口,这个窗口越大,就越能检测出低频的Noise,同时也意味着越多的Memory和计算量。从空间域来看,落在平坦区域的Noise比较容易消除,落在景物边缘的Noise则真假难辨,必须在清晰度和Noise之间做一个折中的选择。
我所知道的可用于ISP中去除Noise的方法大概有以下一些分类(没有广泛研究过,肯定有疏漏,请包涵)。 1.首先是空间域和时间域的划分。图像是二维的,空间域是指仅对一幅图像中的二维数据处理,一般照片的去噪都是在二维空间域。时间域是指多帧图像之间的去噪,在视频中,前后Frame有着较大的相关性,对于静态场景来说就更加明显。空间域去噪算法需要考虑的是Noise和图像清晰度之间的权衡,而时间域去噪算法需要考虑的是Noise和移动物体的拖尾残影现象的权衡。
2.其次是基于位置和基于数值的划分。要消除Noise,一般人第一个想到的方法就是低通滤波器,以当前像素为中心,选择一个一定范围的中心对称的低通滤波器,到中心距离越近,对应位置像素的weighting越高,越远则越小,这就是基于位置的方法。另外一种是基于数值的方法,先同样选择以当前像素为中心的一个范围,把这个范围内的像素按照数值大小来排成一个序列,然后再做处理,处理的方法可以是直接选择某些点(例如最大值/最小值替换,中值滤波),也可以对这个序列再做低通滤波计算。鼎鼎有名的双边滤波就是结合了位置和数值两种思想合二为一的算法,不过其公式计算太过复杂,不适合数字电路设计实现,但是其思想是完全可以借用的。
3.各种变换域的处理方法。例如傅立叶变换,离散余弦变换,最有名的就是小波变换。这些域变换的基本原理都差不多,基于人眼对高频分量较不敏感的特性,对转换域中的部分数据进行归0或者缩小,以达到消除Noise(或者图像压缩)的目的。小波变换效果较好,不过由于计算量很大,在ISP中实现有很大的难度。
在实际应用中,变换域的方法太过复杂,不适合实时视频处理,所以常用的还是上面两大类方法。一般来说Noise的幅度总是有限度的,和实际景物边缘的变化程度有较大差距,所以通常会在平坦区域尽可能的多消除noise, 而在物体边缘则尽量保护景物细节,少做denoise处理,根据景物内容动态调整去噪算法是必须的。在另一方面,Noise的幅度大小和sensor的增益相关,当环境变换导致AE gain变化的时候,Noise的幅度变化非常大,有些sensor在低光照条件下会有64倍的AE gain,Noise满屏跳跃,几乎掩盖实际景物。有时候常会说“评价ISP好坏,就是看暗光情况下的Noise大小”,不同的Noise 幅度意味着不同的ISP算法(或者算法中的参数),所以还需要SW根据实际情况来动态调整去噪算法。因此,在真实的ISP电路设计中,去噪算法的多样性和可调整性是非常必要的。
|