Camera DSP与ISP的区别
拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进行处理,最终转换成手机屏幕上能够看到的图像。作为手机影像功能三大核心元件之一(CIS、镜头),ISP直接影响传感器支持的像素,决定了对焦、成像速度、图像画质,色彩偏好等,重要性不言而喻。
Camera的DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通过一系列复杂的数学算法运算,对数字图像信号参数进行优化处理,并把处理后的信号通过USB等接口传到PC等设备。DSP结构框架包括:
- ISP(image signal processor)(图像信号处理器)
- JPEG encoder(JPEG图像解码器)
- Video encoder(视频编解码,包括H.264等)
- USB device controller(USB设备控制器)
ISP一般用来处理Image Sensor(图像传感器)的输出数据,如做AEC(自动曝光控制)、AGC(自动增益控制)、AWB(自动白平衡)、色彩校正、Lens Shading、Gamma 校正、祛除坏点、Auto Black Level、Auto White Level 等等功能的处理。而DSP功能就比较多了,它可以做些拍照以及回显(JPEG的编解码)、录像以及回放(Video 的编解码)、H.264的编解码、还有很多其他方面的处理。无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog SignalProcessing)、ADC(Analog-DigitalConverter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上。 但由于图像传感器的像素高低不同、及其他成本等的考虑,ISP各功能区域会依手机市场特性做分散配置或整合处理,例如,低端相机将Pre-ISP与传感器整合在一起,2.0M像素手机将所有的ISP功能单独做成一个芯片等。
ASP
ASP(Analog SignalProcessor)主要是针对图像传感器采集的电压或电流信号进行处理,主要作用是信号放大、自动曝光调整、时序控制、像素抽样控制等。因其与初始信号的绝对相关性,一般的图像传感器厂商皆会将此项功能直接与传感器做在一块。在图一中即为蓝色部分。传感数据经过ASP处理后,输出数据为RawData。
Pre-ISP
Pre-ISP(Image SignalProcessor)为前端影像处理,主要针对ADC转换后传出的数字数据(Rawdata),进行影像坏点修补、白平衡、gamma校正、锐利度、颜色插值等。在低像素的产品中,例如0.3M像素,因影像数据较少,不需要大规模的复杂处理,会将Pre-ISP与图像传感器做在同一颗芯片中;但高像素CMOS传感器,因需要处理的像素数越来越多,虽然将Pre-ISP集成在sensor内部从制造技术上来讲不困难,但因成本及成像质量的原因,有些手机设计公司在设计时会将集成于sensor内部的Pre-ISP功能屏蔽掉,并维持传感器ADC输出的原始资料,交由单独的ISP芯片或集成在Baseband的ISP进行处理。
Pre-ISP 部分称之为前端影像处理,是把原始图像数据处理为通用图像数据的最关键的一个部分。各 家的图像处理引擎中,最核心的也就是这个 Pre-ISP 的部分,对应着不同的图像数据的转换和处理方式。其实简单的说 Pre-ISP 就是一个调整图像的过程(类似 PS 的过程)。这个和在电脑上用 Photoshop 或者光影魔术手去给你的图像拉曲线,调色调等是一样的过程。 只不过 ISP 是直接处理 Raw-RGB 数据 的,这个原始数据虽然是不完整的 RGB 颜色数据,但是没有失真和画质损耗,处理 Raw-RGB 数据,所带 来的画质损失是最小的。 而经过 Pre-ISP 处理过的数据,即 RGB 或者 YUV 数据,虽然有了完整的颜色 信息,但是画质已经有了一定的损耗。
ISP对于图像处理的流程很长,环节很多,相较一个完整的ISP图像处理流程(full pipline),目前手机厂商自研的ISP芯片,只是完成其中一小部分环节(Pre-ISP),用于辅助处理某些特定场景和功能的应用。通常情况下,SoC中集成的ISP会采用和主芯片相同的制程,但外置独立ISP则视实现的功能情况而定。比如小米的澎湃C1,行业人士分析大概采用16nm制程,这种完成部分功能的Pre-ISP不需要太先进的制程工艺,能够兼具成本和功能的平衡。澎湃C1实际上是一个协处理器,或者说Pre-ISP,在处理器ISP前进行图像处理,相对而言会比较容易处理,能够辅助处理一些特定场景的应用。不过,由于是在处理器外单独增加了一颗芯片,因此无论是成本还是功耗,都会有所增加。此前小米在MIX Fold手机上应用澎湃C1 ISP芯片时谈到,这颗芯片的工作职能至少涵盖了3A(自动对焦、自动白平衡、自动曝光)。
ISP与3A算法简介
ISP 的Firmware(固件)包含三部分,一部分是ISP 控制单元和基础算法库,一部分是AE/AWB/AF 算法库,一部分是sensor 库。Firmware 设计的基本思想是单独提供3A算法库,由ISP控制单元调度基础算法库和3A 算法库,同时sensor 库分别向ISP 基础算法库和3A 算法库注册函数回调,以实现差异化的sensor 适配。
3A算法包括AE/AWB/AF,即自动曝光,自动白平衡,自动聚焦。

图像产生过程:景物通过 Lens 生成的光学图像投射到 sensor 表面上, 经过光电转换为模拟电信号, 消噪声后经过 A/D 转换后变为数字图像信号, 再送到数字信号处理芯片( DSP) 中加工处理。
从 sensor 端过来的图像是 Bayer 图像,经过黑电平补偿 (black level compensation)、镜头矫正(lens shading correction)、坏像素矫正(bad pixel correction)、颜色插值 (demosaic)、Bayer 噪声去除、 白平衡(awb) 矫正、 色彩矫正(color correction)、gamma 矫正、色彩空间转换(RGB 转换为 YUV)、在YUV 色彩空间上彩噪去除与边缘加强、色彩与对比度加强,中间还要进行自动曝光控制等, 然后输出 YUV(或者RGB) 格式的数据, 再通过 I/O 接口传输到 CPU 中处理。
-1.OETF
An opto-electrical transfer function (OETF) 光电转换函数
0.Bayer(拜耳滤波器得到彩色)
图像在将实际的景物转换为图像数据时, 通常是将传感器分别接收红、 绿、 蓝三个分量的信息, 然后将红、 绿、 蓝三个分量的信息合成彩色图像。 该方案需要三块滤镜, 这样价格昂贵,且不好制造, 因为三块滤镜都必须保证每一个像素点都对齐。
通过在黑白 cmos 图像传感器的基础上, 增加彩色滤波结构和彩色信息处理模块就可以获得图像的彩色信息, 再对该彩色信息进行处理, 就可以获得色彩逼真的彩色图像。通常把彩色图像传感器表面覆盖的滤波称为彩色滤波阵列(Color Filter Arrays,CFA)。
目前最常用的滤镜阵列是棋盘格式的, 已经有很多种类的, 其中绝大多数的摄像产品采用的是原色贝尔模板彩色滤波阵列(Bayer Pattern CFA)。R、G、B 分别表示透红色、透绿色和透蓝色的滤镜阵列单元。由于人的视觉对绿色最为敏感,所以在 Bayer CFA 中G分量是 R和B 的二倍,在每个像素点上只能获取一种色彩分量的信息,然后根据该色彩分量的信息通过插值算法得到全色彩图像。
1. DPC (Defective Pixel Correction) or SPC (bad pixel correction坏点校正)
存在坏点的原因: 1)由sensor制作工艺引起,比如灰尘等,或者电子产品的使用寿命有限,随着长时间使用引起坏点 2) 由noise引起的噪点,例如Sensor gain增大,或者温度升高。
坏点的分类和类型:静态坏点(因为制造工艺,例如灰尘引起的坏点,不发生变化)以及动态坏点(因为增益和温度引起的坏点,随着时间变化);hot pixel(比周围点明显亮的), dead pixel(比周围点明显暗的), weak pixel(临近饱和值和最低值,但不能达到饱和值)
单坏点/双坏点和多坏点:在同一个channel上,一个3x3的邻域内的坏点数量。Bayer CFA的情况下,则需要考虑是RGGB同一个channel,他们一般是不相邻的。
坏点消除算法分为静态坏点校正(Stastic Pixel Correct)和动态坏点校正(Dynamic Pixel Correct)。
坏点的定义为相机在均匀照明条件下(拍摄场景中心亮度和四周亮度差≤10%)经过sensor感光之后输出的图像中亮度与周围有明显差异的点。具体定义为,在中性灰场(反射率18%)条件下,当某一像素的亮度值低于或高于其所在32*32个像素的亮度平均值的20%时,认作该像素为坏点。比较明显的坏点即无论光线怎么变化,均只输出0或者4096(12bits)。受限于CMOS工艺以及低廉的成本,sensor出厂时一般都是存在坏点(举例某款sensor是200个左右且坏点不相邻),这些坏点需要在ISP处理中去除。
在ISP处理中一般有两种方式去除坏点,分别是静态坏点校正(Stastic Piexl Correct)和动态坏点校正(Dynamic Piexl Correct)。静态坏点校正需要对每一块sensor分别进行校正,获取到了坏点坐标并将结果存入Flash,以后断电重新启动之后加载坏点坐标,无须重新校正。这个方法可以事先处理一批严重的坏点(由于存储空间限制,不能将全部坏点都校正),但是会在产线上多增加一道工序。考虑其高昂的成本,目前行车记录仪或安防厂商更多的是采用动态坏点校正的方法。
- 静态坏点校正一般在sensor或者模组的产线上进行标定,并将坏点位置卸载OTP(One Time Programmable)里面。流程:通过产线上进行全白和遮黑等操作,统计出坏点的位置,写入OTP,之后从OTP中读取位置,用来修正坏点。静态坏点修正时,可能是双坏点或者多坏点
- 动态坏点校正用中值滤波(最简单的操作),条件是静态坏点修正过之后,当前坏点只有单坏点。动态坏点可以根据梯度方向来计算最后的替换的坏点的值。
- Corner case: 高噪声的影响,调试坏点参数时,根据ISO的参数进行调试。考虑当前噪声程度,是否是坏点。坏点校正时不应该对噪声进行修正。高亮的孤立点,但有细节,例如LED点阵灯阵列等。分辨率卡等,密集处的条纹,避免影响分辨率。
若sensor 中存在坏点,经过图像的插值(如demosaic)和滤波过程,坏点的尺寸会变大(坏点扩散),而且由于色彩校正和串扰补偿,坏点处颜色也会明显异常,因此坏点校正模块一般在ISP处理的开始。
动态坏点校正可以预先设计一个kernel(例如5*5),设置一个阈值K,若当前piexl的亮度高于(或低于)周围像素点亮度的均值(或最大值),则认为是亮点,使用周围像素点的均值替代(或者根据差值适当在当前的piexl level上做调整)。此阈值K可随周围像素点的亮度均值变化而变化。一般3x3的kernel是指单channel,5x5是指raw domain的。中值滤波
因噪声也会当做坏点进行校正,故低照下强烈建议开启坏点校正模块,可以明显改善偏色问题。
根据坏点的类型不同,也可以分为静态坏点和动态坏点,动态坏点在一定范围内的值是正常的,但当温度较高或超过范围内时,则出现坏点。
Ref: ISP-DPC
BLC的评价指标:1(保留图像原有细节 2)去除所有坏点 3)不引起原有图像的artifact。
2.BLC(Black level Correction)(黑电平补偿)与线性化
- 暗电流
物理器件不可能是理想的, 由于杂质、 受热等其他原因的影响, 即使没有光照射到象素,象素单元也会产生电荷,这些电荷产生了暗电流。 而且,暗电流与光照产生的电荷很难进行区分。Optical Black Correct(OBC)指的是光学暗区矫正,是在成像时,将一部分暗电流减去,这部分电流也称之为黑电平。
- Black Level (也称作:Optical Black,很多人也称呼为OB)
Black Level 是用来定义图像数据为0时,对应的信号电平。由于暗电流的影响,传感器出来的实际原始数据并不是我们需要的黑平衡(数据不为0)。所以,为减少暗电流对图像信号的影响,可以采用的有效的方法是从已获得的图像信号中减去参考暗电流信号。一般情况下, 在传感器中,实际像素要比有效像素多, 像素区头几行作为不感光区( 实际上,这部分区域也做了RGB 的 color filter),用于自动黑电平校正,其平均值作为校正值, 然后在下面区域的像素都减去此矫正值,那么就可以将黑电平矫正过来了。
做了black level 矫正与没做black level 矫正的对比,没做black level矫正的图片会比较亮,影响图像的对比度。
因此目前很少有ISP或sensor去使用ob区域进行计算,每家都会使用sensor内部的isp根据自家设计的算法去动态实时计算optical black level值,然后在sensor输出的时候把它去掉。
考虑到sensor输出的信噪比,所以一般Sensor在输出数据时又会垫上一个基底(pedestal),此时sensor的RAW = sensor input - optical black level + pedestal。对于芯片处理来说,一般拿到的就是这个数据,此时需要在ISP处理流程的起始部分减去这个基底。基底值是一个常量值,被添加到每一个pixel中,用来避免在图像矫正时,值出现负数的形式。
BLC结束后,需要考虑最后的饱和值仍然保持饱和,对最终结果需要应用一个multipler。
理想情况下black level是一个数,但不同的温度和gain情况下,black level的值是不一样的。选择最后的值时,如果想尽可能多的保留暗处细节,则不能设置太大;如果导致了暗处的色偏,则应该增加其值来纠正该问题。
BL的线性化测量
记录下sensor在什么样的exposure情况下会饱和,将sensor从最低曝光曝光到饱和曝光进行测量。即每个阶段图像都测量,来查看sensor的线性化情况。延长线性化与纵轴的交点,则是black level的结果。sensor线性化差,或者black level有问题,会造成一个全局性的色偏。整体的一个色偏,一般是其中某个channel的black level有问题。拍CC的值,计算图像的灰阶的值,则6个图像块的灰阶的R/G和B/G应该是相同的,如果某个图像块与其他的相差较多,则说明sensor在此亮度范围内的线性化较差,应该查看sensor在此亮度下的问题。
3.Green Imbalance
Green Imbalance时由于模组的缺陷,一般成因由两方面构成:半导体及microlens。绿不平衡是指Gr和Gb的值不接近。或者当信号照在pixel中心时,两个G不相等。
Green Imbalance对图像的问题:
出现迷宫格式的伪像/纹理(maze artifacts)。
如何评估Green Imbalance:np.mean(abs(Gr-Gb)/((Gr+Gb)/2))。在sensor上选型,根据green imbalance可以选
Green Imbalance的修正:静态校正和动态校正(根据周围的G pixel来校正,且是主流方法)。
现在实际的产品ISP中很少做Green Imbalance,更多的还是要约束供应商提供较好质量的sensor来保证green balance。如果对应sensor需要校正,则需要使用有green imbalance的ISP pipeline。
4.LSC(Lens Shading Correction)(镜头矫正)
由于镜头本身的物理性质, 即镜头的各个位置和中心的透射率/通光量时不同的,造成图像四周亮度相对中心亮度逐渐降低,以及,由于图像光照在透过镜头照射到 pixel 上时,边角处的焦点夹角大于中心焦点夹角,造成边角失光。表现在图像上的效果就是亮度从图像中心到四周逐渐衰减, 且离图像中心越远亮度越暗。 为了补偿四周的亮度, 需要进行 Lens Shading 的矫正。
Lens Shading 的矫正的方法是根据一定的算法计算每个像素对应的亮度矫正值,从而补偿周边衰减的亮度。
LSC一般可以通过拍摄灰卡(Flat Field)来解决此问题,问题可以被分类为Luma shading 和 color shading。
Luma Shading的主要原因是镜头中心到边缘的能量衰减导致的。蓝色和绿色用相同的数量线条表示能量,中心位置的蓝色几乎所有能量都能达到最右侧的的成像单元,但是边缘的光线由于有一定角度射入,经过镜头的折射,有一部分光(最上方的几条绿色线条)就没法达到成像单元,因此成像单元中心的能量就会比边缘的大,变现在亮度上就是亮度向边缘衰减变暗。
镜头带来的Color Shading主要是因为不同颜色的光的折射率不同,导致白光经过镜头后达到成像面时不同颜色的光的位置不同导致偏色。
矫正方法有二次项矫正、 四次项矫正。LSC的本值就是能量有衰减,反过来为了矫正就用该点的像素值乘以一个gain值,让其恢复到衰减前的状态,所以矫正的本质就是找到这个gain值。
从目前的矫正方法来看个人觉得可以分成三大类:
- 储存增益法
- 多项式拟合法
- 自动矫正法
方法均为用上面有提到衰减符合cos(θ)的四次方规律,而θ在三维空间对各个方向是一致的,所以各个方向的衰减。通过已经存储的值(以中心为圆心的半径形式,以及整幅图像分成n*n个网格,以每个mesh块为中心的网格亮度增益存储)。
4.X Vignetting & Color Shading
- 由于lens对不同光谱的shift是不同的
- 在镜头和sensor之间的IR filter的角度,制作工艺等,也会导致此问题
5.Demosaic颜色插值 (去马赛克)
常见的去马赛克方法为插值法:包括传统的最近邻域法,双线性,双三次插值等(称为单信道插值 single-channel interpolation),以及先插值生成亮度信息(G-channel),后根据亮度信息插值彩色信息(R-B channel)的方法(称为顺序插值 Sequential interpolation)。
Bayer Filter/CFA 以及CMOS和CCD的区别
图像在将实际的景物转换为图像数据时,通常是将传感器分别接收红、 绿、 蓝三个分量的信息, 然后将红、 绿、 蓝三个分量的信息合成彩色图像。 该方案需要三块滤镜,这样价格昂贵,且不好制造,因为三块滤镜都必须保证每一个像素点都对齐。
通过在黑白 CMOS 图像传感器的基础上,增加彩色滤波结构和彩色信息处理模块就可以获得图像的彩色信息,再对该彩色信息进行处理,就可以获得色彩逼真的彩色图像。通常把彩色图像传感器表面覆盖的滤波称为彩色滤波阵列(Color Filter Arrays,CFA)。
目前最常用的滤镜阵列是棋盘格式的,已经有很多种类的,其中绝大多数的摄像产品采用的是原色Bayer模板彩色滤波阵列(Bayer Pattern CFA)。R、G、B 分别表示透红色、透绿色和透蓝色的滤镜阵列单元。由于人的视觉对绿色最为敏感,所以在 Bayer CFA 中G分量是 R和B 的二倍,在每个像素点上只能获取一种色彩分量的信息,然后根据该色彩分量的信息通过插值算法得到全色彩图像。
相关工作内容:joint demosaicing and downscaling, co-sited downscaling, subpixel level interpolation
-
Adaptive Homogeneity-Directed demosaicing algorithm: https://ieeexplore.ieee.org/document/1395991
-
Hamilton adams demosaicing
6.Bayer Denoise(Bayer去噪声)
使用 cmos sensor获取图像,光照程度和传感器问题是生成图像中大量噪声的主要因素。同时, 当信号经过ADC 时, 又会引入其他一些噪声。 这些噪声会使图像整体变得模糊, 而且丢失很多细节, 所以需要对图像进行去噪处理空间去噪传统的方法有均值滤波、 高斯滤波等。
但是,一般的高斯滤波在进行采样时主要考虑了像素间的空间距离关系, 并没有考虑像素值之间的相似程度, 因此这样得到的模糊结果通常是整张图片一团模糊。 所以,一般采用非线性去噪算法,例如双边滤波器,在采样时不仅考虑像素在空间距离上的关系,同时加入了像素间的相似程度考虑, 因而可以保持原始图像的大体分块,进而保持边缘。
Bilateral Filter 双边滤波/降噪
图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等。但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显。相比较而言,bilateral filter双边滤波器可以很好的边缘保护,即可以在去噪的同时,保护图像的边缘特性。双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。
- 双边滤波的原理
双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:空间域核和值域核。工作原理:双边滤波的权重是由空间域权重与值域权重相乘得到的。当值域权重过小,趋近于0时,意味着整体权重趋于0,该值则对滤波后的整体结果影响不大。在图像的平坦区域,像素值变化很小,对应的像素值域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,边缘处像素值不同的pixel系数变小,从而保持了边缘的信息。
- OpenCV中的双边滤波
双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。opencv中提供了bilateralFilter()函数来实现双边滤波操作,其原型如下:
1
2
3
4
5
6
7
void cv::bilateralFilter(InputArray src,
OutputArray dst,
int d, //表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
double sigmaColor, //颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域
double sigmaSpace, //坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace
int borderType = BORDER_DEFAULT //用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT
)
7.AWB(Automatic White Balance)(自动白平衡)- 单独一篇文章
AWB分别执行在RGB不同的channel中,所以对demosaicing的顺序没有影响。
8.Color Correction(颜色矫正)CCM (Color Correction Matrix 颜色校正矩阵)
做ccm的时候,使用的图片没有进行过gamma运算,为了避免gamma影响,需要对目标图做一次反gamma计算,再将两者转到lab,通过算法,计算得到色差最小的ccm结果。
由于人类眼睛可见光的频谱响应度和半导体传感器频谱响应度之间存在差别,还有透镜等的影响,得到的RGB值颜色会存在偏差,因此必须对颜色进行校正,通常的做法是通过一个3x3 的颜色变化矩阵来进行颜色矫正。
Gamma之后ISP中的空间就变成了非线性sRGB空间了。但必须在这之前进行sensor_RGB空间到XYZ空间的转换再到线性sRGB空间的转换。
卢瑟条件(Luther condition)大意是说三个线性无关的原色,经过混合能够表示任意一种颜色。
由于相机的颜色匹配特性通常不满足卢瑟条件(也就是说sensor的RGB响应通常不是线性无关的),即相机的颜色匹配特性与CIE标准观察者之间并不存在线性关系。因此,我们需要某种方法来校正相机的特性,使其接近标准观察者。在实际的ISP处理中,这种方法通常以3x3矩阵的形式出现,称为色彩校正矩阵(colour correction matrix)。
一般在Demosic后,首先进行RGB域的2D去甚至3D去噪(为了避免CCM破坏噪声形态),然后再做CCM。而因为后续的Gamma也会对色彩有影响,故做CCM的时候需要提前导入Gamma表,一条Gamma曲线也只对应一个CCM。
CCM的作用主要有两个:其一就是完成了sensor_RGB色彩空间到线性sRGB色彩空间的转换,其二是使得相机的颜色匹配特性满足卢瑟条件。
通过拍摄24色卡的Raw图及目标数据,可以求得色彩校正矩阵: M_raw24 = M * M_tar24
M = [a11 a12 a13 … a32 a33]
-
约束条件【白平衡约束】:原本R=G=B的颜色在经过CCM变换后保持R’=G’=B’
-
联动方式:因白平衡仅能矫正广义上的白色,无法实现color constancy,故不同色温下需要有不同的CCM,相邻色温之间使用CCM的差值。不同Gamma需要有不同的CCM。
常用于计算CCM的方法:多项式拟合和三维查找表3D-LUT法。
- 多项式拟合(最小二乘):由于CCM的过程是sensor_rgb ——> XYZ ——> linear_srgb,其中通过24色卡来计算系数。如果需要通过从 nonlinear_srgb ——> linear_srgb 映射时,会造成误差。
- 3D-LUT:原理是寻找从sensor_rgb转到XYZ空间的非线性映射,因此需要找非线性映射函数,最后将源空间的数据和目标空间数据,依次放入表中,形成查找表。查找表用途广泛,但占用内存过高被弃用。
若CCM对角线上的增益大于1.5倍,则手动调整为1.5,同时把调整量平均分配给同一行的另外两个参数,保证一行相加仍为1。如果CCM对角线上的增益过大,则画面过曝区可能偏色或者特定颜色上(红色、蓝色)出现明显的噪声。
观点:
- CCM出现的最本质原因是因为相机的感光曲线和人类并不相同,M^2 矩阵其实是在弥补CIE1931RGB系统光谱三刺激值坐标轴的负数部分。
- CCM会增强彩色噪声,所以低照度下的CCM是个问题。
- CCM在Lab空间进行评测。我认为,AWB不在Lab评测的原因在于AWB很多算法只能估计得到色度值(r,g),所以没有办法转换到Lab。
- 实际ISP中一个光源需要一个CCM,因为在sensorRGB空间转换到XYZ空间的时候,不同光源下组成的sensorRGB不一样,所以转换矩阵会很不一样。
- CCM出现的最本质原因是什么:是因为相机的感光曲线和人类并不相同,CCM矩阵其实是在弥补CIE1931RGB系统光谱三刺激值坐标轴的负数部分。
9.Gamma Correction(伽马矫正)- 单独一篇文章
10.色彩空间转换 (CSC - Color Space Conversion)
将图像从sRGB空间转换到YUV空间等
11.Color Denoise
Transfer functions
The opto-electronic transfer function (OETF) is the transfer function having the scene light as input and converting into the picture or video signal as output. This is typically done within a camera.
The electro-optical transfer function (EOTF) is the transfer function having the picture or video signal as input and converting it into the linear light output of the display. This is done within the display device.
The opto-optical transfer function (OOTF) is the transfer function having the scene light as input and the displayed light as output. The OOTF is the result of the OETF and the EOTF and is usually non-linear.
3A 算法
图像的Post Processing
1. Tone Mapping:用显示器上有限的动态范围来实现类似于HDR的效果,原理是局部相邻像素的亮度对比
实际上,由于人类视觉对光照的绝对强度并不敏感,真正起作用的是可视区域内相邻局部之间的亮度对比。根据这个原理,人们可以在图像中过滤掉大部分由光源引起的背景亮度成分,只保留由材质引起的相对亮度成分,这样可以极大地压缩场景的动态范围,使图像在标准显示设备上也能取得与真实场景几乎相同的知觉。
Tone Mapping 用于解决亮处过曝,而暗处太黑丢失细节的问题。在有限动态范围媒介上近似显示高动态范围图像的一项计算机图形学技术。用于打印结果、CRT 或者 LCD 显示器以及投影仪等都只有有限的动态范围。即HDR image -> Tone mappping -> LDR image
The purpose of the Tone Mapping function is to map the wide range of high dynamic range (HDR) colors into low dynamic range (LDR) that a display can output. This is the last stage of post processing that is done after the normal rendering during post processing.
经典方法:
-
Reinhard tone mapping,将暗色提亮,亮色变暗,使得整个图像偏向灰色。同样也是“全动态范围输出”或“套log”图像的情况,即色彩直方图往图像中间压缩。采用log编码方式的视频在普通显示器上看效果是灰灰的颜色,因此也常被称为log灰视频,在后期制作过程中需要进行调色(color grading),从而恢复出光鲜亮丽的正常效果。
-
Filmic tone mapping,通过曲线进行拟合。
-
Academy Color Encoding System(ACES),定义了一个颜色编码系统或一个颜色空间,是一个通用的数据交换格式(基于Gamma的算法)
色调映射的方法大致分为两类 ,即全局算法和局部算法。
色调映射可以是全局的(Global Tone Mapping, GTM),映射算子具有空间不变性(spatial invariant),也可以是全局结合局部的(Global and Local Tone Mapping, GLTM),映射算子随空间位置而变化(spatial variant)。这两种算子分别对应人类视觉系统的全局适应(global adaptation)和局部适应(local adaptation)特性。在此基础上还可以发展出第三类,即时变色调映射,其映射规则会随时间推移而变化,通常用于处理视频序列。
一般来说,全局色调映射比较简单,计算较快,而局部色调映射算法复杂,计算较慢。在实践中经常会使用查表法加速全局色调映射算法,使其适合摄像机类的实时视频应用。当场景动态范围远大于影响系统的动态范围时,采用全局色调映射会损失较多的对比度和细节,此时需要引入一些局部色调映射的处理,用于改善对比度,保持更多的细节。
全局算法(Global Tone Mapping,GTM)
特点:
1.任意相同颜色的像素点,在映射后,还是相同的颜色; 2.全局算法一般较简单,速度快; 3.全局算法的性能一般劣于局部方法;
存在算法 : 直方图均衡化、Gamma、对数校正、直方图规定化、分段灰度变换
局部算法(Local Tone Mapping,LTM)
特点:
1.映射前颜色相同的像素点,映射后颜色可能不同 2.局部算法一般较全局方法更复杂,速度相对较慢; 3.局部算法的性能一般优于全局方法; 4.会出现光晕等现象
存在算法 : 分块中值直方图,基于Retinex原理的算法等
TM对颜色和白平衡的影响
TM的目标不在于修改AWB等其他颜色处理模块处理后的颜色,至少其颜色的Hue角度会保持不变,颜色的饱和度在一定情况下会被削减。在一定程度上因为削减了饱和度降低了偏色,但并不会解决偏色的问题。
1D-LUT
一维查找表则为一个输入对应一个输出的值,例如gamma矫正可以通过存储8bit-256个整数值来实现,精准快速。
3D-LUT (RGB-LookUp Table)
In the film industry, 3D lookup tables (3D LUTs) are used to map one color space to another. Some camera manufacturers offer LUTS to help transform their camera output into different colourspaces.
滤镜效果,用于快速渲染视频颜色及曝光。原始的RGB会有一个新的RGB值对应。
使用方法:1. 使用3D lut流程的必需步骤是拍摄RAW格式文件,像素越高、动态范围越大,越适合做3D lut流程;2. 做全动态范围输出,俗称“套log”,一般有log文件的就挂log文件,如果没有log文件则调整曝光等参数将直方图尽量往中间挤,这叫手动log。如果比较熟悉手动log之后,可以在Lightroom里添加预设,一键log。3. 导出成无损的PSD给Photoshop,如果使用ACR就直接导出即可。 4. 点右侧的“颜色查找”并导入lut文件,进行套色。注意lut是占一整个蒙版的,也可以反复导入lut,也可以给亮度蒙版导入lut。我个人习惯是每个lut一个蒙版,可以控制透明度来控制lut强度。 5. 微调输出,3D lut必须锐化和缩图,首选USM锐化,建议数值在75%-135%、像素点在1.0-2.5之间。缩图按社交网络的传图要求来,一般我习惯缩图在2560以下,那样暗部噪点会看起来不那么明显。
常用的数量是17,33,65 grid cubes 3D-LUT
Sharpening
Denoising (multi-frame)
降噪通常包含,Bayer降噪(即linear_srgb之前)的降噪,防止在CCM过程中,放大对应的噪声。以及YUV域的对Y和UVchannel的分别降噪。一般对Y使用bilateral降噪,保证其细节特征不丢失,对UV域可以使用更快速简单的kernel来降低色彩域的噪声。