不是很懂相位对焦,为什么无反要在 cmos 上埋对焦点?而不直接用像素检测?

不是很懂相位对焦,为什么无反要在 cmos 上埋对焦点?而不直接用像素检测?

烫手的洋芋,Camera tuning工程师,AF方向

PDAF 是目前 AF 的主流技术,相对于传统的 Contrast AF(反差对焦),PDAF 具有对焦速度快,拉伸幅度小的优点,下面来讲讲 PDAF 的工作原理和计算方法。

先来聊个有意思的话题,PDAF(Phase Detection Autofocus)相位检测对焦,为什么叫做相位检测?

看一个我们非常熟悉的函数,正弦函数和余弦函数,

y = sin(x)

y = cos(x) = sin(x + π/2)

众所周知,信号的三大属性:幅度(Amplitude)、频率(Frequency)、相位(Phase)。

从信号的角度讲,这两个都是正弦信号,幅度、频率完全一样,只是相位相差π/2。

PD 像素的信号也类似,图像失焦会存在相位差,PDAF 正是利用 PD 像素的相位差计算出离焦量(Defocus)完成对焦的过程。

本文主要分三部分内容:

一、PD 是如何用来对焦的;

二、PD 是如何产生的;

三、PD 是如何计算的。

一、PD 是如何用来对焦的

《亮剑》里有个情节:在和坂田作战时,炮手王承柱用大拇指测量了坂田指挥部的距离,然后用仅有的一颗炮弹干掉了坂田的指挥部。

柱子采用的拇指测距叫做“跳眼法”,是中国军队使用的一种简易测距方法。这种方法是根据两瞳孔的间隔约为自己臂长的十分之一,将测得实地物体的宽度乘以 10,就得出了站立点至目标的距离。

这个方法不过是运用了一个初中数学知识:相似三角形,利用相似三角形的等比例关系,将水平距离转成垂直距离。

PD 用来对焦的原理也是这样。

点光源经过凸透镜后,在焦点前后,光线从聚集到扩散,点的影像从圆到点(焦点),继而又扩散到圆,这个焦点前面和后面的圆就叫做弥散圆。

以平行光(无穷远点光源)为例,光圈直径为 A,焦距为 f,弥散圆直径为 CoC,成像面与焦平面的距离为 h,那么 h/CoC = f/A.

手机模组中,A 和 f 都是已知固定值,通过 CoC 和 h 的线性关系就很容易算出来 h 的距离,镜头只需向 sensor 移动 h 距离就能对上焦。

PD 可以理解为弥散圆的直径,单位为 pixel;

Defocus 是成像面与焦平面的距离,也就是对上焦镜头需要移动的距离,由于镜头移动的距离和 VCM 马达的驱动电流也是成线性关系,驱动电流大小由 DAC 值控制,所以 defocus 单位为 DAC;

DCC(Defocus conversion coefficient)是 defocus 与 PD 的比值,单位(DAC/pd),模组厂会为每一颗模组标定 DCC 写入模组 eeprom 中。

需要对焦的时候,通过当前图像计算出的 PD 值与 DCC 相乘,就可以得到镜头的位移量 defocus。

下图可以说明 PD 信号相位差与弥散圆直径的关系。

PDAF 能够确定知道对焦的方向和目标,因此只需要朝着目标前进,可以实现又快又准的对焦。而对于 Contrast AF,则需要逐步在漫长的对焦范围内寻找目标的大概位置(coarse search),然后再确认目标的精确位置(fine search),刚开始搜索时也不知道正确的方向,若方向错误还需要反向重新进行搜索。

感慨人生也是如此,如果能够明确知道自己的目标和方向,就能够少走许多弯路。

二、PD 是如何产生的

就像“拇指测距”需要两只眼睛一样,相位差的产生同样需要左右两个 PD 像素。

常见的 PD pixel 有单个像素遮一半(Half shield),或两个像素共用一个 micro lens(Dual-PD、2x1OCL 等)。

这样做的目的是使不同方向的入射光,光电二极管接收的光能量不一样。

还是以点光源为例,看一下点光源在 sensor 上的表现。

