ISP——你可以从这里起步

图1 一个完整的ISP

上图是本专栏第一篇文章中的ISP的框图,本来是打算一口气把这些模块全写完的,结果发现只是介绍基础知识就花了不少篇幅。而且ISP中的模块有难有易,又互相影响,如果能从简单的模块入手先搭建一个基础版,总好过起步没两天就累死在半道上,所以楼主另辟蹊径了。

第一章 写在前面的话

这篇是ISP综述,本来应该第一篇就写它,但是当时手里没有足够的文章建立起知识网,所以拖到现在才写,建立知识网是我的学习方法之一,另外两个是战略性放弃和亲自动手。我习惯用matlab,可能有些同学更习惯用C++或者python,我觉得学习算法用什么工具无所谓,用得顺手就行。

1.1. 它适合用于什么样的人

适合具有基本的数字图像处理基础,理工科专业,数学较好且具有一定的编程基础,目前想要入行做ISP或者是对图像处理感兴趣的初学者,这里默认大家只有一台电脑,没有专业设备,专业设备是指灯箱、色卡、调试专用显示器等。

一个标准的ISP调试流程至少需要一个灯箱和一个标准的24色卡(X-Rite Color Checker),以CCM为例,把色卡摆到灯箱里面,调一种光源,假设是D65光源(国际标准人工日光),那么色温就要调到6500K,拿摄像头对着色卡拍照,假设调到sRGB就是目标,此时需要借助专业的软件Imatest或者是其他的软件对色卡做色差计算,当色差达到最小值时记录CCM,你以为这就是结束?还没完呢,换个色温,继续拍,继续记,直到不同色温下的CCM都标定出来,才算是获得了这个摄像头的CCM参数。当然这不是结束,这只是一个例子,正常情况下获取CCM还要先把白平衡调试正确,很多时候也没有绝对的正确。镜头中还有畸变,也是用类似的方法一点一点的标定出来,模块间也有先后顺序,最后获得一堆数据,再配合ISP做效果调试。

大家想想看,这个过程对于初学者来说,会有多迷糊?如果要调试颜色需要专业的显示器,京东上最便宜的2000起步,用之前还要校准,又有多少人有预算买回来校准再把它用起来?

本ISP放弃了依赖设备的这些需求,只理解ISP刚需模块的原理,但这不是ISP的全部。ISP是一个很专业的IP,如果要集成进芯片里面,开发它至少涉及3个团队,ISP算法团队、数字IC团队和ISP Tuning团队,每个团队里面按照工作职责不同又可以继续细分下去。具体每个团队的岗位和发展前景网上都能搜到,个人认为没有孰优孰劣,任何一个方向都值得沉淀下去,这方面的知识书本上太学术,网上教程太零散,楼主希望能够给初学者一些较为系统的入门级指南。

对于ISP算法工程师来说,目前的内容非常基础,只是一个起步,除此之外,还需要补充Camera Sensor的相关内容,如果想从事这方面的工作,需要挑选ISP中的某一个重量级模块深入下去,比如颜色、降噪、3A、Demosaic、锐化、HDR等,任意一个都可以,做到能说出这个模块用了哪些算法及难点,并且自己动手设计调试过。

对于数字IC工程师(ISP方向)来说,这些差不多够了,需要补充的是IC设计相关的内容,面积、功耗、性能之类的。

对于ISP Tuning工程师来说,也需要补充Camera Sensor的相关内容,还需要了解模块间的相互影响,调试是一个需要手感的工作,最好是拥有一个ISP,自己调一下试试。

以上只是个人对ISP工作岗位的看法,不构成建议,不同的公司实际情况可能千差万别。

1.2. 这个ISP不完美

ISP是个很大的东西,从Camera Sensor开始到最后输出,它可以包含20多个模块,要是想设计一个能用的ISP,一个初学者,在了解Camera Sensor原理的时候就有可能被劝退。所以本节的目标是先做一个ISP的雏形出来,获得一个刚需ISP,然后再逐步把它做大,下图的这个ISP就是本节的目标,它拥有一个ISP必须要有的所有模块。
图2 一个不完美的ISP

虽然它不完美,但是为了能顺利起步,我不得不暂时放弃一些模块。

首先,楼主放弃了Camera Sensor部分,这部分涉及到镜头、NIR滤光片和CFA这些东西,对于一个想学ISP的新人来说,学这些需要一定的设备支持,但是如果只考虑ISP里面的具体算法,这部分内容可以暂时弱化。

其次,楼主的不完美ISP放弃了Temporal Denoise、HDR、3DLUT等这样的进阶模块,这些模块有的是难度大,比如Temporal Denoise和HDR,有些厂家会把Temporal Denoise做到RAW域,那么学完BLC和去坏点就会被Temporal Denoise迎面暴揍。而3DLUT这样的模块是对图像颜色调优的,它不是那么刚需,不是所有的ISP都会装备它,因此暂时的战略性放弃是可行的。

最后,楼主放弃了需要标定的模块,比如Lens Shading Correction,这类模块和镜头畸变有关,需要做一些标定类的工作,我已经放弃了Camera Sensor,就不得不暂时放弃它们。

