概述
目录见:
Reading:相机图像处理 引子zhuanlan.zhihu.com我们终于来到正题了:相机内图像的处理流程。
在开始前先介绍一个概念,集成信号处理器(Integrated signal processor, ISP),指的是专门用来处理感光件信号并生成最终图像的硬件,通常会作为一个模块集成到片上系统。接下来将要介绍的各种处理都是在ISP上进行的。
接下来看一个典型的图像流程:
光线进入镜头,到达【带有RGB滤光阵列的传感器】,得到最原始的电信号。这个信号经过【ISO增益和原始图像处理】【RGB去马赛克】和【降噪】,就会得到raw格式的图片,对它接着进行【白平衡及色彩空间转换】和【色彩处理】,并【映射到sRGB输出】,这时图片已经呼之欲出,只要【JPEG压缩】并【保存成文件】,储存卡里就会增加一张JPEG格式的照片了。
接下来将会以上面提到的顺序进行介绍,但需要注意的是,这里是一个一般意义上的处理流程,不同的ISP可能会有不一样的处理流程,并且往往会更加复杂,但一定会包含上面的这些步骤(可能是以不同的顺序和组合)。
【带有RGB滤光阵列的传感器】
CMOS传感器是相机中用于感受光的部分,几乎所有的消费级相机的传感器都是基于CMOS技术,因此CCD类型的传感器这里就不介绍了。
大家应该都见过类似这样的传感器尺寸对比图,传感器越大,每个像素上接收到的光就越多,从而相对噪声就越小。智能手机的传感器往往是最小的。
相机传感器其实就是我们理想中的那个能够衡量光线强弱的装置,取同样长的时间,如果到达传感器某个像素点的光亮变成两倍,那么该点的数值也会变成两倍。但要注意的是,传感器只能测量光的强弱,并不能区分颜色,那么我们的彩色是哪里来的呢?这就需要将不同颜色的滤镜和传感器结合起来,实现这一过程的技术叫做拜尔阵列("Bayer" pattern)。
于是我们就得到了具有色彩阵列(color filter array, CFA)的相机传感器。通过这样的设计,传感器得到的数值就可以用来衡量不同通道信号的强弱了。
不同的相机有着各自的传感器阵列,不同阵列的滤光色就构成了相机色彩空间(raw RGB)的三原色,因此相机的raw RGB空间不是一个通用的色彩空间。下面两张图展示了不同相机raw RGB空间的原色以及raw图片的色差。
很多人会将raw格式的图片直接插入论文或者幻灯片,看起来会很奇怪,这是因为我们的设备是默认以标准的色彩空间进行显示(如sRGB)。下图就是一张raw格式的图片,看起来很怪吧?(很怪吧很怪吧
【ISO增益和原始图像处理】
其实上一张图有一些误导,传感器接受光并直接传过来的信号非常原始,根本不能看,还需要接下来的一系列操作。
首先是ISO增益,这里要先明确一个概念:什么是ISO?
ISO,全称为International Standardization Organization,它对相机的对光线的敏感程度,也就是感光度,进行了量化规定,而那已经是胶卷时代的事了。对于现代相机,ISO并不是像快门时间或者光圈那样具有直白的物理含义,而是通过信号处理想要满足的标准(这话表达起来真怪)。
为了达到与设置相对应的ISO,相机会将接收到的信号进行增益,增益倍数越大,也就对光线越敏感——当然,也会对噪音越敏感。下图展示了不同ISO设置下的效果(曝光时间进行了相应的调整)。
这里需要指出的是,我们经常说像素的强度,但其实像素值是没有单位的,它取决于曝光时间、增益和硬件本身,因此我们实际上关注的是图像上的相对值,而非绝对值。
原始的图像处理是指对相机硬件的一系列校准,包括黑光减法、缺陷像素遮蔽和平场矫正。
黑光减法(Black light subtraction)是说对无光像素值的矫正。我们希望没有接收到光的像素值是0,但由于传感器本身的噪声,事情往往不是这样。同时这个噪声并不是恒定的,它会随着温度的变化而改变。为了进行校准,可以通过黑屏设置一系列无光的像素,得到光学黑的信号,再从整体中减去,实现校准。
缺陷像素遮蔽(Defective pixel mask)是为了处理CMOS传感器中的坏点。这一校准会在工厂中进行,通过拍摄无光的图像,来发现数值异常的点来制作遮蔽,被遮蔽处的坏像素会被周围点的插值所代替(也就是估算出这个点的值)。
平场矫正(Flat-field correction)是由于均匀落在传感器上的光可能在图像中并不均匀,这可能是由镜头、传感器在相机中位置误差等原因引起的,提前记录这一变化并予以矫正,从而得到一个“平”的图像。
【RGB去马赛克】
还记得拜尔阵列吗?那个聪明的设计让我们的传感器得以分辨颜色,但同时也使得我们的图片变得离散。我们得到了每个像素点的RGB三通道之一的值,但我们实际上希望得到每个像素点的三个值,所以我们需要进行插补。
让我们来看一个最最简单的插补算法。
在位置5,拜尔阵列只给了我们R值,G和B就需要用周围的其他位置来进行估算,这里采用了平均值。可以想见这样的算法基于“相近位置颜色都差不多”的假设,那么当遇到不同颜色的分界处,这样的假设自然就不再成立,于是可以加入一个边界判断,发展成“边界感知”型插值算法(听起来还蛮高大上的)。
上面的算法仅是为了帮助理解,实际上在IPS中进行的算法会复杂也强大得多,有时候去马赛克的过程还会有一些附加效果,如高光调整(Highlight clipping)、锐化、降噪等。
【降噪】
所有的传感器都自带噪音,大多数相机会在模数转换后加入一个降噪。
而对于高端相机,可以能会根据不同的ISO设置采用不同的降噪策略,当ISO较高时会采取更激进的降噪。手机的相机因为传感器较小,往往都会采取激进的降噪策略,所以手机自拍比较好看(?
这里同样给出一个最简单的算法来对降噪有一个感性认识。
噪音往往比较突兀,因此可以使用模糊来减小噪音。但模糊也会影响细节,因此考虑将去掉部分中信号较强的区域补回图像(甚至会加强以后补回来)。
于是就得到了我们的算法:
【白平衡以及色彩空间转换】
到这里,我们已经得到了raw RGB空间里的图片,除了颜色怪异,多少是能看了。接下来就要好好处理一下颜色。
我们希望把raw RGB这一依赖于设备的色彩空间转换到一个无关设备的色彩空间里。在这里采用CIE XYZ为例子,实际上大多数相机会使用一个叫ProPhoto RGB的色彩空间。
转换分为两步,白平衡和色彩空间转换。
白平衡也就是矫正RGB相等的点(白点),只要对三个通道分别进行放缩就行了,也就是一个对角矩阵的事。
但怎么定义白点呢?
如果由用户手动设置,这件事就比较简单。相机一般会提供一些预设的白平衡数据,用户根据拍照的光照环境进行选择。下图是一些预设白平衡的例子。
如果没有手动指定,就会启用自动白平衡(auto white balance, AWB)算法,这件事就会变得很难,算法必须要能够确定任意照片的场景光亮。
这样的算法往往假设“白色”就是对场景光源的自然反射,如果我们可以定义图像中哪些像素属于“白色”,就可以得到场景光照的RGB表示。注意,这里的“白色”并不一定是白色,也有可能是灰色(白色就是最亮状态的灰色),有时我们会称这样的像素点为“消色差”或者“中性区”。
这里介绍两个简单的算法,灰色世界Gray world和白块White patch(不知道怎么翻译好听,听着像替身似的...)。
灰色世界算法假设一个场景的平均反射光是消色差的(也就是灰色的),因此首先算出平均值再进行白平衡转换即可。
如果白平衡在去马赛克之前,那么不同通道的像素数量将会不一样。
前面说过,每个像素绝对值意义不大,有相对的就行,所以可以将绿通道取1。
接下来看白块算法,这个算法假设场景中的高亮点就是我们想要找的白点。也就是以最大值的RGB作为白色的数值。
基于这样的假设,算法工作如下:
上图是这两种算法的效果展示。
这两种算法都是非常基础的算法,当图像有大面积单色时很容易失败(比如蓝天),对于AWB的算法研究有很多论文研究,相机往往也会有自己独特的白平衡算法。注意,这些算法并不一定为了复原场景光照而设计,而是会出于审美考虑,留有一些色差。
进行了白平衡,接下来就要进行色彩空间转换(color space transform, CST),将图片从raw RGB空间转换到独立于设备的色彩空间,如CIE XYZ。
白平衡仅能努力接近真实的色彩恒定,因此在相机上进行的色彩空间转换还会包含一个依赖于工厂预设的插值。在工厂中会对不同的相对色温(Correlated Color Temperature, CCT)预设色彩转换矩阵CST,在实际处理时,用场景的CCT根据预设的CST矩阵进行插值,得到想要的CST矩阵。
(事实上这一块儿我也不是很理解,“白平衡仅能努力接近真实的色彩恒定”是什么意思呢,这个插值和白平衡不会进行重复的工作吗?欢迎了解的小伙伴予以补充)
【颜色操作】
现在我们得到了处于CIE XYZ空间的图片,距离我们常见的处于sRGB的jpg文件只剩一步之遥,但在此之前,还有一个让每家相机各显身手的舞台——颜色操作(我这翻译唉
各家相机会施展不同的秘法,来让照片变得更加好看。这个步骤有很多叫法:色彩调控、冲洗阶段(photo-finishing)、色彩渲染、YUV处理引擎。一般会允许用户对这个阶段进行一定的控制和选择,下图来自佳能的用户手册。
这些色彩操作可以分为两类,三维和一维的,三维变换同时处理三个通道,一维曲线则是作用于每个通道,下图是一些变换的例子(可能需要理解一下)。
可以看到,这些变换几乎都是非线性的变换,经过了这一步,像素值的强弱就不再能够反映场景中光线的强弱了(当然可能在此之前就已经有过非线性操作了)。
经过了这一步,我们可以将图片【映射到sRGB输出】了。这在之前已经解释过,会先从CIE XYZ映射到linear sRGB,再经过伽马变换(2.2)得到sRGB空间。
接着要进行【JPEG压缩】,这是为了减小文件大小而进行的有损压缩。
具体的压缩原理可以参看这个博客:https://blog.csdn.net/abcjennifer/article/details/8074492,其中较难理解的是离散余弦变换(Discrete Cosine Transform , DCT)变换的步骤,在这里做感性介绍,帮助理解。
DCT可以理解为对傅里叶变换的采样,变换结果都是实数。傅里叶变换能够将原本在时域的信号转换到频域上,对于图像来说,就是将原本在空间上分布的像素值信号,转变为不同频率的二维三角函数的权重加和。同时结合一个经验:低频的信息要比高频的信号更重要(可以想象一个低频余弦和高频余弦加和,结果就是一个长了毛刺的山坡——山坡的信息更为重要),从而进行一个量化的操作(相当于滤波),将更多低频的信息保留,从而减小数值尺度的同时尽可能保留重要信息,这之后会再进行编码,提取数据的特征存储,从而实现更高的压缩比例。
在DCT上进行量化操作的数量会影响品质,操作越多,得到的图像质量就越低。在相机中往往可以选择jpeg格式的质量。
接下来就是【保存成文件】了,给照片加上日期时间、相机设定、输出的色彩空间、地理位置等等信息,写到存储卡里,就大功告成了。
国际色彩联盟(International Color Consortium, ICC)是一个负责制定色彩操作国际标准的组织,下图是来自ICC-ISO 22028的流程图,可以看到更多关于处理流程的细节(看不清的同学可以去找原文件)。在这里,于raw RGB相关的RGB值都被称为“场景相关的”(scene referred),而转换到sRGB空间以后,就被称为“输出相关的”(output referred)。
还要注意的是,sRGB色彩空间和JPEG正在慢慢被取代,sRGB是为了90年代的显示器设计的,太过于古老了。
JPEG也在逐步被压缩率更高的HEIC编码取代。苹果设备上已经开始用heic替代jpeg了,同时苹果设备使用Display P3的色彩空间,它是一种数字电影提倡的DCI-P3空间的变体,比sRGB要大25%,也包含了伽马变换。越来越多的安卓设备也会开始支持这个色彩空间。
再次强调一下,上面的这些步骤仅仅是一个指南,现代相机中的处理流程会更加复杂。对于不同品牌/型号的相机,操作的顺序可能会有不同,(如在去马赛克之后再白平衡),操作的方法也可能不一样(如把锐化和去马赛克结合)。
而对于工业/机器视觉相机,其ISP往往提供的是最小程度的处理,如有的只会进行白平衡,再在raw RGB空间上进行伽马变换,因此很多时候输出的图像仍然在设备的色彩空间内。
流程到此就,讲完了。
累死我了。
最后
以上就是动人纸鹤为你收集整理的什么叫做形态学图像处理_相机图像处理 3处理流程的全部内容,希望文章能够帮你解决什么叫做形态学图像处理_相机图像处理 3处理流程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复