普通 pixel 的亮度分布表现:

PD pixel 的亮度分布表现:

点光源光线经过焦点后交叉继续前进,焦点前和焦点后的入射光学角度角度刚好反转 180°,一个在中心的点光源的在相位对焦像素点阵上的成像也会出现镜像。

点光源在 sensor 上的响应可以表示为点扩散函数 PSF(point spread function)。

空间不变的离焦图像退化模型的定义

其中 f 表示没有失焦模糊的理想图像,h 为点扩散函数 (PSF),η 为加性噪声,( x, y) 为图像坐标,“*”为二维卷积运算,g 为因失焦模糊而退化的图像。

同理,PD 的图像模型:

同样一幅图像,与不同的 L/R 点扩散函数卷积后,会生成有相位差的图像,失焦越严重相位差越大。

相同物距,不同相距下 PD 信号的表现:

从模型可以得出,L/R PD 图像信号是两个理论上只有相位差的离散随机信号,

算出这两个信号的相位差就可用于确定镜头移动的方向和移动量以实现最佳对焦。

三、PD 是如何计算的

PD 计算的基本流程如图所示,还有一些滤波降噪等细节流程没有列出来。

下面用一张竖条纹的照片来具体讲解一下 PD 计算具体每一步的过程,照片的尺寸为 4080x3060。

1、PD raw

目前手机上使用的 senor PD 输出模式绝大部分都是 TYPE2 mode,即 PD pixels 会在 image pixels 行尾以 MIPI tail 的方式输出,如下图所示

Sensor 会将 Bayer 数据和 PD 数据按照 MIPI 协议打包,并以 VC(Virtual Channel Indentifier)和 DT(Data Type)来区分。

当帧画面曝光完成后,AP 会获取到一张 image raw,一张 PD raw。

PD raw 的排列方式一般如下图所示

竖条纹照片对应的 PD raw

参数:2PD,Y 通道,1/2 vertical average binning,尺寸为 4080x768

2、Left and right pixels separation

PD raw 上 left、right pixels 是合在一起的,需要按照 PD 驱动的配置将 PD raw 拆成 Left PD raw 和 Right PD raw 分别计算,

竖条纹 PD raw 拆开后的图片,上图为 Left PD raw,下图为 Right PD raw,尺寸为 2040x768.

取中间一行像素直观感受一下左右像素灰度值的分布。

3、apply gain correction

这一步的目的主要有两个:

  1. Lens shading 补偿:
    PD 像素同样会受到 Lens shading 的影响,从 PD raw 的亮度分布就可以看出来中心亮,四周暗。shading 相当于一个曲面,在曲面上算相位差太复杂,补成平面再计算会简化许多。
  2. L/R 像素亮度幅度差异补偿:

除了 shading 的影响,左右信号亮度幅度也会存在差异,主要是由 Lens CRA 与 Macro Lens CRA 不匹配造成,在 PD raw 上差异严重的地方会看到明显的竖条纹,

确保两个信号的幅度对齐很重要,因为幅度差异会对相位差的计算产生影响。

所以 gain map 整体上跟 LSC 长得很像,但左右会有一些差异,下图是 17x13 的 gain map。

计算方法也很简单,gain map 双线性插值匹配每个 pixel,L/R PD pixel 的灰度值乘以对应坐标的 gain。使用中间一行的数据示例:

图像左边 L 信号相对弱,所以 gain 就补多点,右边就 R 信号补多点。补完后,shading 没问题了,中心和边缘亮度基本一致,但幅度还会有差异,理想和现实总会有点差距。

竖条纹图的结果:

两张图对比就能在失焦的位置看到明显的相位差,远失焦和近失焦的相位差方向相反。

4、vertical binning

对于 LR 方向的相位差,它只会在画面的水平方向产生。相位差只能以行为单位进行计算,即 ROI 内有多行数据时,需要分别计算每行的相位差,然后再取平均或加权平均作为结果。这也是即使是对比度很高的横条纹图像,PDAF 也无法工作的原因。

所以,vertical binning 多做一些,对 PD 结果影响不大,还能减小计算量,降低输入噪声。一般会做 1/4~1/8 的 vertical average binning。

