chromatix项目必须包含有效的
ADC
image.png
filcker:
交流电照明灯发出的光会一定频率的抖动导致sensor图像出现行方向的水波纹,称之为filcker。目前主要的交流电频率有50HZ和60HZ两种。为了避免出现flicker,要求曝光时间大于base值时必须是base的整数倍。
image.png
Blacklevel
Blacklevel简单的说就是黑电平,指在dark下pixel的输出值,这个值可能为正亦可能为负,在正常光照输出时需要减掉blacklevel值,blacklevel的统计和正常输出时减blacklevel都芯片内部实现,可通过寄存器调整。blacklevel值的统计方法有三种。1帧统计,4帧统计,8帧统计。
blacklevel引起的图像抖动
通过开关blacklevel来确认,主要可能是blacklevel不稳,如果是单帧统计改为4帧统计,8帧统计是否有变化,是否sensor散热不好引起,>>需要测试ob值的变化。、
blacklevel引起的偏色
通过开关blacklevel来确认,blacklevel统计值偏大会引起暗态偏绿,而统计值偏小会引起暗态偏红。
拍照切换
当预览和拍照采用不同参数时,需要注意blacklevel控制寄存器的修改,因为拍照时间很短,不可能有很多帧来统计blacklevel,因此要求把拍照参数中的blacklevel改为1帧统计。
adb命令
以 root 权限运行 adbd
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
所以如果 adbd 以普通权限执行,有些需要 root 权限才能执行的命令无法直接用adb xxx 执行。这时可以 adb shell 然后 su 后执行命令,也可以让 adbd 以 root 权限执行,这个就能随意执行高权限命令了。
adb root
adb root //打开命令要有root权限
adb remount
'adb remount' 将 '/system' 部分置于可写入的模式,默认情况下 '/system' 部分是只读模式的。这个命令只适用于已被 root 的设备。
adb shell setprop persist.camera.stats.debug.mask
在将文件 push 到 '/system' 文件夹之前,必须先输入命令 'adb remount'。
adb shell setprop persist.camera.stats.debug.mask
其中
typedef enum {
STATS_DEBUG_MASK_ AEC LOG = (1 << 0), //
STATS_DEBUG_MASK
STATS_DEBUG_MASK AF LOG = (1 << 2), //4 //对焦
STATS_DEBUG_MASK ASD LOG = (1 << 3), //8 //自动场景选择
STATS_DEBUG_MASK AFD _LOG = (1 << 4), //16 //工频干扰消除
} stats_debug_mask_type;
注意,以上是按二进制位的方式来确定的,单独打开一个会关闭其它。
如以下同时打开aec, awb, af三都算法日志
adb root //打开命令要有root权限
adb shell setprop persist.camera.stats.debug.mask 7
adb logcat
在确定连上手机后(adb device,可以看到电脑连接的手机)
在cmd窗口中输入如下命令,就可以像Studio中的Logcat窗口中显示日志信息:
//格式1:打印默认日志数据
adb logcat
//格式2:需要打印日志详细时间的简单数据
adb logcat -v time
//格式3:需要打印级别为Error的信息
adb logcat *:E
//格式4:需要打印时间和级别是Error的信息
adb logcat -v time *:E
//格式5:将日志保存到电脑固定的位置,比如D:log.txt
adb logcat -v time >D:log.txt
TOF是Time of flight的简写,直译为飞行时间的意思。所谓飞行时间法3D成像,是通过给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉冲的飞行(往返)时间来得到目标物距离。
光学防抖(英语:Optical image stabilization),是指在照相机或者其他类似成像仪器中,通过光学元器件的设置,例如镜头设置,来避免或者减少扑捉光学信号过程中出现的仪器抖动现象,从而提高成像质量。
振铃效应(Ringingeffect)是影响复原图像质量的众多因素之一,是由于在图像复原中选取了不适当的图像模型造成的,振铃效应产生的直接原因是图像退化过程中信息量的丢失,尤其是高频信息的丢失,其严重降低了复原图像的质量,并且使得难于对复原图像进行后续处理。
MIPI格式:
mipi格式图像数据是一种压缩过的raw图像数据储存格式,采用5字节共40比特来存储4个10bit宽的raw数据采用大端的存储格式。
弥散圆
https://jingyan.baidu.com/article/08b6a591e6abca14a80922a6.html
拍摄黑电平图像
相关调试模块:黑电平补偿
用黑色物体挡住镜头,然后在完全黑暗的房间中拍摄两张 Raw 图像。
拍摄光源阴影控制图像
相关调试模块:镜头光源阴影控制。
拍摄MCC色卡图像
相关模块:
色彩校正
gamma LUT
bayer AWB
AWB弱光LUT
ABF和WNR噪声分析
a.将 MCC 色卡置于光源箱正中央。
b.调整设备位置,保证在 100% 视野 (FOV) 条件下拍摄 MCC 色卡(MCC 色卡的宽度必须
等于图像宽度)。
c. 按照 Image Gallery 电子表格中的指定内容设置光源箱条件。如果无法控制光源箱的亮
度,可使用 ND 滤镜进行调节。
d. 拍摄一张 Raw 图像。
针对 Image Gallery 电子表格(色卡类型值为 Macbeth,色卡位置值为 Bottom Right)中的
每个色温和光照水平组合执行以下步骤。
a. 将 MCC 色卡置于光源箱的右下角。
b. 调整设备位置,使 MCC 色卡占据摄像头 FOV 的 70%。
c. 按照 Image Gallery 电子表格中的指定内容设置光源箱条件。如果无法控制光源箱的亮
度,可使用 ND 滤镜进行调节。
d. 拍摄一张 Raw 图像。
拍摄平场视图
相关调试模块:色彩校正
从光源箱中取出所有色卡。
将设备放置在拍摄 100% FOV MCC 图像时的位置。
按照 Image Gallery 电子表格中的指定内容设置光源箱条件。如果无法控制光源箱的亮度,
可使用 ND 滤镜进行调节。
拍摄一张 Raw 图像。
在光源箱中拍摄灰卡图像
相关调试模块:
AWB参考点
AWB弱光LUT
将 18% 灰卡置于光源箱正中央。
调整设备位置,使灰卡占据摄像头 FOV 的 100%。
按照 Image Gallery 电子表格中的指定内容设置光源箱条件。如果无法控制光源箱的亮度,
可使用 ND 滤镜进行调节。
拍摄一张 Raw 图像。
在晴朗的室外拍摄灰卡图像
相关调试模块:
■ AWB 参考点
■ AWB 弱光 LUT
在接近中午时分,在阳光直射条件下,用 18% 灰卡填满预览屏幕。
拍摄一张 Raw 图像。
拍摄ISO12233分辨率测试卡图像
相关调试模块:自适应空间滤波器(ASF)
自适应滤波是近年以来发展起来的一种最佳滤波方法。它是在维纳滤波,Kalman滤波等线性滤波基础上发展起来的一种最佳滤波方法。由于它具有更强的适应性和更优的滤波性能。从而在工程实际中,尤其在信息处理技术中得到了广泛的应用。自适应滤波存在于信号处理、控制、图像处理等许多不同领域,它是一种智能更有针对性的滤波方法,通常用于去噪。
将 ISO12233 分辨率测试卡置于光源箱正中央。
调整设备位置,使测试卡占据 FOV 高度的 100%。FOV 通常会捕捉图中红色虚线划定的区
域。
按照 Image Gallery 电子表格中的指定内容设置光源箱条件。如果无法控制光源箱的亮度,
可使用 ND 滤镜进行调节。
拍摄一张 Raw 图像。
手动ISP调试
手机调试程序可用作初步调试的补充自动调试,也可独立自动调试使用,已完成初步调试。如果选择手动完成初步调试,可使用以下管道图中的数字作为指南,这些数字指示对MSM8996芯片组进行手动初步调试需要完成的任务以及任务的执行顺序,
1.为ISP模块调试AEC触发点
2.调试黑电平
3.调试ABF3
4.调试镜头光源阴影控制
5.调试色彩校正
6.调试WNR
7.调试ASF 9x9
8.调试AWB参考点
ADRC
要启用项目的全局ADRC,点击ISP Tuning选项卡中的configure,然后选择enable ADRC复选框。
单色调色
调试单色项目时,调试管道如下图所示。需要完成的任务相同,但一些与颜色相关的 ISP 模块已从管道中删除,因为项目创建时选中了 Mono 复选框。
调试ABF
ABF可在降噪的同时不钝化边缘,该 ABF 模块可供以下芯片组使用:MSM8996、MSM8994、MSM8992、MSM8084。
常规 2D 卷积滤波会使图像质量劣化,尤其在应用于 Bayer 像素时。为了在降噪的同时不钝化边缘,可采用能够根据相邻像素的值调整其内核的自适应拜尔滤镜 (ABF)。
调试RNR
1.在使用位置调试和微调ABF
调试各个区域的minmax filter和curve_offset。
调试ABF时,由于RNR会处理边角处的噪点,因此只需要侧重于图像中心噪点。
2.调试光源阴影控制校正。
3.检查光源阴影控制表,判断传感器经过了完全还是部分ISP光源阴影控制校正。
对于经过完全ISP光源阴影控制校正的传感器,rolloff_gain的最大值为2至4。
对于经过部分ISP光源阴影控制校正的传感器,rolloff_gian 的最大值要小的多,该值通常接近于1,因为会进行传感器内光源阴影控制校正。
对于经过完全ISP光源阴影控制校正的传感器,可更改各个区域的spatial_scale参数;大多数情况下都会达到满意的效果。
5.经过部分ISP光源阴影控制校正的传感器,可更改distance_perceentage和gain_percentage参数,按比例扩大到光源阴影控制表。如果需要,可以为所有区域设置spatial_scale=1。
6.重复执行这些步骤,评估所有光照区域和两个传感器一个是经过完全ISP光源阴影控制校正,另一个经过部分ISP光源阴影控制校正,以确保获得最佳的图像质量。
调试ACE
高级色度增强模块对颜色进行优化,使其更接近于人眼观察到的颜色。拍摄JPEG快照图像时,RGB颜色空间会转换YCbCr颜色空间,默认情况下,RGB值会转换为YCbCr值,但不改变任何信息。由于人眼观察到的色谱不同于摄像头传感器拍摄到的色谱,因此摄像头捕捉到的颜色会与人眼观察到的颜色有所不同。可对用于将RGB转换为YCbCr的转换矩阵进行优化,使还原色彩与人眼观察到的颜色更为接近。
AEC模块可增强空间色彩,同时不会影响其他颜色。
为ISP模块调试AEC触发点
为ISP模块设置触发点,用于修改各光源条件之间的插值点。
头文件整合到设备中后,使用chromatix工具为每个ISP模块计算AEC触发点。这些值用于修改弱光和正常光之间以及正常管和强光/室外光之间的插值点。
1.将摄像头对准100%FOV的MMC色卡并拍摄JPEG图像,尽管这些信息在任何光源条件下获得,QTI 仍推荐在光源箱内使用 bright TL84。记录用于拍摄图像的 Lux 级。
调试ASF
ASF是一种根据边缘检测结果对图像的不同部分执行平滑和锐化处理的自适应滤波器。他可对细节较少的区域进行平滑处理以实现降噪,对边缘进行锐化处理以提升图形的锐度。
使用ASF映射仿真边缘检测
生成JPEG图像的ASF映射,识别ASF边缘检测内核发现的水平或垂直边缘。
自适应空间滤波器映射使用ASF边缘检测内核处理当前JPEG图像识别水平或垂直边缘,并重叠在原始图像上显示这些边缘,使用透明的蓝紫色覆盖,相应边缘以黄色显示,映射结果有助于判定是否需要对ASF模块进行进一步调试。
调试AWB ISP模块
有选择性地调整AWB增益值,以对管道中后续模块的AWB算法施加影响。
白平衡用于补偿光源对场景的影响,人眼擅长擅长根据光源条件进行调整,尽管有来自光源的色彩干扰,仍然能够使白色物体呈白色。白平衡算法的目的是还原场景的色彩,以模拟人眼的这种调整功能。一般来说,使用从色彩校正矩阵生成过程计算得到R/G/B增益可获得更佳的性能,因此,默认情况下会选中use gian from color correction 复选框,并且无需对该模块进行进一步调试。如果希望在生成色彩校正时使用不用的白平衡增益,取消选中该复选框并输入特定的R/G/B的增益。
色温的种类
人造的标准光源主要有如下10种类型:模拟蓝天日光——D65光源 色温:6500K
D65--国际标准人工日光(Artificial Daylight) 色温:6500K 功率:18W
模拟北方平均太阳光——D75光源 色温:7500K
模拟太阳光——D50光源 色温:5000K
模拟欧洲商店灯光——TL84光源 色温:4000K
TL84--欧洲、日本、中国商店光源 色温:4000K 功率:18W
模拟美国商店灯光——CWF光源 色温:4100K
CWF--美国冷白商店光源(Cool White Fluorescent) 色温:4150K 功率:20W
模拟另一种美国商店灯光——U30光源 色温:3000K
U30--美国暖白商店光源(Warm White Fluorescent) 色温:3000K 功率:20W
模拟指定的商店灯光——U35光源 色温:3500K
U35--美国零售商塔吉特-Target指定对色灯管,色温3500k
模拟家庭酒店暖色灯光——F灯 色温:2700K
F--家庭酒店用灯 色温:2700K 功率:40W
模拟展示厅射灯——Inca灯 色温:2856K
A--美式厨窗射灯 色温:2856K 功率:60W
模拟水平日光——Horizon 色温:2300K
TL83 --欧洲标准暖白商店光源 (Warm White ) 色温:3000K 功率:18W
UV--紫外灯光源(Ultra-Violet) 波长:365nm 功率:20W
手动调试AWB参考点
手动设置AWB计算定义灰色区域的AWB参考点。AWB参考点指的是不同光源的灰色R/G和B/G比率,灰色的参考点用来为AWB计算确定灰色区,由于频谱灵敏度的原因,每个传感器模块的R/G和B/G比率都不尽相同。需要针对每个传感器模块进行参考点。
要进行手动调试,应使用下列步骤调试AWB参考点,执行完手动ISP调试部分时,在调试完所有必需ISP模块后执行此操作。
调试黑电平
黑电平调试会调整图像最暗部分的亮度水平。会取三张图像的平均通道来计算黑电平偏移值。然后会从像素输出中减去这些偏移值,以获取校正后的值。
调试CAC v2
色差会导致图像亮暗分界线产生条纹。CAC会校正以下视觉伪影。
调试通道均衡
使用通道均衡模块的默认值进行初始调试,如果在特定用例(例如,比率差异固定的不均衡 RGB Bayer组件)下需要使用固定数字增益,则在为微调过程中可能会需要调试该模块。
在很多图像传感器中,红色、绿色和蓝色Bayer元件是不均衡的,务必校正颜色通道的不均衡现象,这样才能以最好的执行去马赛克算法。如果不进去校正,各通道之间、特别是奇数和偶数绿色列之间的不均现象会导致去马赛克算法错误地进行边缘检测并产生噪声输出。
调试色度抑制
图像中的亮区有时会显示轻微的偏色,原因是白平衡不正确或镜头偏色,色度抑制可消除或减少偏色。
概念
图像的亮区有时会显示轻微的偏色,原因是白平衡不正确或镜头偏色,色度抑制可消除或减少偏色。具有高色度值的亮区不受影响。
图像暗区通常为黑色,但色度噪声会在其中加入不必要的色彩伪像,色度抑制有助于自消除或减少这些色彩伪像。
色度抑制的作用是降低过暗和过亮区域的色度值。
调试CCM使用color correction Tuning对话框最大限度的降低色彩还原误差并提高色彩保真度。
前提条件:
调试色彩校正矩阵(CCM)之前,必须确保gamma曲线的准确性。如果对gamma曲线进行了任何更改,都需要重新调试CCM。
紫边
紫边出现的原因是与相机镜头的散色、CCD成像面积过小、相机内部信号处理算法。
在拍摄高反差背光物体照片中,物体边缘出现了刺眼的紫边,这一点,几乎绝大部分DC和DV都存在此问题,
镜头眩光
所有镜头在它们传输影像的过程中都会受到某些非理想性因素的影响相机的镜头是由许多片单独的玻璃透镜安装在一起组合而成,这些单独的玻璃透镜叫做透镜单元,明亮的光线通过照相机镜头时,一部分光线就会被这些透镜单元的各个表面反射回去。这种内部的反射能够引起一种幻影,并像影响一样出现杂最后的照片上。眩光的主要是由于光源位置与视点的夹角造成的,亮度极高的光源,经过反射产生的高度极高的光或者强烈的亮度对比,就会让观众产生眩光。展览环境中的眩光有一次发射眩光还有经过二次反射产生的眩光。眩光不但会造成视觉上的不适应感,而且强烈的眩光还会损害视觉甚至会引起失明。
拖动Noise weight滑块,改变色彩还原与降噪之间的平衡。噪声权重设置决定噪声的重要程度,如果滑块为0,将优化进行色彩还原,不考虑噪声,向右移动滑块可最大限度地降低噪声但会牺牲色彩还原效果。
选中target saturation复选框并拖动target saturation 滑块更改饱和度水平,虽然一般不调整饱和度水平,但在噪声权重增大时,可通过该方法增大饱和度。
校正缺陷像素
缺陷像素会表现为亮点或暗点,有时会成簇或成对出现,在噪声滤波和色彩滤波阵列插值处理前,缺陷像素校正必须找打缺陷像素并将其校正。
FMAX和FMIN值反映校正数量,FMax和FMin相差越大,说明校正量越少,两个值相差越小,说明校正量越大。FMax=FMin表示应用了最大校正量。
调试去马赛克
使用去马赛克模块的默认值进行初始化调试。去马赛克模块会对色彩滤镜阵列样本进行过滤并重建成完整的RGB彩色图像。
前提条件:数字彩色图像的每个像素点通常都是有三种颜色样本组成,即红色、绿色、蓝色。但是在数码摄像头中如果为每个像素点分别使用三个颜色传感器来测量R/G/B颜色值,成本将非常高。因此,大部分数码摄像头都使用单芯片图像传感器,图像传感器中的每个像素都被R/G/B色彩滤镜覆盖吗,以此捕获颜色信息。单芯片图像传感器中覆盖像素的微小色彩滤镜的马赛克称为色彩滤镜阵列。最常用的CFA是由2x2的马赛克块构成的bayer马赛克,每个马赛克都包含两个绿色滤镜、一个蓝色滤镜和一个红色滤镜。
编辑gamma设置
为每种亮度条件准备gamma曲线。
chromatix提供多种类型的gamma曲线,除非需要使用自定义曲线,一般都可以提供的列表中选到满足要求的曲线。按照程序查看chromatix提供曲线或创建自定义曲线,自定义曲线可以基于已有的曲线、可以通过幂函数创建。也可以通过导入gamma表创建。
调试GIC
某些传感器的Gb和Gr通道可能会出现严重的失衡,因此失衡导致的伪像可能无法完全由bayer域中的ABF降噪模块校正。绿平衡校正可以消除因传感器对Gr和Gb通道的不同灵敏度而造成的带状伪像。
调试镜头光源阴影控制
根据摄像头大小和质量的不同,图像中心看起来通常要比边角区域亮,镜头光源阴影控制调试会校正亮度衰减和不均匀色彩亮度(色差)。
调试LTM
局部色调映射(LTM)使暗区或亮区的细节更加明显,他通过增强对比度来提升图像的视觉效果。
调试MCE
某些特定颜色(列如生动鲜艳的绿色与明亮蔚蓝的天空)是从主观上衡量颜色质量的重要指标。MCE模块可确保在增强某种颜色时不会影响该颜色在Cb-Cr空间工作区的其他颜色。
调试SCE
试用SCE模块优化肤色,使图像赏心悦目。
调试SNR
SNR会检测图像中肤色并检测区域实现平滑降噪处理,可以选择对该ISP模块进行调试。
调试WNR
如果在弱光条件下拍摄的图像中出现不需要的色度噪点,调试小波降噪模块可减少亮度和色度的噪点。
同时对光照区域进行WNR调试
将RNR融入ABF
RNR的基本概念:
图像FOV中的噪声并不是均匀分布的,由于光源阴影控制校正的原因,图像边角通常包含较多噪点,因此会使用RNR使FOV中的噪点均匀分布。
ADRC概念
ADRC可防止图像背景过度曝光,而不会导致整个图像变暗。
使用100%GTM可提升对比度,但是导致褪色,使用100%LTM可导致部分区域对比度下降但色彩效果更佳。
边缘增强可增强边界局部对比度,从而增强图像的清晰度,CPP硬件中的ASF模块使用高通滤波器增强边缘,平滑处理可应用到非文理区域来抑制噪声。
ASF逻辑模块包含新的ASF结构,其中包括用于检测边缘和实现锐化的独立组件ASF模块使用基于边缘定向的锐化,由四个边缘检测器、四个定向锐化滤波器以及一个对称锐化滤波器,边缘定向结果决定使用哪个锐化滤波。
钳位
钳位参数可帮助校正在边缘锐化过程中可能产生失真,在开始调试时应采用较宽的钳位值,即绝对值较大的值。在ASF调试最后几步中应采用严格的钳位值,即绝对值较小的值,这些交严格的钳位可以改善光晕的效果,正常或较低光源条件下通常会产生光晕效果。
混合采用中值滤波器
混合采用中值滤波器功能可以抑制GrGb通道不匹配造成的尖峰和噪声伪像。可以再Tune Adaptive Spatial Filter对话框的other选项卡启用或禁用该功能。
黑电平调试概念
由于图像感光器所具有的特性,传感器对场景的亮度的输出响应不一定是线性的,并且不同光源条件下可能有所不同,列如传感器光子响应曲线在强光饱和度条件下几乎是平的,在黑楠环境下,由于暗电流的原因,传感器输出将不会完全为零,
黑电平偏移值取决于使用的具体传感器,并且是包含集成时间。曝光对应的整体增益设置和温度的函数,必须为不同光源条件下每个像素的每个通道校正传感器响应的黑电平。
黑电平偏移使用2通道或4通道黑电平校正,然后会从像素输出中减去黑电平偏移值,以获取矫正后的值。
BPC/BBC调试概念
缺陷像素会表现为亮点或暗点,缺陷像素有时会成簇出现,出现坏点的原因包括:
传感器模块半导体工艺存在缺陷-传感器制造过程中势阱渗漏、像素灵敏度异常或电阻损耗可导致坏点/坏点簇产生。
安装镜头时落入灰尘-灰尘颗粒在安装镜头时会在传感器顶部。
传感器模块老化-传感器模块积累的坏点随使用时间变长而增多。
要校正热像素,应从 G2 中查找最大像素值。这称为 MP 。如果 G1 > (MP * FMax) * 2 ^ ( 最大移位 ) + BPC 偏移,则将 G1 替换为 MP 值。否则,使用原始 G1 值。
要校正冷像素,应从 G2 中查找最小值。这称为 mP 。如果 G1 < (mP * FMin) * 2 ^ ( 最大移位 ) +BPC 偏移,则将 G1 替换为 mP 值。否则,使用原始 G1 值。
坏点簇定义为同一颜色平面内的两个或多个缺陷像素,成对坏点簇由同一颜色平面内的两个相邻缺陷像素组成。三重坏点由同一颜色平面内的三个相邻缺陷像素组成。
下图显示的是两个单独的坏点,一个坏点位于Gr颜色平面,而另一个坏点位于Gb颜色平面。
缺陷像素和缺陷像素簇检测方法是将图像传感器的特定彩色像素值与同中颜色相邻像素值进行比较。可用于校正点的调试选项包括。
动态坏点校正
DBPC可校正热像素或冷像素,他是用4通道、3x3掩码,然后使用8个相邻像素检测并校正单个坏点。
动态坏点簇校正
image.png
CACv2调试概念
色彩混叠校正用于图像中的视觉伪像,其生成原因是不同带宽的入射通过镜头时发生轻微折射,未达到摄像头传感器的同一视觉平面。
CACv2调试参数不仅最图像视觉伪像的检测造成影响,还会影响为消除检测到的伪像而施加补偿量。
由于摄像头系统中使用的光学元件和传感器所具有的特性,当图像显示在特定输出介质上时,原始RGB数据可能不能真实地呈现给人眼,因此需要进行色彩校正。
在现代数码相机设计中,由于色彩校正可帮助系统实现更高的色彩质量和更高的保真度,因此已成为色彩信号处理过程中不可或缺的部分,通常使用3x3矩阵进行颜色校正。色彩校正矩阵(CCM)调试可最大限度地降低色彩还原误差并能提高色彩保真度。
阴影表示各光源条件下的对角色彩饱和度参数:
值越大表示色彩饱和度越高
值越小表示色彩饱和度越低。
使用色彩校正对CC矩阵进行微调,以提高色彩的饱和度。在chromatix头文件中,共有七个CC矩阵:
三个用于表示不同色温的矩阵
两个用于表示弱光和户外条件的矩阵
两个用于表示LED闪光灯和频闪闪光灯的矩阵。
最终CC矩阵首先根据色温在三个矩阵之间通过插值进行计算,让后在将计算所得的矩阵根据AEC条件通过插值计算。
如果LED关闭,则矩阵通过弱光或者户外矩阵之间的插值计算得出,并通过AEC光源条件对矩阵进行控制。
如果LED开启,矩阵在LED闪光灯矩阵之间进行插值计算,并且通过LED触发点进行控制。
由于存在多个CC矩阵,因此必须先确定所要调试的矩阵。可通过AWB日志和A-light或D65触发点进行确定,这些触发点可指示在当前条件下占据主导作用的矩阵。
AEC日志显示增益和lux指数信息,而chromatix头文件中的弱光触发点决定是否使用弱光CC矩阵,然而,是否使用户外CC矩阵则由Gamma中的户外触发点决定。
如果闪光灯LED打开,情况将没那么复杂,首先调试LED闪光灯CC矩阵。
可使用chromatix工具从JPEG图像中嵌入的3A调试信息获取A-light和D65触发点以及弱光和户外触发点。
为确认增益和LUX指数,使用AEC调试日志并搜索关键字luxidx和aec_process_pack_out。要查找色温,执行以下操作之一:
在AWB调试日志消息中查找关键字Bayer AWB CCT.
使用chromatix查看JPEG图像中嵌入的信息。
为确认增益和LUX指数,使用AEC调试日志并搜所关键字luxidx和aec_process_pack_out。
色度抑制调试概念
图像中的亮区有时会显示轻微的偏色,原因是白平衡不正确或镜头偏色,色度抑制可消除或减少偏色,就有高色度值的亮区不受影响。
图像暗区通常为黑色,但色度噪声会在其中加入不必要的色彩伪像,色度抑制有助于消除或减少这些色彩伪像。
色度抑制的作用是降低过暗和过亮区域的色度值。
gamma调试概念
传统视频显示系统的像素值响应呈现非线性、冥定律特性,例如棘突阴极射线管的系统。gamma校正是指对图像传感器所摄亮度进行预调,使更暗的信号的在视频监视器上获得更佳显示的效果技术。例如gamma校正可能为像素值的1/2.5次幂函数,下图显示了gamma曲线如何提高深色区域的亮度。
image.png
概念和算法
本章提出的方法可以实现质量的gamma校正效果,能够在几乎没有任何视觉质量损失的情况下逼近实际的gamma曲线。通过各种实验证明,不必使用面向12位数据的具有4096个条目的LUT。受显示分辨率和人眼分辨率的限制,使用少数点逼近gamma曲线并用直线连接这些点即可。只要用于逼近gamma曲线的点的数量不是太少,经过线性插值处理的曲线就可拥有与原始曲线几乎相同视觉性能,针对每一帧的每种颜色都可以使用一个包含64个值LUT执行这种单像素、单颜色的gamma变换。
即使向gamma校正模块输入12位的数据,也不必准备4096个条目LUT。64个条目的LUT就足以满足要求,并且可通过线性插值扩展对这些条目。
gamma调试效果
gamma调试会调整摄像头传感器的像素灵敏度以增大特定颜色各种阴影之间的对比度,当拍摄数字图像后,会将各灰度级编码为特定的像素亮度值。像素编码可采用线性编码或gamma编码。
采用线性像素编码时,单个像素产生的信号量与照射在像素上的光子量之间呈一对一关系。不过gamma编码为非线性,需要通过提升和降低指定色调的像素信号水平来提高对比度。降低曝光曲线最左端并提升中部,借此可提高感知图像的对比度。
GIC调试概念
某些传感器的Gb和Gr通道可能出现严重失衡。此类失衡导致的伪像可能无法完全由bayer域中的ABF降噪模块校正。GIC可消除因传感器对Gr和Gb通道的不同灵敏度而造成的带状伪像。
镜头光影阴影控制调试概念
根据摄像头大小和质量的不同,图像中心看起来比 边角区域亮,镜头光源阴影控制调试会校正减衰和色差。色差通常是拍摄图像时使用红外滤镜造成。
传感器模块差异、镜头材料以及光源条件也会导致色差的出现。
image.png
镜头光源阴影控制调制参数
校正亮度光源阴影控制特性
需要为颜色通道响应进行中性光源阴影控制校正。仅适用一张表,光源阴影控制校正程度必须保持在适中水平,以避免弱光条件下“增强”。
无色差强度
校正色彩亮度均匀性
无色差调试强度决定色调和色彩与对象之间的决策。
增大无色差强度值可能会产生以下副作用:
增大色调校正
对对象或色彩造成不希望出现的效果
平移时可能会看到“拖尾色调”
场景中极弱的颜色会出现投影或丢失现象。
AWB Raw图像会查看一张完整的静态表来计算AWB参考点,利用正确色彩亮度均匀性进行光源阴影吧控制后,必须测量目标设备bayer网格统计数据中R/G和B/G,以此检查AWB参考点。
LTM调试概念
在高动态范围HDR条件下拍摄的图像可能会缺失亮区或暗区的细节,自然场景的动态范围较快,可能包含无法在显示设备中清除呈现的信息。
局部色调映射使暗区或亮区的细节更加明显。他通过增强对比度来提升图像的视觉效果,检查和像素的领域像素可确定像素是否需要光照。与全局色调映射相比,LTM的优势在于会照亮暗区,而不会对正常亮区进行处理,从而避免下降或意外更改色调的现象。
在原始图像中,亮区已饱和且缺少细节,而暗区过暗,细节不可见,在理想图像中,亮区得到的抑制,暗区得到的照明,细节可见度更高,理想图像效果赏心悦目,并且与人眼的响应相符。
image.png
LTM调试参数
chromatix头文件中的LTM调试参数包括:
触发控制方法
触发点
具有以下功能的各光源条件的核心参数
饱和度和最大增益控制
暗区提升机亮区抑制控制
局部色调增强和衰减控制
RGB到YP的转换
LTM固定曲线集。
饱和度曲线
该参数控制饱和度并且可降低对非线性域施加增益而引起的饱和度。
如果饱和度是一条不为零的直线,LTM的结果与为进行饱和度控制的结果相同。
要降低已提升区域的饱和度,饱和度曲线必须呈现右侧下凹并且左侧上凹的状态。
在弱光条件下,进一步降低饱和度同样会进一步降低色度噪点。
基于场景LTM微调
使用ABF3对暗区进行降噪
使用LTM增强局部对比度会提升暗区噪声,因此室内或弱光场景中的LTM作用不应付过强。如需对深色进行降噪,使用ABF3。ABF3中的噪声消除取决于噪声水平,因此可以使用此模块实现降噪。软件可以再ABF3噪声模板中自动增强降噪强度。从而对弱光图像的阴影区域进行动态降噪。
使用ASF9x9对暗区进行降噪
使用ASF模块可控制基于像素强度等级和活度的锐度强度,该模块可通过调试增益LUT降低暗区锐度强度。
AE收敛过程中的闪烁和振荡问题
1.如果AE收敛过程中曝光指数变化幅度较大,降低局部色调强度和局部色调对比度参数值可使LTM得强度发生衰减。
MCE调试概念
尽管色彩的真实性对于通过色彩保真测试非常关键,但呈现令人赏心悦目也同样非常重要,MCE调试模块在增强某些色彩的同时不会影响其他色彩。
生动的鲜艳绿叶、蔚蓝的天空以及红色增强的效果可提升观察者对于图像质量的评估结果。人眼在判断真实记忆色方面的准确度不是很高,因此色彩的饱和度越高,对观察者的吸引力越大。MCE可用于一般室外条件或特殊的最佳 拍摄模式,例如风景模式。
SCE调试概念
要获得高质量的人像照片,正确渲染肤色至关重要,尽管肤色属于记忆色的一种,但是人眼可能无法识别出真正的肤色,人眼会对因种族。文化和地域不同而导致的某些肤色差异表现出更多的关注。
肤色增强模块会对Cb和Cr分量进行处理,以增白或加深肤色,此模块还用于色彩强调以及色彩转换。由于SCE模块位于视频前端VFE中,因此无需进行后期处理,SCE会在拍摄过程中完成,因此功耗较低,几乎不存在任何延迟。
在现有的VFE管道设计中,ACE可调整颜色空间八个区域的任一区域的色相饱和度,然而,调整一个区域会对多达七个区域造成影响,此外,同一区域内的颜色必须沿同一方向调整,例如,不能再同一区域内增大某些颜色的饱和度,同时降低该区域内其他颜色的饱和度,这是ACE模块的固有限制条件,SCE模块可调整不同区域中特定颜色的饱和度。
SNR调试概念
肤色降噪(SNR)功能这一模块杂色彩转换和色度增强完成后出现。SNR的第一部分为肤色检测,该过程噪YCbCr通道应用低通滤波器,生成肤色概率图并对其进行平滑处理。SNR的第二部分为肤色降噪,该过程尽在Y通道应用LPF,并根据概率应用软阀值。
TNR调试概念
降噪模块的空间降噪功能能产生的效果不足以防止频闪现象,例如使用小波降噪WNR对摄像头预览或摄像头录下视频进行降噪就是如此,在观看此类视频时经常会看到频闪现象。若前一帧的噪声与当前的噪声几乎没有关联,会产生时域噪声,从而造成在视频中出现雪花伪像,时域降噪功能可将当前域之前的帧进行比较并基于比较结果进行降噪,因此可以有效的降低时域噪声。
WNR调试概念
来自传感器和VFE的图像通常带有多种噪声,小波降噪模块使用高级降噪方法降低亮度和色度噪点。
ISP微调概述
达到最低调试要求后,主观图像质量评估结果可能表明需要进行微调才能达到理想的效果,微调涉及到以下操作:
调整个别ISP模块的某些参数。ABF、ASF、色彩校正、Gamma和WNR模块的chromatix用户界面包括微调调整。
依照典型问题用例确定需要进行哪些调整才能达到理想效果。
色彩在现和色调在现的典型问题
调试AWB触发点
修改镜头光源阴影控制、色彩校正、ACE和SCE模块的光源触发插值点。
务必在初始调试的后及微调过程中检查AWB触发点,确保其正确性,调试ISP模块时需检查触发点:
镜头光源阴影控制
色彩校正和Gamma
色彩色度 增强
肤色增强
在各光源(H A D50 D65)下拍摄100%FOV灰卡JPGE图像。
手机彩色条纹问题
这种现象叫做频谱混叠,在待采样物体的空间频率高于手机摄像头的奈奎斯特采用频率时,输出图像就会出现频谱混叠现象,即上图中青色与红色的宽条纹。
高通AF调试
AF前期基础确认的流程
1.拿到模组,确认景深、结构是否有干涉、VCM上下电是否正常。
拿到golden模组,和模组厂确认远焦和近焦烧录的方向,而进取确认Dac Range是否合理,必要的时候进行margin修正覆盖最大Dac范围。
camera调试/测试时减光片的使用方法:
减光片通常是用在拍摄图片有过曝风险的时候,大部分都支持长时间曝光,因为在好的照明条件和比较慢的快门速度时,常会发生过曝,减光片可以减少进入镜头的总光量,并且允许我们可以从激流的河流得到平滑的表面。
另外,在使用大的光圈时,减光片有助于获得小的景深。在摄影时,利用景深拍摄是一个很重要的因素,因为一个小的景深是通过虚化背景强调主题。
中性滤光片
如果在结合ISO,光圈和快门速度仍然不能达到正确的曝光,在某种程度上进入的光量必须减少,要在光进入到化学系统之前就减少。
线性畸变
当试图近距离拍摄高大的直线结构,比如建筑物或树木的时候,就会导致另外一种失真,假设使用的是广角镜头,并且认为只把照相机稍微向上瞄准一点,就可以离得很近也能把整个结构拍摄下来,但是由于实际平行的线条显得不平行了,结果建筑物或树木好像要倾倒下来似的,这种失真现象称为线性畸变。
问题是处于向上倾斜照相机,镜头所瞄准的方向导致建筑物或树木的两侧充当了典型铁路轨道一样的及哦角色,及它们朝中心汇聚产生了正常的纵深透视。
测试色彩和色调还原效果
对色彩和色调还原效果进行微调之前,评估示例 图像以获得调试信息,使用此信息验证调试后的变化情况。
将MCC色卡置于光源箱中,并切换到标准光源,例如D65,在80%FOV条件下拍摄MCC色卡RAW图像。
使用chromatix打开DeltaE图,查看色度和饱和度。
使用直方图测量色彩分布
通过JPEG图像的所选ROI生成一个直方图,可以查看色彩分布情况。
使用直方图可以检测所选ROI中像素的色彩分布,直方图的x轴表示色彩强度值,y轴表示图像个数。
使图像色彩更加生动鲜艳
如果图像色彩杂某些光源条件下显得暗淡,提高色彩饱和度使色彩更加生动鲜艳。
调试步骤
使用手动测序“调试色彩校正矩阵”调试color correction gamma ISP模块,在该调试过程中,遵循以下指南提高整体色彩饱和度设置。
1.点击advance,以访问saturation adjustment滑块。
2.选中adjust all 复选框使滑块协同移动。
3.将所有饱和度滑块设为1.2,为使色彩更加生动鲜艳,一般采用该值开始调试。
4.按照color correction gamma调试步骤运行仿真,以此检查颜色质量,如果结果不理想,则遵循以下指南继续调试:
使用不同的整体色彩饱和度设置执行该调试过程。
运行仿真,使用新的整体色彩饱和度设置生成JPEG图像并保存:并且以不同的整体色彩饱和度设置创建更多的比较图像。
对采用不同饱和度设置拍摄图像进行比较,确定具有理想色彩饱和度设置的图像。
接受想要的设置并点击optimize,计算色彩校正矩阵。
提高整体饱和度之后,每种颜色的优化结果显示参考更高的色度值。结果可能会受AWB触发点设置的影响,如有必要,可按照调试AWB触发点程序检查并重新调试触发点。
使绿色更加鲜艳
现象
常规的调试步骤可同等程度的提高除绿色以外所有颜色的饱和度,如果某些图像希望使用的绿色。则需要增大绿色通道的饱和度值。
肤色增强
在执行AWB调试后,肤色仍然偏黄或偏红,微调可以纠正肤色问题从而形成更为真实地色彩。
色彩转换会影响整体的色彩向量和饱和度。更改色彩转换值的同时应该考虑到色彩协调性更改默认参数时,红色将变得不平衡而且色彩协调性不理想。
参数 影响
a_m 黄色饱和度
a_p 蓝色饱和度
b_m 绿色向量
b_p 红色向量
c_m 绿色饱和度
c_p 红色饱和度
d_m 黄色向量
d_p 蓝色向量
增大a_m还会增大黄色饱和度,在图中由向上指向黄色区域的箭头表示,减小a_m还会降低黄色饱和度,在图中由向下指向粉色区域的箭头表示。
增大c_p还会增大红色饱和度,在图中由向上指向红色区域的箭头表示。减小c_p还会降低红色饱和度,在图中由向下指向蓝色区域的箭头表示。
增大b_p会将肤色向量更改为蓝色色调,在图中由向下的箭头表示,减少b_p会将肤色向量黄色色调,在图中由向上的箭头表示。
改善过于偏红或偏黄的肤色
前提条件:
在运行3a日志的同时拍摄一张或多张人脸测试的图像,日志必须提供CCT触发lux_idx/gain触发信息。结果可能会受AWB触发点设置影响,如果必要,可按照调试AWB触发点程序检查并重新调试触发点。
通过调色色彩转换以及调试肤色增强的方法改善肤色,开始进行色彩转换调试,以改善肤色,如果需要进行附加调试,则继续执行肤色增强方法。
提升模糊图像的对比度
动态范围较窄会对gamma和线性造成负面的影响,导致图像变得模糊,调整gamma曲线好人黑电平可以改善图像模糊的情况。
建议对于所有光源都采用相同的线性值。
修正过暗的暗区和饱和的亮区
由于某些场景动态范围有限,图像中会包含过暗或过亮的区域,局部色调映射可用于显示暗区或亮区中隐藏的细节,如果gamma值过大,对比度将降低,因此必须根据可能造成的副作用来权衡对LTM进行的调整。
使MCC色卡中的颜色与参考设备对应的颜色相同
完成基本调试后,调试后的设备的一些图像颜色也可能与参考设备不匹配。
蓝色的天空应稍微像紫色调整
绿色的树叶应稍微向黄色调整
红色应更加饱和
使图像与参考设备相匹配可能需要额外进行CCM调试。可以对MCC色卡中的单一颜色进行调整,使其更匹配参考MCC图像并且对其他颜色几乎不会产生任何影响。
纠正蓝色图像偏紫的问题
图像中天空呈蓝绿色,而不是天蓝色微调可以纠正天空颜色问题从而形成更为真实地色彩。
包含蓝绿色天空的图像显示为偏向DeltaE图的红色区域,也就是天空颜色。
调试图像对比度以匹配参考设备
如果调试设备上的图像对比度与参考设备不匹配,将调试设备的gamma曲线调整为与参考设备相匹配可修正此问题
1.确保调试设备与参考设备的AEC设置相同。
2.使用调试设备在下列光源条件下分别拍摄Kodak灰度卡的raw图像
图像照明;室外光照;弱光
3.使用参考设备在相同光源条件下拍摄Kodak灰度卡的JPEG图像。
4.通过使用参考设备在相同设备拍摄的gamma图像生成gamma曲线并保存。
噪点和锐度典型问题
使用MTF图形测量锐度
通过生成MTF图形来评估分辨率测试卡JPEG图像的某些锐度特性。调制传递函数图形是一种用于评估锐度和对比度的行业标准方法。图形的Y轴表示对比度,X轴表示每个像素周期数。
骁龙相机
使用骁龙相机拍摄.raw图片,点击多次红眼消除,把ZSL关闭才能拍摄raw图。
弱光条件下的色彩降噪
弱光条件下拍摄图像出现不必要的色度噪点
现象:色度噪点通常在弱光条件下比较明显
通过足部增大denoise scale和denoise edge softness并减小denoise weight,可降低弱光条件下的色度噪点,denoise scale 结合噪声模板来确定降噪范围。denoise scale值越大降噪强度更大,这样便可控制噪点量。不要过度增强色度降噪,这样可能导致产生渗色伪像,如果丢失过多色度信息,则图像整体饱和度就会降低。
验证:测定原始图像与调试图像的信噪比,验证图像的噪点是否有所减少。下例显示均匀修改Denoise scale设置后的结果,在各图像中,对所有频率等级采用相同的设置,第5层和第6层中的Y通道除外,这些设置会对所有频率等级产生降噪效果,但是可能会因第5层和第6层的降噪精度增大而产生渗色问题。
edge softness 用于控制提取原始图像的噪点量,下例显示均匀修改denoise edge softness设置后的结果,在各个图像中,对所有频率等级采用相同的设置。这些设置会降低频率等级的降噪强度。
下例显示均匀修改denoise edge softness设置的结果,在小幅和大幅修改的用例中,各个频率等级对应的设置均有不同,这些设置会对每个频率等级形成不同的降噪强度。
denoise weight 用于控制软阀值过程中wnr对原始图像的降噪强度,权重值越小,降噪强度越大。
下例显示均匀修改denoise weight 设置后的结果,在各个图像中,对所有频率等级采用相同的设置,第5层和第6层中的Y通道除外,这些设置会降低所有频率等级的降噪强度。
天空图像降噪
现象:湛蓝天空的图像出现不必要的噪点,微调亮度降噪参数可减少这些噪点。
减少亮度(Y)通道中蓝色天空的噪点,逐步调整Y参数值,增大denoise scale参数或者减小denoise weight参数可实现降噪,增大denoise edge softness参数时应多加小心,应小幅调试该参数,尤其针对在强光条件下拍摄图像。
利用各种设置生成MCC色卡并进行对比,以确定最佳降噪参数配置,将色度参数设为最佳值。
验证:增大亮度降噪会导致边缘和细节信息丢失,测定原始图像与调试后图像的SNR,验证图像的噪点是否有所减少,下图给出了与原始图像和调试图像相关的SNR测量值。
增加绿草图像细节或提高图像整体锐度
调整边缘增强可改善包含绿草的图像中的细节。
拍摄包含绿草的户外图像以评估噪点和细节水平,噪点和细节水平会受到锐度提高的影响,在chromatix头文件中,使用微调后的LUT比较调试设备中的新图像与参考设备中的图像。调节边缘增强程度可以提供更多边缘细节,从而提升图像清晰度。
拍摄户外图像以评估天空和建筑物的噪点水平,噪点会受到锐度提高的影响。
拖动detail滑块调整细节锐度,调整details滑块时必须多加小心,因为他会噪点水平和细节。
拖动sharpening degree滑块,调整整体锐化量。
锐化量
锐化类似清晰度,只作用于物体的边缘,但原理有所不同。锐化主要是通过在边缘两侧,增加黑白相间的高对比线条“隔离带”,让边缘看起来更加突出锐利。
减轻边缘光晕效果
调整manual fixed positive clamping 和maual fixed negative clamping level的值,以减少光晕伪像。
减轻光晕效果还会减少锐度,调整固定钳位值可减轻边缘的光晕效果,这两个钳位值分别用于UL和LL。可直接在头文件中调整这些值,在ASF调试的开始时使用较大的绝对钳位值,默认设置非常是适用于初始调试。在ASF调试的最后步骤,可根据需要降低钳位值,较严格的钳位可减轻光晕效果,产生更为自然的图像,尤其在正常照明/弱光条件下更是如此。
平衡噪点与细节
图像可能包含需要很多细节的区域和必须无噪点的平滑区域。对树的细节进行调试后,平面区域的噪点增多了。
强化边缘清晰度并消除点状噪点
如果因图像线条上存在点状噪点而导致线条边缘不清晰,可通过调整锐度、调整细节和平滑参数来改善线条边缘。
在AFD开启状态下改善带状噪点
频闪自动检测处于开启状态,但存在带状噪点。
带状噪点分为两类:
静态带状噪点-深色水平线图像,不在帧间移动。
滚动带状噪点-深色水平线出现在图像下方,可在帧间移动,视觉效果是带状噪点在图像上向下滚动。
由于滚动带状噪点检测更加稳定,因此除非项目严格要求帧率为30fps,否则将传感器配置为使用滚动带状噪点检测。
IQ评估
chromatix6摄像头调试工具的图像质量评估功能允许用户客观的测量图像上的以下图像质量参数:
色彩保真度和噪声
锐度
对比度
分辨率
镜头亮度均匀性
亮度值
高动态范围
配置chromatix IQ评估功能
配置IQ评估能自动在指定根文件夹创建..IQ目录结构、定义criteria.xlsx电子表格的位置,并且允许用户指定IQ测试模式。
1.为要保存的测试报告创建或确定可写入的results文件夹。
chromatix IQ 评估测试模式
自动模式是运行IQ测试的首选方法,在该模式下,IQ评估功能会自动获取用于特定测试的正确图像、根据测试选择每张图像中的特定ROI,并会进行所有必需测量和计算以确定测试结果。
但是,用户有时可能会分别运行IQ测试,例如,完成一些附加调试后,用户可能要重复运行失败的测试。如果配置过程中选择了在手动模式下运行测试,则会提示用户执行完成测试所需的ROI选择、测量和计算操作,但是,如果没选择在手动模式下运行测试那么ROI选择、测量和计算均可通过各个测试的IQ评估功能自动执行。
拍摄图像总结
种类 拍摄方法 光源
黑电平图像 用黑色物体挡住镜头,然后在完全黑暗的房间中拍摄两张 Raw 图像 无
拍摄光源阴影控制图像 设置为60HZ以及exposure+1 D65 TL84 A 光照度1000Lux或者是最亮
拍摄MCC色卡图 调整设备位置,保证在 100% 视野 (FOV) 条件下拍摄 MCC 色卡( MCC 色卡的宽度必须等于图像宽度)。 D65 D50 TL84 CWF A 室外 1000 500 200 100 50 10
拍摄平场图像 1. 拍摄Flat Field图片时,不用更改FOV及光源亮度(最大水平)。相机位置和拍摄MCC色卡像时一致。2. 分别在三种光源(D65、T84、A)条件下拍摄Raw图片 D50 TL84 A 1000lux或最亮
灰卡图片 1. 将18%灰卡图片填满预览屏幕。2. AWB参考点调试图像 – 当七种光源分别在最亮水平时,拍摄raw图片。 3. AWB lowlight LUT调试图像 – 打开TL84光源,在六种亮度(1000、400200、100、50、20 lux )条件下分别拍摄Raw图片。如果light booth不能控制亮度水平,则使用减光镜。
作者:清亮2015
链接:https://www.jianshu.com/p/8de7699d6386