为了能轻装上路,这是起步阶段战略上的调整,他日还是要把这些模块再一个一个装备进来的。

1.3. 搭建它的思路是什么

从底层算法开始,先掌握ISP中最简单常用的一些算法,再结合每个模块的原理,就可以初步掌握图2中的模块。可能有一些理论背景不够严谨(毕竟放弃了那么多),楼主会在后期逐步修改补充,也欢迎大家来提问或者是指正,希望大家能够一起提升。

为了方便理解本专栏中具体算法的应用,楼主画了一张知识导图,如果有网友仅关注某个模块的具体算法,可以按图寻路。
图3 不完美的ISP的知识导图

第二章 ISP各模块原理介绍

2.1. Black Level Correct

黑电平(Black Level)这个概念其实在不同的位置有不同的叫法,对于sensor厂家来说,黑电平指的是OB(Optical Black),就是光学上的绝对暗区,处于绝对暗区的像素是不曝光的,OB在sensor中的排列顺序如下图4所示。
图4 Optical Black示意图

图4中彩色的部分就是sensor的曝光数据,黑色的部分就是预留的未曝光的部分,也就是Optical Black,由于sensor本身存在暗电流,所以即使没有外部的光线输入,也有一定的输出电压。sensor中未曝光的部分也是可以读取的,通过读取这些暗区像素的大小,可以实时得到optical black level,大多数sensor厂家都会通过设计自己的算法把它给处理掉,这部分不用ISP操心,sensor输出的RAW为:

RAW=sensor input - optical black level

但是下面这个pedestal就需要ISP来做了。

在sensor端,AD芯片(模数转换芯片)的精度无法将很小的电压值转换出来,因此,sensor厂家一般会在AD的输入之前加上一个固定的pedestal(基底),此时sensor的输出就变成了:

RAW=sensor input - optical black level + pedestal

这样做的好处是完全保留了暗部的细节,坏处是加了pedestal之后高光信号会有溢出现象,会损失一部分亮部的细节,考虑到人眼对画面暗处更敏感,亮区的一点点损失是可以接受的。而ISP拿到的就是加了这个pedestal的数据,所以ISP的第一个模块就是要把pedestal减掉,在ISP中用于减去pedestal的模块被称为BLC(Black Level Correct),即黑电平校正

2.2. Defect Correct

图像坏点(Image Hot Pixel 或 Dead Pixel)是指数字图像中不能正常响应的像素或者表现异常的像素点。坏点可以是固定模式噪声(Fixed Pattern Noise, FPN)的一部分,也可以是随机出现的。

考虑到Demosaic的插值过程,一般ISP的去坏点都是在Demosaic前做的,也就是说在RAW域去坏点,在去除坏点前需要设计一个坏点检测算法,然后用中值滤波结果替换被检测出的像素点,效果如下图5所示:
图5 坏点检测效果图(RAW域)

具体算法分析详见:坏点检测

2.3. Demosaic

组成彩色图像的三原色是RGB,所以Sensor(传感器)在采集图像的时候,需要R、G、B三个颜色的滤镜,然后再把三个分量的信息合成彩色图像,为了保证每一个像素点都对齐,要求三块滤镜必须对齐,这样的设备着实不太好制造,此外这种设计还会增加Sensor的体积,放在数码相机上不太合适。

于是柯达公司的科学家Bryce Bayer发明了Bayer模式,在彩色图像传感器表面覆盖一层彩色滤波阵列(Color Filter Arrays, CFA)对输入光进行采样,每个像素只要一个颜色的分量,这样原来的三块滤镜就缩减成了一块滤镜,解决了上面的那些问题。一个RGGB格式的CFA如下图6(a)所示,经过它采样的图像是一个灰度图,如图6(b)所示,如果把颜色标记出来则如图6(c)所示,就是每一个pixel只采样了一个颜色,其排列模式和CFA相同。
图6 Bayer模式示意图

所以Bayer模式是以发明它的科学家的名字命名的,它还有一个常用的名字叫做Demosaic,中文名为"去马赛克",倒不是采集的图像中真的有马赛克,而是采集出的图像有类似马赛克的效果,比如图6(b)所示,因此得名"demosaic"。

bayer 的四种模式:

就4种模式,RGGB、BGGR、GBRG和GRBG,如果一幅图像是bayer模式,通常会被称为"raw"图,意思为原始图像,凡是在bayer模式上进行处理的图像都被划到了图像的RAW域。

demosaic 做了什么:

把bayer模式的图像插值成RGB图像,所以有些厂家也会把demosaic模块称为插值模块。demosaic也是RAW域和RGB域的分界点,只要经过demosaic插值,后续的图像就是RGB域了,还是以Lena图为例,demosaic前的图像如下图7所示,demosaic后的图像如下图8所示。
图7 demosaic前的三通道 图8 demosaic后的三通道

Demosaic算法的插值原理请参考:demosaic(一)demosaic(二)

2.4. White Balance

图像白平衡(White Balance)是数字摄影和图像处理中的一个重要概念,它涉及到调整图像的色彩,以确保在不同光照条件下,白色物体能够正确地呈现为白色。白平衡的目的是消除或减少由于光源颜色变化引起的图像色彩偏差,使得图像的颜色看起来更自然和准确。

