前言: 这篇文章是我从事ISP研究数年来的一些经验总结,没有用到深奥的理论知识,有的只是根据实际状况来处理的一些常规方法,以及曾经犯过的错误总结。我想把ISP function的原理用简单浅显的语言描述出来,希望对初学者有所帮助。这里的ISP主要是指从CMOS sensor输出的bayer pattern,到转换成通用的YUV或者YCbCr格式的过程,通常用于USB摄像头/监控摄像头/手机/平板等芯片设计中。
4.细节 细节部分会介绍去噪denoise,Bayer pattern 转 RGB(即interpolation),Edge enhance(即Sharp)以及边缘伪彩色false color。这部分内容是ISP中最复杂的,需要较庞大的计算量和Memory。任何一个function都可以在网上找到不少的论文,这里我只说明一些基本原理和关键因素,不讨论详细的实现算法。 首先我们把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电路设计中,去噪算法的多样性和可调整性是非常必要的。
Figure4.1.1 空间域去噪效果
除了去噪算法以外,抑制Noise根源也是去噪的一个重要手段。Noise本身无处不在,问题根源在于Noise被不断放大,也就是各种增益Gain(或者说乘法)把Noise放大了许多倍。为了达到一定的亮度,Sensor的AE gain通常没有办法改变,能改变的只有ISP自身。常用的抑制Noise手段包括:
去噪方法可以说是ISP中牵涉最广,实现难度最大的一个功能,它渗透进AE,LSC,Gamma,AWB,interpolation,edge enhance等多个function,是一个系统工程。
4.2 Interpolation 这里说的interpolation是指把Bayer pattern data 转化为RGB data的过程,每个像素都要有完整的[R G B]三个分量。先看一下最简单的双线性插值算法。
Figure4.2.1 双线性插值
这是最简单原始的方法,确实可以得到一幅RGB图像,不过存在一些问题,例如拉链现象,有些模糊,分辨率不高,边缘有些彩色(false color)等。评价插值算法的好坏,通常用ISO12233测试纸,如下图。
Figure4.2.2 ISO12233测试纸 观察细节算法的好坏,必须把图像放大到像素级别,直接研究数值大小,下面以拉链现象为例。拉链现象出现在水平或者垂直的边缘上,是由于G分量计算不当所致。以一条水平边为例,如下图,用双线性插值的话,在水平边缘上就会出现[90, 82.5, 90, 82.5…]这样的循环重复规律。
Figure4.2.3 从图像效果来看就是类似拉链状。
Figure4.2.4 拉链现象(双线性插值和沿着edge方向插值)
要解决拉链现象,保持边缘的光滑,很直观的想法就是对G分量采取沿着边缘方向去插值,在上图中,就让G5 =(G4 + G6)/2。这样就意味着要做边缘方向性的判断,如果是垂直边,那么就会是G=(G2+G8)/2,还有各种其他方向,则可以对周边四个G分量采用不同的加权平均算法得到中心点G分量数值。边缘方向判断是interpolation算法中最重要的一个环节,是各家ISP算法的核心之一,有兴趣的同学可以查看这个方面的论文。评价图像分辨率(清晰度)的一个指标,是看ISO12233中对细密纹理的识别程度。一个好的算法可以判断出只有一个像素宽度的细条纹。
Figure4.2.5 interpolation识别细密纹理 在Bayer pattern中,一半像素是G,R和B都只占1/4,R和B信息缺失比较严重。在双线性插值算法中,R分量的计算只和周围的R相关,如果用G分量的信息去修正缺失的R分量,那么清晰度会有不小的提升。以水平方向的边缘为例:
Figure4.2.6 水平edge上利用G分量修正R或B 上图中a1和a2是修正系数,范围在0~1之间。这种常用的计算方法不仅提高了清晰度,也可以缓解false color现象。不过从另一方面来看,这种修正会增加Noise幅度,原本R分量自身有一定的Noise分布概率,现在叠加了G分量的Noise,那么最大Noise幅度会提高。因此系数a1和a2需要根据场景,Noise幅度等因素权衡选择。
整体来说,Interpolation算法大致过程就是先边缘方向检测,然后沿着方向去做插值,兼顾Noise和清晰度的平衡,顺便还可以做一些false color的处理。
4.3 Edge enhance 边缘增强Edge enhance和一般所说的sharp是一个近似的概念。我这样区分二者:sharp是对图像所有内容增加锐利度,包括Noise也会被放大;而edge enhance是要让真正的edge变得锐利,Noise则尽量不被放大显现出来。从算法上来说Sharp很好实现,任何课本中都会提到sharp算子,而edge enhance则要有效区分出edge和Noise,并且判断edge方向来做增强,增强的方法也很有难度,既要达到一定的锐利度MTF,又要解决边缘粗糙roughness,overshot和undershot等问题。 边缘增强一般在YCbCr空间进行,并且只对Y分量处理,Cb和Cr保持不变,其原理如下:
Figure4.3.1 edge enhance 原理
浅蓝色为原值,深蓝色为enhance之后的数值。从波形上看,edge enhance就是要让线条的斜率更陡一些,甚至允许出现小幅度的过冲。从数值上来看,就是让数据朝着远离邻近点均值的方向走,而且和邻近点均值的差越大,走过的距离也越大,把当前像素值和邻近点均值的差记为d;另外,edge enhance的幅度还和整个edge的变化范围有关,可以认为上图中最大值和最小值的差,记为g;最后是用户设定的锐利度s,这三者可以得出像素的edge enhance函数H(x)。
H(x) = x + f(d, g, s)
f(d, g, s)是一个和d,g,s三者都正相关的函数,但并非线性关系。这里没有统一的数学模型可以给出答案,只有仔细研究规律,多做实验,可以说的是想要得到较好的视觉效果,这个模型非常复杂,参数众多。通过不断的对参数调试练习,慢慢建立起数学计算模型和实际图像效果之间的映射关系,才能较好的平衡锐利度MTF和roughness,overshort,undershort等因素。 为了避免把Noise enhance出来,edge enhance在实现中还需要判断当前像素处于光滑区域还是物体边缘。当处于光滑区域的时候,则不要做edge enhance运算,或者做的幅度很小;只有在较明显的边缘上才做处理,这样避免不了边缘上的noise的影响,所以在锐利度s设定较大的时候,可以发现边缘上会有Noise闪动跳跃的情况。为了缓解这种Noise的跳跃,通常会对f(d, g, s)做最大值和最小值限制保护,并且沿着edge 方向做低通滤波来缓解Noise。
Figure 4.3.2 egde enhance 前后效果比对 整个Edge enhance的大致流程为先判断平坦区域还是边缘,对平坦区域可以不做或者少做edge enhance(甚至做smooth处理),对边缘要判断幅度大小,边缘方向,选则相对应的高通滤波器处理,最后对enhance的幅度做一定程度的保护处理。
4.4 False color False color一般出现在物体边缘上,特别是白纸黑字。如下,白纸上的黑色线条,一侧偏黄,一侧偏蓝。
Figure 4.4.1 放大后的false color现象
Figure 4.3.2 flase color呈现中心对称的特点
Figure4.3.3 RGB曲线位移 细节相关的function都比较复杂,较难像色彩和亮度那样直观的理解。我自己感觉细节设计其实就是数学和信号处理,需要细致的思考和探究,种种现象都可以从数学上找到对应的关系。另外像自动对焦Auto focus和缩放Zoom也和细节设计相关,前者需要边缘检测,后者需要多采样滤波。
|
|