竖条纹图像做 1/4 vertical average binning 后,尺寸为 2040x192.

与 binning 前做个对比,边缘的降噪效果还是挺明显。

5、phase difference calculation

前面几步属于预处理,都是为了为这一步服务,更好的计算 PD。

两个随机离散信号的相位差该如何计算?

图像信号处理中通常会使用互相关函数来估计两个信号之间的相位差,具体步骤如下:

a. 对两个信号进行互相关运算,得到互相关函数;

b. 找到互相关函数的峰值,这个峰值对应的延迟即是相位差的估计值。

我这里使用的是 ZNCC(Zero-normalized cross-correlation)零均值归一化互相关,公式为

以图片中这 3 个位置为例,分别代表①远景失焦,②准焦,③近景失焦。

先看第①个,信号波形如下图,在点扩散函数低通滤波的作用下,方波信号差不多变正弦波了。

从图上能看到明显的相位差,L 信号在 R 信号的左边。

取中间两个点,肉眼算一下相位差,大概在 4 左右。

计算两个信号的归一化互相关,c 为互相关系数,lags 为滞后索引向量

[c,lags] = xcorr(L,R,16,'normalized');

在 -4 位置,c 最大,所以 PD=-4.

但现实世界中信号是连续的,PD 结果若是整型,精度肯定不够对焦使用,需要插值计算出更精准的 PD。选出 c 最大的 3 个点,做抛物线拟合,顶点的横坐标就是更精准的 PD 结果,也可以使用线性插值,哪个方法更准待研究。最终结果 PD=-3.65,确实跟肉眼算的结果相近。

用同样的方法计算②和③,结果分别为②PD=-0.004,③PD=3.50,符合预期。

但是,存在一个问题,互相关的计算还是太复杂,看下展开后的公式公式:

需要乘法、平方、开方,还需要算 30 多次来找到峰值。

现在 PDAF 对实时性要求又很高,难算得过来,所以主流使用的是 SAD(Sum of Absolute Differences)算法,公式中只有加法减法,相对会快一些,有兴趣可以研究一下。

另外还需要计算一个 confidence level,以衡量当前 PD 结果的置信度,给 AF 算法用来判断是否使用当前 PD 结果。暂时没搞清楚怎么算,待研究。

6、phase to defocus conversion

PD 算出来之后,defocus 的计算就很简单了。

依据 ROI 坐标在 DCC Map 中找到对应的 DCC,

DCC Map,一般是中心小,四周大,基本对称。

然后,

Defocus = PD * DCC

TargetPosition = CurrentPosition + Defocus

用这些结果就可以去推马达对焦了。

参考资料:

1. ´Sliwi´nski, P.; Wachel, P. A Simple Model for On-Sensor Phase-Detection Autofocusing Algorithm.

J. Comput. Commun. 2013, 1, 11–17

2.L. Spinoulas, A. Katsaggelos, J. Jang, Y. Yoo, J. Im, and J. Paik, ”Defocus-Invariant Image Registration for Phase-Difference Detection Auto Focusing,” in Proceedings of the IEEE Int. Symp. Consum. Electron., Jeju,Korea, 22–55 June 2014, pp. 83–84.

3.M. Kobayashi, M. Ohmura, H. Takahashi, T. Shirai, K. Sakurai, T. Ichikawa, H. Yuzurihara, and S. Inoue, “High-definition and high-sensitivity cmos image sensor with all-pixel image plane phase-difference detection autofocus,” Jpn. J. Appl. Phys. 57(10), 1002B5 (2018)

4.Chan C C, Chen H H. Improving the reliability of phase detection autofocus[J]. Electronic Imaging, 2018, 2018(5): 241-1-241-5.

4.Jang J, Yoo Y, Kim J, et al. Sensor-based auto-focusing system using multi-scale feature extraction and phase correlation matching[J]. Sensors, 2015, 15(3): 5747-5762.

5.PDAF 原理 ---Truly

6.MATLAB xcorr ww2.mathworks.cn/help/m

文中图片源自网上或公开论文,如有侵权请联系删除。