白平衡的本质是一个对角矩阵,实际测量白平衡系数的时候的需要灯箱,就是下图9的这种设备,准备一张色卡,放进灯箱里面,拍摄色卡的图像,然后用白平衡算法计算出白平衡系数。
图9 灯箱

不同的Sensor在不同的光照下计算出的白平衡系数不一样,下图10列出了Nikon D7000、Canon 1D和Sony A57K在不同光照下的白平衡系数。
图10 不同厂家的白平衡系数

从这三个厂家的白平衡系数来看,一般都是G分量的系数为1,调整另外两个分量,白平衡的效果图如图11所示:
图11 白平衡效果图

白平衡

2.5. Color Correction Matrix

CCM的原理非常简单,就一个3x3的矩阵,官方对CCM的定义是用来矫正传感器捕获的原始颜色,使结果更接近于人眼所感知的真实颜色。考虑到大部分人都是用电脑显示器看颜色的,而显示器都工作在sRGB颜色空间,所以本ISP指定CCM往sRGB域调试,这样可以排除掉显示器带来的颜色误差。

需要说明的是,CCM可以做的事情很多,比如理想的bayer阵列滤光片是每个像素只采集一个颜色,如图12左边所示,但是现实中光并不会只通过自己颜色的那个通道,光的能量还会溢出到旁边的通道上面去,这就造成实际采集到的如图12右所示,对这个问题的描述有个词叫做Crosstalk,中文名"交叉应答"。
图12 Crosstalk示意图

这种现象反映到图像上就是RGB三分量颜色失真,因此这个时候CCM的物理意义就是从一种颜色中减去另外两种颜色的成分,以增加该颜色的饱和度,使变换的结果接近人的视觉感受,或者更符合人的主观审美。

另外光源的光谱分布也会影响颜色的捕捉,因此有些ISP会用CCM做白平衡,此外还有镜头光学特性引入的颜色偏差,比如色差和透射率不均匀等,都可以用CCM做色彩矫正。
图13 CCM效果对比

2.6. Gamma Correction

Gamma可以调试图像的整体亮度,gamma是一个指数曲线,一般gamma和CCM的调试会互相配合,另外有些ISP里面不止一个gamma,在RAW域也有可能会有gamma模块,这个不同的厂家会有不同的考虑,要看具体需求。Gamma的效果如图14所示:
图14 GAMMA效果对比

CCM和GAMMA

2.7. RGB2YUV

RGB转YUV是有固定标准的,此外YUV也会被称为YCbCr,这个模块是RGB域到YUV域的分界点,转换公式有如下三种:

(1)BT.601标准:标清数字电视(SDTV)

(1)

(2)BT.709标准:高清数字电视(HDTV)

(2)

(3)BT.2020标准:超高清数字电视(UHDTV)

(3)

套用上面的公式,把RGB图转成YUV后获得的图像如下图15所示,图像中的细节和亮度都在Y上面,UV就只有色度。
图15 RGB转YUV示意图

转成YUV之后,为了节省存储空间,UV会被采样掉,因此就有了YUV422和YUV420两个常用模式,如下图16所示。
图16 YUV格式示意图

YUV422中相邻的Y共用其相邻的两个U和V,也就是U和V的列数据被丢掉了,YUV420就更省了,即4个Y分量共用一组UV,连行也会再丢掉一半。

2.8. Spatial Denoise

如果看过很多厂家的ISP框图,就会发现降噪要么在raw域,要么在yuv域,或者raw和yuv域各有一个降噪,但是降噪基本上不会出现在rgb域,这是为什么呢?因为浪费资源,raw域只用存一幅图像的数据量,yuv域要存两幅图像的数据量,而rgb域需要存三幅图像的数据量,所以降噪一般不会在RGB域,太浪费存储资源了。

降噪分y和uv两部分的降噪,UV分量没什么纹理,如果直接对UV降噪容易产生color bleeding,就是一种颜色晕开的感觉,所以通常UV降噪都会和Y结合在一起做。
图17 YUV降噪效果图

降噪

2.9. Sharpen

图像锐化旨在增强图像中的边缘、细节和纹理,使图像看起来更清晰和鲜明,从而帮助提高图像的视觉质量。一般锐化都会放在YUV域做,并且固定在降噪之后,这是因为锐化会放大高频信息,而噪声恰好在高频,所以先降噪再做锐化更能获得一个比较满意的效果。锐化的具体效果如下图18所示:
图18 锐化效果图

sharp

相关推荐
Swift社区3 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman4 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年4 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Dong雨4 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna5 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie
liujjjiyun5 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥5 小时前
c++中mystring运算符重载
开发语言·c++·算法
trueEve6 小时前
SQL,力扣题目1369,获取最近第二次的活动
算法·leetcode·职场和发展
天若有情6736 小时前
c++框架设计展示---提高开发效率!
java·c++·算法
ahadee6 小时前
蓝桥杯每日真题 - 第19天
c语言·vscode·算法·蓝桥杯