注:本文为 "CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标" 几篇相关文章合辑。
文章中部分超链接、图片异常受引用之前的原文所限。
相机自动对焦原理
TriumphRay 于 2020-01-16 18:59:41 发布
凸透镜成像原理
这一部分大家中学应该就学过了,简要总结一下:
物体距离凸透镜 < 2 倍焦距,成放大虚像,比如放大镜;
物体距离凸透镜 = 2 倍焦距,成等大倒立实像,成像在 2 倍焦距处;
物体距离凸透镜 > 2 倍焦距,成缩小倒立实像,成像在 1 倍焦距和 2 倍焦距之间;
为什么需要对焦
重点就在于物体距离凸透镜 > 2 倍焦距,成缩小倒立实像,成像在 1 倍焦距和 2 倍焦距之间;
对于相机来说,透镜的焦距也就是三四十毫米,手机摄像头焦距更短,只有几毫米,所以被拍摄的物体基本上都是在 2 倍焦距以外的,也就说会成缩小倒立实像,成像面在 1 倍焦距与 2 倍焦距之间,问题是,具体在哪里?
对焦需要解决的就是在哪个位置成像最清晰的问题,很明显,物体距离凸透镜距离不同其成像最清晰的位置也不同,不需要对焦的镜头必然有一个默认取景距离,比如电脑摄像头,手机前置镜头,他们的默认取景距离大概是 40cm,因此只要事先调整好就行,它们不是不用对焦,而是已经对好焦了。
对焦的方法
中学物理课堂上有一个实验,就是透镜成像实验,其中有一个问题是蜡烛的成像在哪里最清晰?大家应该都还记得一个公式:
1 u + 1 v = 1 f \displaystyle \frac{1}{u} + \frac{1}{v} = \frac{1}{f} u1+v1=f1(相距 v v v,物距 u u u,焦距 f f f)
相距 v,物距 u 分别是成像到透镜和物体到透镜的距离,f 是焦距,物体和成像之间是满足这样一个关系的,因此要想得到蜡烛最清晰的像只需要知道蜡烛到透镜的距离和透镜的焦距即可。
其实这正是主动式对焦的原理,只要有精确的测距工具,对焦是很简单的。
如果没有办法知道这个距离呢?
在上述物理实验中,在讲解公式之前是有一个探索实验的,实验采用的方法就是在 1 倍焦距和 2 倍焦距之间移动光屏,观察到最清晰的像之后就停止移动,这就是穷举法的一个应用,既然像距在固定的范围之内,那么通过这种方法是一定可以找到这个位置,实现对焦。
主动对焦和被动对焦
有公式在手,只要给相机安个测距仪就好了,测距仪的精度越高对焦就越准,成像就越清晰,在这种想法的驱动下,主动式对焦就应运而生了,在大部分不计代价的领域,主动式对焦是很受欢迎的方法。
但是在很多地方,尤其是民用市场,想要给相机按上一个高精度测距仪,代价无疑是很高的,有没有其他办法实现对焦?很明显,就是刚才提到的物理实验所采用的的探索法,让改变镜头与 CMOS 之间的距离,总能找到成像的最佳位置。
在这种想法的作用下,被动式对焦就应运而生了,主要是以额外硬件为代价的相位法和基于软件的对比度法。
相位法
相位法是直接通过硬件计算出当前成像的位置是在真正相平面哪一侧的方法,如图所示:
这个图里面最让人困惑的就是这个波峰图是怎么产生的,很多说法是说光线到达检测器的时间不同,然后可以通过光的相位判断是往前移动成像面还是往后移动成像面(等效做法是移动镜头),但是检测光的相位这么 NB 的功能单反不大可能有,因此我认为这个波峰其实是物体上特定点的反光或者发光经过透镜之后位于光轴上半部的光线汇聚到下部的线传感器(Line sensor),位于光轴下方的光线则汇聚到上部的线性传感器,而具体设计中可能会有分光机构,这个图只是原理图,但是足够说明问题。
现在,重点来了,为什么最后面这个传感器叫线传感器(Line sensor),而不能翻译成线性传感器(Linear sensor),这个名字应该是指的传感器的形状:
最终的光线应该是宽度很有限的 "光线束",在接收到光线之后,线传感器的各个 pixel 会产生不同的电信号,光线束的中心产生最强的电信号,越远离中心光线强度越弱,对应的电信号越弱,就会有类似下面的结果:
电信号的值从中间到两边衰减,于是就形成了一条钟形曲线:
由于两个传感器接收到分别是光轴上方和光轴下方的光线,曲线的波峰在最中间说明对焦成功,CMOS 的位置没有偏前也没有偏后;
否则,也可以很容易知道成像面在当前 CMOS 的前方还是后方:
波峰往中间偏,说明 CMOS 在成像面后方;
波峰往两边偏,说明 CMOS 在成像面前方;
根据偏的距离,也能计算出 CMOS 或者镜头需要移动的距离;
个人觉得这个方法唯一跟 "相位" 这个词沾边的可能就是线传感器输出的信号形状了:
而且实际上,只需要一个线传感器就能知道如何移动 CMOS 或者镜头了。
至于后来又产生了很多变形的专利,主要是把线传感器放在 CMOS 上以降低系统复杂度,原理仍然不变,只不过多了遮光机构,模拟光轴上部和光轴下部:
当然万变不离其宗,最终的计算方法都是一样的。
对比度法
这种方法很多地方都叫做反差法,但是通过研究其原理,我认为还是叫对比度法比较准确。原理可以通过下面的动图描述:
这张动图最关键的地方就是上面的注释,可惜注释是匈牙利文,这个语种我想绝大多数人是看不懂的,因此我不辞辛苦给全翻译了一遍,配上注释就容易理解多了:
匈牙利语 | 英语 | 中文 |
---|---|---|
a képérzékelő felülete | Image Sensor Surface | 图像传感器表面 |
AF | Auto Focus | 自动对焦 |
terület | Area | 区域 |
vizsgált pixelek | Test Pixels | 测试像素 |
világosság | Light, Brightness | 光线,亮度 |
kontraszat | Contrast | 对比度 |
lencsék poziciőja | Lens Position | 镜片位置 |
kihuzat nagysága | Projection Size | 投影大小 |
a kontraszt mérése | Contrast Measurement | 对比度测量 |
nővekvő kontraszt | Increasing Contrast | 对比增强 |
csőkkenő kontraszt | Decreasing Contrast | 对比模糊 |
lencse-mozgatás megállitva | Lens Movement Stopped | 镜头移动停止 |
maximum megállapitása | Setting the Maximum | 设定最大值 |
maximális kontraszt megállapitva | Setting the Maximum Contrast | 设置最大对比度 |
lencsék vissza | Lens Reverse | 镜头反向 |
a rendszer élesre állt | The System Stopped | 系统停止 |
这下应该不用多解释了,如果还是不明白,那我就简单说明一下:
它实际上是选的一行像素,统计各像素亮度,并计算最亮和最暗的差值作为对比度保存;
尝试往一个方向移动镜片(或者 CMOS),如果差值变小则说明方向错误,需要反向移动;
反之继续移动,直到差值经过某个值之后开始变小,说明该值即对比度最大值;
镜片(或者 CMOS)反向移动到对比对最大的位置,结束;
是不是很简单?之所以在研究这个问题的时候越看越迷糊,我觉得最大的问题就是很多文章作者可能也没搞明白具体的原理,就是人云亦云,单纯的复制粘贴,结果怎么看都是一头雾水,希望我这篇文章能给大家解惑。
关于手机自动对焦摄像头
手机所采用的方式实际上基本都是被动式,除了运动机构不同(手机多数是把摄像头锁进音圈马达内,音圈马达实际上是一种磁性运动机构,通过给线圈加电流使摄像头在一定范围内运动,其行程只有几个毫米,可能不超过 3 毫米,在摄像头自动对焦时如果你贴近镜头仔细听能听到镜头运动的细微声音),以及镜头焦距不变之外原理都一样,以前比较多的是对比度差值法,现在也有把相位法元件直接放在 CMOS 上的方案了。
关于变焦镜头
变焦镜头跟对焦是两个概念,对焦是在某个焦距下使图像清晰的操作流程,变焦镜头是指透镜本身焦距改变,由于透镜做好之后焦距就固定了,因此要实现镜头的变焦,用一块透镜是不行的,需要用到透镜组,通过调节各透镜之间的距离改变镜头的焦距,从而实现变焦。
PS:前一节说手机摄像头镜头焦距不变,现在似乎也有利用透镜组实现光学变焦的手机镜头了。
参考文献:
-
[1] 相机的对焦是什么意思?为什么需要对焦? - 知乎
https://www.zhihu.com/question/21427158 -
[2] 被动对焦中的相位对焦与反差对焦 - ostartech - 博客园
https://www.cnblogs.com/wxl845235800/p/9725250.html -
[3] 相位对焦的原理是什么?
http://www.360doc.com/content/18/0421/23/11079421_747658595.shtml
PDAF 原理简介
Z1Tester 已于 2022-08-29 16:44:39 修改
1.PDAF 原理
原理:是在感光芯片上预留出一些规律性对称的遮蔽像素点,专门用来进行相位检测,通过像素之间的距离及变化来决定对焦的偏移量即相位差(PD 值)从而实现快速对焦。
1.1PDAF 系统框图
1.2 PDAF 分类
1.2.1 单 PD (shieled pixel)
屏蔽掉像素一般的感光区域(黑色部分),值获得一半信号。需要另外的像素屏蔽掉另一半 信号,得到完整的相位差信息。SP 越多,对焦越快,但信号损失越严重,目前 SP 密度控制在 1%~3%。
屏蔽掉像素一般的感光区域(黑色部分),值获得一半信号。需要另外的像素屏蔽掉另一半 信号,得到完整的相位差信息。SP 越多,对焦越快,但信号损失越严重,目前 SP 密度控制在 1%~3%。
1.2.2 双 PD (Dual Pixel)
将同一个像素底部的感光区域(即 光电二极管)一分为二,在同一个像素内即可完成相位信 息捕获。dual PD 也有叫 2PD、全像素双核对焦,这种像素覆盖率 100%,所以对焦体验最佳。但由于将光电二极管一分为二,井口变小,FWC 急剧衰减,dynamicrange 衰减严重,拍照 非常容易过曝。三星凭借优秀的 ISP 和调试能力过曝控制的还可以,但金立 M2017 驾驭能力就稍弱了。但单从对焦来说,dual PD>2*1PD>shield pixel,这种优势尤其体现在暗环境下对焦的稳定性上,比如 10lux/5lux/1lux 这些极暗环境下的对焦。
使用两个光电二极管(即两个检测点)
把两个光电二极管放在一个像素井内(即成对出现 )分别读取两个二极管内的信息(即每个只取一半)也就是说之前需要两个像素并且各遮一半才能组成一组对焦点,现在不需要了,对光线利用率也很高。对焦时开一个二极管,成像时两个二极管拼起来同时使用。使用这种方法能彻底解决掩蔽式相位对焦 "挖像素" 带来的掉画质问题,并且理论上可以做到所有像素都能参与对焦
优点:暗光对焦能力非常强悍 不需要额外相位对焦像素 画质表现接近反差对焦传感器 而且可以生成深度图供景深处理,是目前手机上较为理想的解决方案
缺点:全像素采样视频模式下不能相位对焦
1.2.3 简单分析三种 PDAF 技术
1.shield pixel
屏蔽掉像素一般的感光区域(黑色部分),值获得一半信号。需要另外的像素屏蔽掉另一半 信号,得到完整的相位差信息。 SP 越多,对焦越快,但信号损失越严重,目前 SP 密度控制在 1%~3%。
2.super PD
将相邻的像素共用一个 on chip microlens 得到相位差信息,一般在 Green 上处理。 同样的,二合一的 PD 越多,对焦越快,但信号损失越严重,目前密度也控制在 1%~3%
3.dual PD
将同一个像素底部的感光区域(即光电二极管)一分为二,在同一个像素内即可完成相位信 息捕获。dual PD 也有叫 2PD、全像素双核对焦,这种像素覆盖率 100%,所以对焦体验最佳。但由于将光电二极管一分为二,井口变小,FWC 急剧衰减,dynamic> range 衰减严重,拍照 非常容易过曝。
但单从对焦来说,dual PD>2*1 PD>shield> pixel,这种优势尤其体现在暗环境下对焦的稳定性上,比如 10lux/5lux/1lux 这些极暗环境下的对焦。另外,即使是同一种 PDAF,受 microlens 的设计、像素大小、用于 PD 的 color filter、sensitivity、Fab 制程等因素影响,各家的效果还是不一样。
2. 高通 PDAF 校准流程
2.1 gain map 介绍
由于 shiled pixel 一半被遮盖住,感光面积只有正常 pixel 感光能力的一半,所以感光能力要比正常的 pixel 感光能力弱,gainmap 就是对遮蔽 pixel 做感光能力的补偿
2.1.2 gain map 校准流程
-
将马达推到远近焦中间位置
-
下寄存器打开 PD 点
-
自动 AE 到指定的曝光值
-
取一张 raw10 图片
-
调用高通的 DLL 计算出应该补偿的数值
-
把增益写入 OTP
有些 Sensor 的 PD Pixel 都是 G Pixel,有的是 R、B Pixel,有的是 B、G Pixel,故不同芯片的数据左右差异大小不同。
2.2 PDAF DCC
相位视差和镜头运动之间的转换用离焦转换系数 (DCC) 表示,其单位为 dac/pixel。
DCC 为一个无符号量,以正值的形式存储在 eeprom 中。如果 PDAF 校准工具输出的 DCC 的值为一个负值,则会返回一个错误代码,表示校准结果无效。在 sensor 配置中,左右 PD 点配置错误可能会导致这种情况。
像素的视差以像素为单位表示,计算得到的位移量是一个相对值,表示镜头需要移动多少距离,而不是表示镜头当前所在的位置,PD 值有正负之分,PD 值决定马达的位移方向,当 PD 值等于 0 时,图像是最清晰的
2.3 DCC Calibration
2.3.1 校准 chart
DCC 校整可以使用菱形 chart 或者条形 chart 进行测试
线条 chart , 和菱形 chart 相比,条形 chart 可以获得更均匀的相位差数据,DCC 校准 Chart 是校准 DLL 所需要输入的工具之一,对于垂直放置 PD 点的 sensor,推荐使用水平的线条测试 Chart
2.3.2 测试距离
DCC 校准推荐的相机模组到测试 chart 的推荐距离位置在 AF_cal_inf 到 af_cal_near 中间的位置,大多数摄像头模组设计的测试距离在 20cm 到 30cm, 在使用长焦镜头的 camera 模组中,这个测试距离有可能会达到 2m
camera 视场角覆盖测试图活动区域的 85%-95%,如下图所示。
正确使用测试 chart,避免 DCC 校准过程中的系统误差,从而导致 PDAF 性能 问题。测试图尺寸不合适,测试图旋转 / 或倾斜,以及过度曝光导致常见的 DCC 校准错误。下图显示了正确使用测试图的例子,以及常见的测试图问题。
2.3.3 DCC 校准过程
Lens 从远焦移动到近焦总共移动 9 步,在镜头移动过程中,会获取十张图片,从这十张图片中获取十个相位差的值和 10 个焦距值,用这些数据进行线性回归,得到 DCC 值,图像被划分为 6X8 个区域,从而形成 6X8DCCmap, 如下图所示:
2.3.4 校准流程:
-
打开 PD 点
-
马达推到远近焦中间位置
-
AE 曝光
-
获取 Gain map 数据
-
从远焦到近焦取十张图片
-
PDAF 第二步计算 DCC
反差检测自动对焦(CDAF)与相位检测自动对焦(PDAF)原理
Mr.Idleman 已于 2023-05-24 16:45:24 修改
PDAF(相位检测自动对焦)原理
了解 PDAF,首先需要了解当今数码相机的工作原理,这里以单反为例进行介绍:
数码单反相机(DSLR)的工作原理
DSLR (Digital Single-Lens Reflex Camera)数码单镜头反光相机,也就是我们常称的单反相机。属于 数码静态相机(Digital Still Camera,DSC)与 单反相机(SLR)的交集。
单反相机与其它数码相机的主要区别是反射设计方案。在单反相机中,光线穿过镜头,然后传到镜子,该镜交替将图像发送到取景器或图像传感器。DSLR 相机使用光学取景器,通过透过视觉反射器观察被拍摄物体,用户可以更好地预测最终照片的成像效果。这种取景方式比其他类型的相机使用的电子取景器或屏幕取景器更加准确和可靠,通过使用一个镜头,DSLR 的取景器显示的图像与相机传感器捕获的图像没有显著差异。光学取景器的使用也意味着用户可以通过镜头看到物体的真实大小和形状,从而更容易地调整拍摄位置和角度。其内部结构如下图所示:
摄影师可以在拍摄图像前通过镜子看到被摄体。 拍摄图像时,反射镜会向上摆动,光线会转到感光元件。各部分分别为:
-
光线
-
副镜
-
用于调整主镜的偏心销(1.5mm 六角)
-
用于调整副镜的偏心销(1.5mm 六角)
-
相位检测传感器(自动对焦传感器)
-
[五棱镜](https://zh.wikipedia.org/wiki/ 五稜鏡)/五面镜
-
[取景器](https://zh.wikipedia.org/wiki/ 取景器)
传统结构上,单反相机上有一小块磨砂玻璃(现在一般使用光学塑料)5,叫对焦屏。它位于单反相机的反光镜上方,显示焦平面的图像,是单反类型照相机的独有零件。
对焦屏在光路中截断了光线,因为反射和散射减少了亮度,但它存在的意义主要不是取景,而是对焦。在与光电传感器近似等距离的位置,磨砂屏上的成像与传感器上的成像基本一致。包括画面构图、焦点、景深等,如果没有这个对焦屏,取景窗内仍然可以看到镜头传送的画面,而由于人眼的自动对焦,使画面始终清晰,无法判断照相机感光传感器的清晰程度。
磨砂屏会起到这个效果,是因为浴帘效应。大众经常听到的 "浴帘效应" 是物理学上的,浴室里淋浴时,悬挂的浴帘总会向内卷起,甚至贴到人身上。在光学上还有另外一个 "浴帘效应"。
学术上会有很复杂的研究,简而言之,就是**磨砂幕越靠近物体,透光越明显。**这才是磨砂屏本身的成像原理。
在对焦屏这个位置上对焦,对于没有自动对焦的传统单反具有重要的意义,因此厂商开发了磨砂屏、精细磨砂屏、微棱屏、裂像屏、双裂像屏,还有磨砂、微棱、裂像复合屏等。更有复合了菲涅耳透镜的对焦屏。成为单反相机独有而不可或缺的组成部分。
另外,随着时代发展,现在无反相机也逐渐占据了一席之地,可以更换镜头的无反相机就是我们常叫的微单相机。单反相机和无反相机的区别在于机身构造和大小,无反相机取消了反光镜和光学取景器,采用电子取景器,机身更轻便紧凑,更适合爱好者和旅行摄影师。除此之外,在感光元件规格相近、镜头素质相当的情况下,无反相机和单反相机在画质表现方面并没有显著差别。
反差检测自动对焦(CDAF)
CDAF 对焦原理
说到自动对焦,首先需要介绍的是经典的反差检测自动对焦,也叫对比度检测自动对焦,英文 Contrast Detection Auto Focus。因为对比度对视觉效果非常关键,反差对焦被广泛应用于传统的摄像系统中。它通过对比镜头传感器传来的对比度反差来进行对焦。
我们知道,一般来说,对比度越大,图像越清晰醒目,色彩也越鲜明艳丽。当镜头逐渐合焦时,传感器得到的相邻像素间的对比度会越来越高,图像也就会越来越清晰。所以当我们找到整个图片对比度最高的时候,镜头所处的位置也就找到了准确的对焦点。这一过程如下图所示:
在对焦调节范围内,每一个调焦位置都会对应一个锐度值,也就是聚焦值。这些聚焦值形成一曲线,通常称为聚焦曲线。锐度值通过锐度评价 函数 计算获得,锐度评价函数有时也称为聚焦函数。一个良好的锐度评价函数对应的聚焦曲线应该是一个如图所示的单峰曲线,并且曲线峰值对应的调焦位置即为准确聚焦的位置。
CDAF 实现过程
CDAF 的流程如下图所示。当 CDAF 触发后,系统对当前的实际图像进行聚焦值计算,并结合前面的聚焦值数据综合判别当前聚焦值是否是聚焦曲线峰值。如果判定是聚焦峰值,则聚焦结束;否则,结合相关信息确定下一步调焦的移动方向和大小,驱动调焦步进电动机作相应的移动,对新的图像再次进行同样的步骤以此形成一个反馈控制环路。由此可见,对比度检测聚焦的关键因素有两点:① 锐度评价函数:② 峰值判定和搜索策略
相位检测自动对焦(PDAF)
PDAF 对焦原理
相位检测自动对焦,英文 Phase Detection Auto Focus。该系统的工作原理与测距仪相机类似。从副镜反射回来的光被 2 个或多个上面带有微透镜的小型图像传感器(取决于自动对焦系统有多少个焦点)接收。如上图 7 所示,对于每个焦点,有两个位于两侧的相位差传感器,两个单独的光束经过反射到达两个单独的传感器。
事实上,现代相位检测设备上的传感器数量远不止两个,而且这些传感器彼此非常靠近。**当光线到达这两个传感器时,如果物体处于对焦状态,则来自镜头最两侧的光线会聚在每个传感器的中心(就像它们在图像传感器上一样)。**两个传感器上都会有相同的图像,表明该物体确实处于完美对焦状态。如果物体没有聚焦,光线将不再会聚,并且会照射到传感器的不同侧面,如下图所示(图片由维基百科提供):
图 1 至 4 表示镜头聚焦的情况分别为: (1) 太近,(2) 正确,(3) 太远,(4) 太远。从图中可以看出,两个曲线之间的相位差不仅可以用来确定在焦平面的哪个方向上,还可以用来确定改变焦点的程度,以实现最佳聚焦。但有一点需要注意,这只是检测传感器,实际上最终移动对焦的是镜头而不是传感器。
下面图片也显示了相位差产生过程:(a) 现实世界中的一个物体;(b) 配置了适当遮罩的左侧(上)和右侧(下)的相位传感器;© 获取到的左侧(上)和右侧(下)相位图像。
PDAF 实现过程
由于 PDAF 系统知道一个物体是前聚焦还是后聚焦,它可以向相机镜头发送准确的运动指令,说明以何种方式转动焦点以及转动多少。以下是当相机获得对主体进行对焦(闭环自动对焦操作)的命令时会发生的情况:
因为这一切都在很短的时间内发生,所以这就是 PDAF 比 CDAF 快得多的原因(CDAF 由于依赖来回改变焦点直到达到焦点,需要基于大量图像数据进行分析)。
目前比较流行的是片上相差自动对焦(on chip phase detection autofocus),在生产 sensor 的时候,把某些用于相位检测像素遮住左边一半或者右边一半,如下图:
上图只是示意图,各个厂商的半掩模的工艺各有不同,在对 IR filter 或者 microlens 的处理上也不相同,但是基本的原理都是让图像形成左右两幅类似人眼的不同光学通路的图像。这样左右侧的相位检测像素就会产生这样的图像:
目前主要工艺
目前 PDAF 的生产处理方式主要有三种,分别是:
-
shield pixel
-
2*1 PD
-
dual PD
-
shield pixel
屏蔽掉像素一般的感光区域(黑色部分),只获得一半信号。需要另外的像素屏蔽掉另一半信号,得到完整的相位差信息。SP 越多,对焦越快,但信号损失越严重,目前 SP 密度控制在 1%~3%。
-
super PD
将相邻的像素共用一个 on chip microlens 得到相位差信息,一般在 Green 上处理。同样的,二合一的 PD 越多,对焦越快,但信号损失越严重,目前密度也控制在 1%~3%
-
dual PD
将同一个像素底部的感光区域(即光电二极管)一分为二,在同一个像素内即可完成相位信 息捕获。dual PD 也有叫 2PD、全像素双核对焦,这种像素覆盖率 100%,所以对焦体验最佳。但由于将光电二极管一分为二,井口变小,FWC 急剧衰减,dynamic range 衰减严重,拍照非常容易过曝。
下面以 SP 为例再实际解释一下。(图一)为 Sony 感光元件有放置对焦使用像素示意图,CMOS 感光元件的相位像素会接收到左右不同的光波信息,进而判断出远近距离产生相位差,Sony 感光元件上的 "对焦点区域" 设计一排专用的对焦像素。像素是由 L、R 两组像素交错排列组成的。如果单看 L 和单看 R,可以将这条对焦像素视为两条独立的感应器,L 和 R 接收同来自一光源的光。
Sony 的做法是在对焦用像素上设计两层交错的光罩遮光(图二、三),让所有 L 像素只能接收到来自左边的光,R 像素只能接收到右边的光。这样一来,L 和 R 两组对焦像素就能接收同一光源不同方向的光。
如(图二)黄色光线所示,光罩遮住一半的入射光源,造成此相位像素仅能接收到左半边的光源信息。(图三)黄色光线因光罩遮住一半的入射光源,造成此相位像素仅能接收到右半边的光源信息。
因此,CMOS 将两个感应器的信号进行比较,这两个成像间的距离就是所谓的 "相位差"。既然 "相位差" 与 "光源和焦点的距离" 有这层关系,便可参考当前的相位差来驱动对焦马达,使得对焦可以快速完成。
其它对焦方式
激光对焦
相信大家一定听说过,在工业建筑和测绘领域,工人们都会使用激光技术来确定高度或水平距离。LGG3 首次将该 技术应用 在了手机对焦上,随后 2015 年,魅族将这项技术应用在了自家 MX5 上,使之成为了国内第一款应用激光辅助对焦的机型。
魅族 MX5 的激光对焦原理是:通过背面的微型发射器可以发射出低强度脉冲激光,然后通过相机左侧的红外传感器将反弹折射回来的信号进行回收,从而实现对焦的目的。
每个红外脉冲光束经过电子测量器多次反复计算反射时间,从而建立一个精确的范围。ISP 接收器可以计算出具体的物体或场景究竟有多远,同时锁定在最适合的焦点景深。而这一切看起来虽然复杂,但是实际上只发生在几分之一秒内,几乎感觉不到过程。根据魅族官方表示,MX5 的对焦时间只有 0.2 秒左右。
红外对焦
在最后说这项技术,是因为整个红外对焦技术只被联想的 VIBE SHOT 实际应用了,但是因为这项技术可实用型不高,并且故障频出,所以几乎没有厂商愿意跟进,最后只能放弃。基本上,Vibe Shot 的红外自动对焦可以说是魅族 MX5 激光对焦的另外一个版本,但这项技术让 Vibe Shot 比普通的自动对焦技术快上 2 倍。
总结
目前,PDAF 主要应用于高端数码相机和智能手机上。它通过将像素分为左、右两组,接收不同方向的光线信息,并通过比较两个成像之间的相位差来确定焦点位置。PDAF 的优点是快速对焦、适用于低光环境,但它需要特殊的 硬件 支持,且对镜头质量和设计有一定要求。
CDAF 则主要应用于入门级数码相机和相机模块化智能手机上。它通过计算成像中相邻像素之间的对比度来确定焦点位置。CDAF 的优点是适用于各种类型的镜头和成像情况,但它对光线和对比度的要求比较高,且在低光环境下对焦速度较慢。
事实上,除了前面的提到的一些对焦技术外,部分厂商将这些对焦技术混合在一起,取长补短。在这些厂商中,我觉得做的最好的应该是 PRO6 Pus。这台机子将 PDAF 对焦、激光辅助对焦和反差对焦混合在一起,大大提高了不同场景的对焦成功率,也同时增强了相机成片的观感。
参考文献
[1]: Digital single-lens reflex camera
[2]: 单反、无反、微单 相机的选择?
[3]: 反光镜和对焦屏 (单反屏幕对焦)
[4]: How Phase Detection Autofocus Works
[6]: 摄像头模组 PDAF 对焦 (Phase Detection Auto Focus)
[7]: 相位對焦(Phase Detection) 資料整理
[8]: 《计算摄影学基础》
[10]:PDAF 相位对焦
对比 PDAF、CDAF 和 LAAF 自动对焦技术
大 DA_辉 于 2024-08-30 21:38:22 发布
深入解析相位检测自动对焦(PDAF)
相位检测自动对焦(PDAF,Phase Detection Auto Focus)是一种高效的自动对焦技术,广泛应用于现代数码相机、无反相机和智能手机摄像头中。为了更好地理解 PDAF,我们将从其工作原理、技术优势、应用场景以及最新的发展趋势等方面进行详细解析。
一、PDAF 的工作原理
PDAF 的工作原理主要依赖于光学相位差的测量。以下是其具体步骤:
-
光线分离:
当光线通过相机镜头时,它会被镜头内的特殊半透镜或微透镜阵列分成两束光。这些光线来自相同的场景,但由于路径不同,会产生细微的相位差。
-
相位检测:
被分离的光线分别到达传感器的不同区域,这些区域通常被称为相位检测像素。这些像素负责接收光线,并生成两个独立的图像。如果镜头没有精确对焦,这两个图像就会出现相位差,即两图像不完全重叠。
-
计算相位差:
相机内部的处理器会分析这两个图像的位移量(即相位差),确定其大小和方向。根据这些信息,处理器可以判断镜头应朝哪个方向、移动多远以实现对焦。
-
调整焦距:
根据计算出的相位差,镜头马达会迅速移动镜头组件,调整焦距,直到两个图像完全重合为止。这时,相机就实现了精确对焦。
-
实时反馈:
PDAF 系统通常会不断进行这种光线分离、相位检测和焦距调整的过程,以便在动态场景中保持焦点的持续锁定。这就是为什么 PDAF 在拍摄运动物体时也能保持快速、精准对焦的原因。
二、PDAF 的技术优势
PDAF 之所以在自动对焦技术中占据重要地位,主要因为其拥有以下技术优势:
-
超高速对焦:
相较于传统的对比度检测自动对焦(CDAF),PDAF 通过直接测量相位差,可以在极短的时间内完成对焦。CDAF 需要通过不断调整镜头焦距来寻找最大对比度点,而 PDAF 则能够一次性精确调整到正确的焦点位置。
-
连续对焦能力:
PDAF 的实时反馈机制使其能够在动态场景中保持对焦,即使物体在高速运动,相机也能持续跟踪并调整焦点。这使得 PDAF 特别适合于体育赛事、动物摄影和视频拍摄等应用场景。
-
低光下的表现:
在光线较弱的环境中,PDAF 系统可以凭借其高效的相位检测传感器,仍然保持较高的对焦速度和准确性。相比之下,CDAF 在低光环境下通常会表现不佳,因为它依赖于图像对比度,而弱光会降低对比度。
-
高效能耗:
由于 PDAF 是基于相位差的直接测量,因此相对于那些依赖多次调整和反馈的对焦系统,PDAF 在相同条件下所消耗的能量更少。这一点在移动设备(如智能手机)中尤为重要,因为降低能耗可以延长电池寿命。
三、PDAF 的应用场景
PDAF 的应用非常广泛,以下是其主要的应用场景:
-
体育摄影和野生动物摄影 :
这些场景通常需要快速反应和连续跟踪移动物体。PDAF 能够以极高的速度和精度锁定焦点,确保拍摄到清晰的图像。
-
视频拍摄:
在视频拍摄中,尤其是在拍摄具有高动态场景的视频时,PDAF 可以提供平滑的连续对焦,避免画面因对焦不准而变得模糊。
-
智能手机摄影 :
许多高端智能手机都采用了 PDAF 技术,特别是在拍摄动态场景和低光环境时表现出色。PDAF 与其他对焦技术(如 CDAF 和 LAAF)结合使用,可以提供更全面的对焦体验。
-
专业摄影和电影制作:
在需要快速捕捉瞬间或跟踪拍摄的专业场合,PDAF 凭借其高效对焦能力,成为摄影师和电影制作人不可或缺的工具。
四、PDAF 的 技术挑战 与改进
尽管 PDAF 在许多方面表现出色,但它也面临一些技术挑战:
-
硬件成本与复杂性:
PDAF 系统需要在图像传感器上集成专用的相位检测像素,这增加了制造成本和传感器的复杂性。为了提高覆盖范围和对焦精度,传感器需要更加精密的设计。
-
边缘对焦问题:
由于 PDAF 像素通常分布在传感器的中间部分,因此在图像边缘区域的对焦效果可能不如中间区域。这在某些宽幅场景或需要边缘清晰的图像中可能成为一个问题。
-
低对比度和特殊场景:
在低对比度场景(如拍摄纯色物体)或特殊光照条件下(如逆光场景),PDAF 可能会遇到对焦困难。这些情况下,PDAF 系统可能需要与其他对焦系统(如 CDAF)配合使用,以确保对焦精度。
五、PDAF 的发展趋势
随着相机技术的不断进步,PDAF 也在不断演变和改进。以下是一些未来的发展方向:
-
全局相位检测:
新一代的图像传感器正在探索将相位检测像素分布到整个传感器的表面,而不仅仅集中在中央区域。这将显著改善边缘对焦能力,提升图像整体的对焦精度。
-
深度学习与智能对焦:
将人工智能技术融入 PDAF 系统,可以通过深度学习算法预测物体运动轨迹,从而实现更加智能的自动对焦。这在视频拍摄中尤其有潜力,能够大大提高对焦的稳定性和准确性。
-
混合自动对焦系统:
未来的自动对焦系统可能会结合 PDAF、CDAF 和 LAAF 等多种技术,以实现最佳的对焦性能。例如,在复杂的光照条件下,系统可以自动切换或综合使用不同的对焦方法,确保在任何环境下都能获得最佳的对焦效果。
六、总结
相位检测自动对焦(PDAF)作为一种成熟而高效的自动对焦技术,凭借其快速、准确的对焦能力,广泛应用于各种拍摄场景中。尽管它在某些特殊条件下存在一定的局限性,但随着技术的不断进步,这些问题正在逐步得到解决。未来,PDAF 有望继续发展,特别是在智能手机和高端摄影设备中,提供更卓越的拍摄体验。
图像算法 --- 自动对焦 AF
孤舟簔笠翁 于 2024-06-06 18:40:50 发布
一,CDAF 反差对焦原理
CDAF,全称 Contrast Detection Auto Focus,即反差式对焦或对比度检测自动对焦,是一种广泛应用于入门级数码相机和相机模块化智能手机上的自动对焦技术。以下是关于 CDAF 反差对焦的详细介绍:
工作原理
1,对比度检测:
CDAF 通过计算成像中相邻像素之间的对比度来确定焦点位置。具体来说,AF 算法从图像信号处理器(ISP)获取统计信息 FV(Focus Value),并计算出镜头下一次要移动的距离和方向。
2, 迭代过程:
CDAF 是一个反复迭代逐渐收敛的过程,类似于手动调焦的过程,即模糊 - 清晰 - 模糊,然后逐渐平衡到一个最清晰的位置。这一过程中,系统首先计算反差度,然后根据计算结果移动镜头、比较反差度,直到找到反差度最大的位置。
特点
1,广泛适用性:
CDAF 对各种类型的镜头和成像情况都有较好的适应性,是目前普及率最高、使用最广泛的自动对焦技术之一。
2,成本相对较低:
由于其原理相对简单且易于实现,CDAF 在成本上具有优势,使得它在入门级数码相机和智能手机等设备上得到了广泛应用。
3,光线和对比度敏感性:
CDAF 对光线和对比度的敏感度较高。在低光环境下,由于图像对比度降低,对焦速度可能会受到影响,变得较慢。
聚焦过程
1,聚焦点的选择:
CDAF 的聚焦点是算法任意指定的,并不对应 sensor 上的一些特别物理构造,因此没有数量上的限制。这使得系统可以根据图像的特征和需要灵活选择聚焦点。
2,近端和远端遍历:
在聚焦过程中,CDAF 算法会遍历完近端(Near End)和远端(Far End),即镜头的整个可对焦范围,以找到最佳的焦点位置。
右上图中的白色方框代表对焦点,此处反射出的红色光线在经过镜头,到达传感器前就汇聚在一点,随后又散开,此时图像的对比度是很低的。
将这个对焦点与相邻像素的对比度作分析得出右下角的曲线,失焦状态下对比度低,在聚焦过程中,曲线变得逐渐变得倾斜,但是不能判断什么时候是最高点,只有经过了对焦点后曲线下降再往回移动,反复移动后可以得到一个局部梯度最大值,就认为是对焦成功。
优点:光学设计简单。
缺点:
a. 速度较慢,在出现失焦图像时,机器无法判断该移动多少,甚至往哪个方向移动镜头才能聚焦,甚至到了峰值也不知道,必须移动过了以后再往回移动,来回几次后才能找到对焦点;
b. 在物体对比度较低时会对焦失败,比如雪景,无云的蓝天以及各种纯色的图像。
对比度:
对比度对视觉效果的影响非常关键,一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度小,则会让整个画面都灰蒙蒙的。
二,爬山算法原理
自动对焦爬山算法原理可以归纳为以下几个关键步骤:
1,初始化:
爬山算法从一个随机或预设的初始位置开始,这个位置代表了镜头的初始焦距。
2,清晰度评价:
算法首先在当前焦距下捕获一帧图像,并计算其清晰度评价值(Focus Value)。这个评价值通常基于图像的对比度、边缘清晰度等特征来计算。
3, 搜索方向确定:
算法然后以一个预定的步长沿某一方向(通常是向清晰度更高的方向)移动镜头,并捕获另一帧图像计算其清晰度评价值。
通过比较两帧图像的清晰度评价值,算法确定下一步的移动方向。如果新的评价值更高,说明移动方向正确,继续沿该方向移动;否则,反转移动方向。
4,步长调整:
随着镜头逐渐接近最佳焦距(即清晰度评价值的峰值点),算法会逐步减小步长,以提高对焦精度。
5,循环迭代:
算法重复以上步骤(清晰度评价、搜索方向确定、步长调整),直到满足聚焦精度要求或达到预设的最大迭代次数。
6,优化与改进:
传统的爬山搜索算法分为 "粗搜索" 和 "细搜索" 两个步骤。粗搜索采用较大步长快速搜索整个对焦区间内的清晰度评价值峰值;细搜索则是在找到峰值后,采用较小步长在峰值附近进行更精确的搜索。
爬山算法在实际应用中可能存在一些问题,如耗时较长、容易陷入局部最大值和峰值点附近震荡等。为了解决这些问题,研究者们提出了各种优化和改进方法,如采用拟合曲线的方式预测最佳峰值点,以减少搜索时间和提高对焦精度。
总结:
自动对焦爬山算法是一种通过迭代搜索方式实现自动对焦的算法。它基于图像的清晰度评价值来确定镜头的移动方向和步长,通过不断迭代逐渐逼近最佳焦距。虽然爬山算法在自动对焦领域得到了广泛应用,但仍存在一些挑战和限制,需要进一步的研究和改进来提高其 性能 和适用性。
三,PDAF 相位对焦原理
PDAF 相位对焦原理可以清晰地分为以下几个步骤进行解释:
1,像素布局与相位差检测
PDAF 技术是在成像传感器的感光元件上预留出一些特殊的遮蔽像素点,这些像素点被专门设计用于相位检测。
遮蔽像素点的设计类似于人类的双眼,它们分别遮盖像素点的左半边和右半边,从而模拟双眼看到物体的角度差异。
这些特殊的像素对被组织成一对一的小区域,每对都包含一个用于对焦的普通像素和一个用于相位差检测的像素。
2,相位差计算
当光线通过镜头折射后,会在成像传感器上形成干涉图案。这些干涉图案的相位差(PD 值)可以用来计算焦点的位置。
通过比较每对像素中的光强差异,系统可以计算出相位差。相位差的大小反映了焦点与当前位置的距离:相位差越大,焦点越远离当前位置;相位差越小,焦点越接近当前位置。
3,对焦位置确定
利用计算出的相位差信息,系统可以确定当前镜头的对焦位置是否准确。
如果焦点位置不准确,系统会根据相位差的大小和方向,调整镜头的位置,使其向正确的方向移动。
4,算法优化
相位差的计算和对焦位置的确定通常基于一些数学模型和算法,如互相关方法或锐度检测方法。
这些算法可以帮助系统更准确地计算相位差,并更快速地确定对焦位置。
5, 对焦调整
一旦系统确定了对焦位置的不准确性及其调整方向,就会控制相机镜头进行微调。
微调的过程会不断重复,直到系统确定镜头已经移动到正确的对焦位置。
紫色光线代表经过上半部分透镜的光线,蓝色代表经过下半部分透镜的光线,可以看到,CCD 在焦前的时候上半部分的 CCD 接收到的是上半部分的光线,下半部分接收的是下半部分的光线,在焦后的时候,是相反的,上半部分接收的是下半部分的光线,下半部分接收的是上半部分的光线。这样就可以通过区分光线是来自透镜的上半部分还是下半部分,就可以知道是在焦前或者焦后了。当亮色光线重合时,图像最清晰。
PDAF sensor 的一种实现如上图所示,在 CMOS 上面一半的位置加了金属遮盖,这样,被遮住左边一半的像素点就只能接受右边来的光,同理,pair 的被遮住右边一般的像素点就只能接受左边来的光。一般在 CMOS 中,遮住左边和遮住右边的像素点是在相邻位置会成对出现。
遮蔽因子遮住图像传感器左右的两个像素点得到他们的相位差,再通过算法结算,得到焦点位置,最后通过音圈马达移动镜头的位置,完成对焦。
验证方法
1、将抓取 PDAF log 开关打开
2、抓取 log,按照 mtk 文档排查,读取 confidence 数据,confidence 数据是一组数据,我们需要排查这组数据变化是否较大。
3、PD 线性度测试(在 log 里查找 pdvalue 与 af 位置,看他们是否是呈线性关系)
4、肉眼看是否是一次性对焦到位,如果是相位对焦。如果不是反差对焦。
Type1、Type2、Type3 的区别
1、Type1:PD 像素通过传感器校正,PD 值通过传感器计算
2、Type2:PD 像素通过传感器校正,PD 像素通过 vc 输出到 isp
3、Type3:PD 像素通过 ISP 校正,PD 像素通过 isp 从原始图像中提取 PD 像素由 ISP3.0 上的 PDAF 算法提取。
Vc 是传输 raw 和 pd 像素的两个通道。
总结:
PDAF 相位对焦技术通过利用成像传感器上的特殊遮蔽像素点来检测相位差,从而快速、准确地确定焦点的位置。这种技术不仅提高了对焦的速度,还提高了对焦的精度,使得数码相机和摄像机等设备能够更好地捕捉清晰、锐利的图像。
3A 算法 --- 自动对焦(AF)
岁月蹉跎的一杯酒 于 2021-03-17 18:19:19 发布
关于这方面知识,自己所能接触到的东西较少,目前属于学习阶段。
1、定义
自动对焦是利用物体光反射原理,将反射的光被相机上的传感器 CCD 所接受,通过计算机处理,带动电动对焦设备进行对焦的方式叫做自动对焦。
下面简单介绍几个专业名字
-
物距:物距是指物体到透镜中心的距离,一般用表示 u 表示。
-
像距:像距是像(CCD 传感器)到平面镜(或透镜的光心)之间的距离,一般用 v 表示。
-
焦距:镜头的焦距基本上是从镜头的中心点,到形成清晰影像镜头胶片或数码 CCD 之间的距离。
-
凸透镜:凸透镜是跟据光的这声原理制成的。凸透镜是中央较厚,边缘较薄的透镜。凸透镜分为双凸、平凸和凹凸(或正弯月形)等形式,凸透镜有会聚光线的作用故又称会聚透镜,较厚的凸透镜则有望远、会聚等作用,这与透镜的厚度有关。远视眼镜是凸透镜。
-
景深:当你拍摄一个照片,照片当中最近的物体和最远的物体之间,能清晰成像的部分,就是景深。
凸透镜成像原理
最简单的人眼模型至少是一个焦距可变的凸透镜(晶状体等)+ 光屏(视网膜)。
人脑会对视网膜所成的像进行翻转,所以看到的是倒立的像,根据惠更斯原理,凸透镜所成像上各点均可看作光源,所以即使在像的位置放上光屏,对光进行散射,也不影响人眼再次成像;如果把人眼看出 CCD 光屏,对人眼考虑成像公式,1/u+1/v=1/f;
2、图像清晰度评价方法
我们可以通过不同的图像清晰度评价方法来评价图像是否聚焦清楚。
其中自动聚焦评价函数主要有:
评价函数算法详细可参考
- 图像清晰度评价指标-CSDN博客
https://blog.csdn.net/charlene_bo/article/details/72673490(见下文)
聚焦的准确位置对应于锐度评价函数的最大峰值,也只有找到最大峰值才能知道准确聚焦的位置如何确定最大峰值 ,也就是采用什么样的方法来搜索聚焦峰值, 是基于对比度被动自动聚焦的另外需要考虑 的问题意义上讲,锐度评价函数决定了聚焦的精度,而聚焦峰值搜索方法决定了自动聚焦的速度。
3、对焦算法
自动对焦基本原理是:对焦过程中图像仍在一直不断产生,把镜头在某个位置时的那帧图像送到图像处理器(ISP)处理,得出该图像的统计信息,再把这信息送到对焦算法库(也许是在 isp 硬件 上执行,也许是在驱动程序软件执行),对焦算法库根据硬件规范和上述统计信息算出下一步镜头该往哪个方向移动多少距离,并驱动镜头到达那个位置;接着在此位置得到新图像,又计算统计信息,计算再下一步的镜头位置... 图像清晰度渐渐变化,如此经过几个循环收敛,图像到一定程度,就认为对焦成功。
上述图像统计信息必然是和对焦算法一一对应的,用什么样的算法就需要 ISP 计算相应的统计信息。
围绕不同的对焦算法,就形成了各种自动对焦方式,不同的对焦方式有不同的对焦速度和硬件需求及设计(主要针对摄像头传感器)。
对焦算法设计的目标就是快狠准地完成对焦。各种常见算法各路大神已经说得非常全面,在此只做简单小结,(也不作精确分类,因为认识不全面,也分不太清):
第一类,测距法。摄像头发出红外光或超声波(现在也有激光的)并接收返回光线,实现测距,然后借此距离计算物距实现对焦,此方法精度略差,高端机上已较少使用,或作为其他方法的补充。
第二类,图像分析法。又分为反差式和相位检测两种。
反差式就是通过前文所述不断迭代过程,找到画面对比度最大时的镜头位置。
相位检测是较新的技术,多用于单反相机,现渐渐开始用于手机,比如 iphone6。主要原理是通过一个分离镜头(或是通过集成在主图像传感器上的一些线性传感器)产生两个光路,当对焦准确时,通过两个光路分别形成的画面之间的偏移应该等于两个光路固有相位差。相位差方法速度快,精度也较高,但需要硬件的支持。
摘自:https://www.zhihu.com/question/23636965/answer/45393596
一般通用的自动聚焦算法都要考虑聚焦函数和最佳焦平面算法。也有一些自动聚焦方法,通过添加一些额外的装置,能够计算出最佳焦平面的位置,从而实现快速自动聚焦。
锐度评价函数决定了自动聚焦所能达到的精度,而聚焦峰值搜索则决定了自动聚焦的速度。因 此,只有研究或采用适应性强、抗噪声能力强的锐度评价函数,以及设计稳定而高效 的峰值搜索方法,才能够满足自动聚焦迅速、精确的要求。
关于具体算法,之后也会不断学习进行更新。
致谢
- 手机是如何实现自动对焦的? - 知乎
https://www.zhihu.com/question/23636965
图像清晰度的评价指标
charlene_bo 于 2017-05-24 09:50:17 发布
from: http://nkwavelet.blog.163.com/blog/static/227756038201461532247117(链接已沉寂)
在无参考图像的质量评价中,图像的清晰度是衡量图像质量优劣的重要指标,它能够较好的与人的主观感受相对应,图像的清晰度不高表现出图像的模糊。本文针对无参考图像质量评价应用,对目前几种较为常用的、具有代表性清晰度算法进行讨论分析,为实际应用中选择清晰度算法提供依据。
(1)Brenner 梯度函数
Brenner 梯度函数是最简单的梯度评价函数,它只是简单的计算相邻两个像素灰度差的平方,该函数定义如下:
其中: f ( x , y ) 表示图像 f 对应像素点 ( x , y ) 的灰度值, D ( f ) 为图像清晰度计算结果 ( 下同 ) f (x,y) 表示图像 f 对应像素点 (x,y) 的灰度值,D (f) 为图像清晰度计算结果 (下同) f(x,y)表示图像f对应像素点(x,y)的灰度值,D(f)为图像清晰度计算结果(下同)。
(2)Tenengrad 梯度函数
Tenengrad 梯度函数采用 Sobel 算子分别提取水平和垂直方向的梯度值,基与 Tenengrad 梯度函数的图像清晰度定义如下:
G (x,y) 的形式如下:
其中:T 是给定的边缘检测阈值,Gx 和 Gy 分别是像素点 (x,y) 处 Sobel 水平和垂直方向边缘检测算子的卷积,建议使用以下的 Sobel 算子模板来检测边缘:
(3)Laplacian 梯度函数
Laplacian 梯度函数与 Tenengrad 梯度函数基本一致,用 Laplacian 算子替代 Sobel 算子即可,该算子定义如下:
因此基于 Laplacian 梯度函数的图像星清晰度的定义如下:
其中 G (x,y) 是像素点 (x,y) 处 Laplacian 算子的卷积。
(4)SMD(灰度方差)函数
当完全聚焦时,图像最清晰,图像中的高频分量也最多,故可将灰度变化作为聚焦评价的依据,灰度方差法的公式如下:
(5)SMD2 (灰度方差乘积)函数
灰度差分评价函数具有较好的计算性能,但其缺点也很明显,即在焦点附近灵敏度不高,即该函数在极值点附近过于平坦,从而导致聚焦精度难以提高。在文章《一种快速高灵敏度聚焦评价函数》中提出了一种新的评价函数,称之为灰度方差乘积法,即对每一个像素领域两个灰度差相乘后再逐个像素累加,该函数定义如下:
(6)方差函数
因为清晰聚焦的图像有着比模糊图像更大的灰度差异,可以将方差函数作为评价函数:
其中:μ 为整幅图像的平均灰度值,该函数对噪声比较敏感,图像画面越纯净,函数值越小。
(7)能量梯度函数
能量梯度函数更适合实时评价图像清晰度,该函数定义如下:
(8)Vollath 函数
Vollath 函数定义如下:
其中: μ 为整幅图像的平均灰度值,M 和 N 分别为图像宽和高。
(9)熵函数
基于统计特征的熵函数是衡量图像信息丰富程度的一个重要指标,有信息论可知,一幅图像 f 的信息量是由该图像的信息熵 D (f) 来度量:
其中:Pi 是图像中灰度值为 i 的像素出现的概率,L 为灰度级总数(通常取值 256)。根据 Shannon 信息论,熵最大时信息量最多。将此原理应用到对焦过程,D (f) 越大则图像越清晰。熵函数灵敏度不高,依据图像内容不同容易出现与真实情况相反的结果。
(10) EAV 点锐度算法函数
徐贵力、张霞等提出了一种基于边缘锐度的算法用于评价图像的清晰度。通过统计图像某一边缘方向的灰度变化情况来评价。计算公式如下:
其中:df/dx 为边缘法向的灰度变化率,f (b) - f (a) 为该方向的总体灰度变化。该算法只对图像的特定边缘区域做统计,能否代表整幅图像的清晰度仍有疑问,此外计算前需人工选定边缘区域,不便实现程序运算的自动化,因为王鸿南等在论文 图像清晰度评价方法研究 中对上述算法进行了改进,改进如下:
a) 将针对边缘的梯度计算改为逐个像素领域梯度的计算,以便算法能对图像的整体进行评价,并使算法实现自动化。
b) 对方格像素 8 领域的灰度变化进行距离加权,水平和垂直方向的权重为 1,而 45 度和 135 度方向的权重为 1 2 \frac{1}{\sqrt{2}} 2 1 。
c) 对计算结果按图像的大小进行规格化,以便于图像的对比。
经过以上三步改进后的点锐度算法为:
其中:M 和 N 为图像的行数和列数。
(11)Reblur 二次模糊
如果一幅图像已经模糊了,那么再对它进行一次模糊处理,高频分量变化不大;但如果原图是清楚的,对它进行一次模糊处理,则高频分量变化会非常大。因此可以通过对待评测图像进行一次高斯模糊处理,得到该图像的退化图像,然后再比较原图像和退化图像相邻像素值的变化情况,根据变化的大小确定清晰度值的高低,计算结果越小表明图像越清晰,反之越模糊。这种思路可称作基于二次模糊的清晰度算法,其算法简化流程如下图:
(12)NRSS 梯度结构相似度
Wang 等利用人类视觉系统(HVS)非常适于提取目标的结构信息的特点,提出了图像结构相似度概念(SSIM),认为只要能计算目标结构信息的变化,就能够得到感知图像失真值。杨春玲等基于此思路,将该方法引入到计算全参考图像的清晰度评价中,认为图像的清晰度可以使用目标图像与参考图像间的结构相似度来表示,而图像间的结构相似度包含以下三个部分的比较:
而 C1、C2 和 C3 是为了避免分母为 0 而设的常数。图像的结构相似度由下式计算可得:
为简单起见可以令
谢小甫等进一步改进了杨春玲等的方法,根据结构相似度的相关思想结合人烟视觉系统的相关特点,设计了无参考图像清晰度的评价指标(NRSS),计算方法如下:
(a)为待评价图像构造参考图像。定义待评价图像为 I,而参考图像 I r = L P F ( I ) I_r=LPF(I) Ir=LPF(I),即对待评价图像 I 进行低通滤波得到参考图像 I r I_r Ir。实验表明,基于圆盘模型的均值滤波器和高斯模型的平滑滤波器都可以取得较好的效果,为了更好的与成像系统匹配,建议采用 7x7 大小且 σ 2 = 6 σ^2=6 σ2=6 的高斯平滑滤波器。在需要实时处理的工程应用中 7x7 均值滤波器并不会是评价效果下降很大。
(b)提取图像 I 和 I r I_r Ir 的梯度信息。利用人眼对水平和垂直方向的边缘信息最为敏感的特性,使用 Sobel 算子分别提取水平和垂直方向的边缘信息,定义 I 和 I r I_r Ir 的梯度图像是 G 和 G r G_r Gr。
(c)找出梯度图像 G 中梯度信息最丰富的 N 个图像块。将图像 G 划分为 8x8 的小块,块间的步长为 4,即相邻块有 50% 重叠,这是为了避免丢失重要的边缘。计算每块的方差,方差越大说明梯度信息越丰富,找出其中方差最大的 N 块,记为 { x i ∣ i = 1 , 2 , . . . , N } \left\{ \mathop{x}{i}|i=1,2,...,N \right\} {xi∣i=1,2,...,N},对应的 G r G_r Gr 中的对应块定义为 { y i ∣ i = 1 , 2 , . . . , N } \left\{ \mathop{y}{i}|i=1,2,...,N \right\} {yi∣i=1,2,...,N}。N 的值大小直接影响评价结果,同时也影响算法运行时间。在后面的实验中设 N = 64。
(d)计算结构清晰度 NRSS。先计算每个 x i x_i xi 和 y i y_i yi 的结构相似度 S S I M ( x i , y i ) SSIM (x_i, y_i) SSIM(xi,yi),其中 S S I M SSIM SSIM 计算方法参见前面的定义,则图像的无参考结构清晰度定义为:
(13)FFT 图像变换域
待写!(多年已过去,作者并未更新)
(14) No-Reference Perceptual Quality Assessment of JPEG Compressed Images
在这篇文章中,作者【Zhou Wang】等针对 JPEG 压缩图片提出了一种新的无参图像质量评价方法。
JPEG 图片是基于 8x8 块的 DCT 变换的编码技巧,它是有损的因为对 DCT 变换系数做量化的时候会产生量化误差。量化就会导致模糊和块效应。模糊主要是因为丢失了高频的 DCT 系数。块效应是由于块边界的不连续性,因为每个分块的量化是独立的。
我们用 f ( x , y ) f (x, y) f(x,y) 表示一幅图片,图片尺寸为 M × N M\times N M×N,计算跨越每个水平线的信号差:
首先计算块效应,块效应的定义就是左右跨越边界的信号差的平均值:
然后计算块内信号差的平均值:
再计算 zero-crossing(ZC)率,ZC 是边界跨零的意思,也就是说相邻两个点的 d h ( x , y ) \mathop{d}_{h}\left( x,y \right) dh(x,y) 值的乘积为负数,也就是一正一负,因此对于 [1, N - 2] 范围内的 y,定义如下变量:
于是水平方向的 ZC 率定义如下:
同理,我们可以计算垂直方向的几个指标值 B v , A v a n d Z v \mathop{B}{v}\,,\mathop{A}{v}\,and\,\mathop{\text{Z}}_{v}\, Bv,AvandZv。最后得到这几个指标的水平和垂直方向的平均值:
有很多方式把这几个指标联系起来组成一个质量评价模型。此处我们采用如下图像质量定义:
S = α + β B γ 1 A γ 2 Z γ 3 \displaystyle S = \alpha + \beta B^{\gamma_1} A^{\gamma_2} Z^{\gamma_3} S=α+βBγ1Aγ2Zγ3
其中 α , β , γ 1 , γ 2 a n d γ 3 \displaystyle \alpha ,\,\,\beta ,\,\,{{\gamma }{1}},\,\,{{\gamma }{2}}\,\,and\,\,{{\gamma }_{3}} α,β,γ1,γ2andγ3 是从大量实验中提炼出来的模型参数。本文中所采用的参数值如下:
(15)No-Reference Image Quality Assessment forJPEG/JPEG2000 Coding
这篇文章的作者在前面那篇文章的基础上,重新定义了新的质量指标:
其实 S 就是在(14)中已经得到的质量评价值。
(16)No-Reference Image Quality Assessment using Blur and Noise
图像质量受很多因素影响,例如:亮度、对比度、色调、边界、噪声、模糊等。在本文中,我们假定噪声和模糊是影响图像质量最重要的两个因素。简单起见,只对彩色图像的亮度分量做模糊和噪声监测。本文的图像质量评价算法框架图如下:
A)模糊检测
模糊估计分为两个步骤:首先是边缘检测,然后是模糊确定。此处模糊估计是通过计算当前像素点与领域内像素点均值之差来确定。我们用 f ( x , y ) f (x,y) f(x,y) 表示图片,其中
x ∈ [ 1 , M ] a n d y ∈ [ 1 , N ] x\in \left[ 1,M \right]\,and\,y\in \left[ 1,N \right] x∈[1,M]andy∈[1,N]
定义水平绝对差如下:
D h ( x , y ) = ∣ f ( x , y + 1 ) − f ( x , y − 1 ) ∣ \displaystyle \mathop{D}_{h}\left( x,y \right)=|f\left( x,y+1 \right)-f\left( x,y-1 \right)| Dh(x,y)=∣f(x,y+1)−f(x,y−1)∣
整个图片的水平绝对差的均值为:
如果当前像素点的 D h ( x , y ) D h − m a e n \mathop{D}{h}\left( x,y \right)\,\,\mathop{\,D}{h-maen} Dh(x,y)Dh−maen, 则该像素点就是一个候选的边缘点 C h ( x , y ) \mathop{C}{h}\left( x,y \right) Ch(x,y)。如果 C h ( x , y ) \mathop{C}{h}\left( x,y \right) Ch(x,y) 比它水平方向两个相邻的点 { C h ( x , y − 1 ) , C h ( x , y + 1 ) } \left\{ \mathop{C}{h}\left( x,y-1 \right),\mathop{C}{h}\left( x,y+1 \right) \right\} {Ch(x,y−1),Ch(x,y+1)} 都大,则该像素点就被确认为一个边缘点。边缘点 E h ( x , y ) \mathop{E}_{h}\left( x,y \right) Eh(x,y) 的判断总结如下:
接下来我们检测边缘点是否模糊。定义:
同理,按照以上的步骤我们可以计算垂直方向的值 B R v B{{R}{v}} BRv。 B R h B{{R}{h}} BRh 和 B R v B{{R}_{v}} BRv 两者之大者称作 Inverse Blurriness,用于最终的模糊判定依据。
低于阈值 ThB 的 Inverse Blurriness 被认为是模糊的。实验测试表明此处的阈值 ThB 取值 0.1。最后,边缘模糊的均值和比率为:
B)噪点检测
因为沿边缘的噪点视觉上不明显,因此我们只检测边缘之外的噪点。边缘检测会被噪点影响,因此在检测边缘之前做一个噪点滤波的预处理。在本文中,应用均值滤波来消除噪点。均值滤波之后的图像 g ( x , y ) g (x,y) g(x,y) 为:
候选的噪点估计如下:
同理可以在垂直方向计算对应的值。然后得到候选的噪点是:
其中 N_cand (x,y) 表示候选噪点,它在边缘区域为 0。
噪点均值和比率为:
其中 Sum_Noise 是 N ( x , y N (x,y N(x,y) 之和, N o i s e c n t Noise_{cnt} Noisecnt 是噪点总数目。
C)噪点和模糊的组合
此处我们的图像质量评价指标定义如下:
其中 w 1 、 w 2 、 w 3 、 w 4 w_1、w_2、w_3、w_4 w1、w2、w3、w4 是权值。通过线性回归分析获取这些权值。本文中这些权值为:
w 1 = 1 , w 2 = 0.95 , w 3 = 0.3 , w 4 = 0.75 w_1=1,w_2=0.95,w_3=0.3,w_4=0.75 w1=1,w2=0.95,w3=0.3,w4=0.75
实验
为了测试以上评价方法的准确性,我们才用 C 语言 编程实现以上算法,由于以上算法都是针对灰度图,因此在处理彩色图像的时候,首先将彩色图像转化为灰度图(简单起见,转化算法采用了 g r e y = ( R + G + B ) / 3 grey = (R + G + B) /3 grey=(R+G+B)/3)。 测试图片采用了美国德州大学图像与视频工程实验室提供的图像质量评价数据库。该图像数据库包含了 29 幅原始图像,并利用原始图像生成了包括 JPEG 压缩、JPEG2000 压缩、高斯模糊、Fastfsding(在 Fastading 通道中传输传输错误)、WhiteNoise(白噪声)五类失真在内的失真图像共 779 幅。此处我们选用 JPEG 目录下的部分图片做测试。
首先来看看第一组测试图片:
DatabaseRelease2\jpeg\img29.bmp
DatabaseRelease2\jpeg\img42.bmp (原始图片)
DatabaseRelease2\jpeg\img77.bmp
DatabaseRelease2\jpeg\img81.bmp
DatabaseRelease2\jpeg\img183.bmp
测试数据(阈值 T = 50)
算法 | img29 | img42 | img77 | img81 | img183 |
---|---|---|---|---|---|
Brenner | 791.45 | 1050.36 | 844.41 | 898.57 | 754.88 |
Tenengrad | 10.88 | 12.72 | 11.51 | 11.92 | 10.59 |
Laplacian | 8.507 | 14.47 | 9.05 | 9.86 | 9.08 |
SMD | 18.57 | 24.71 | 20.94 | 22.57 | 14.32 |
SMD2 | 168.19 | 293.15 | 196.84 | 217.17 | 128.57 |
Variance | 2107.86 | 2134.98 | 2083.19 | 2100.05 | 2110.90 |
Energy | 677.48 | 941.98 | 713.81 | 754.95 | 668.54 |
Vollath | 1940.97 | 1897.70 | 1910.28 | 1912.10 | 1940.81 |
Entropy | 7.00 | 7.38 | 7.26 | 7.38 | 5.24 |
EAV | 75.88 | 93.71 | 83.70 | 89.16 | 60.85 |
JPEG | 2.08 | 9.25 | 3.95 | 5.16 | -1.53 |
JPEG2 | 2.12 | 4.99 | 3.90 | 4.60 | 1.04 |
Remark:
1 ) 肉眼可以分辨以上五幅图像的质量排名为:img42 > img81 > img77 > img29 > img183
2 ) 与主观感知一致的算法有:Brenner、Tenengrad、SMD、SMD2、Energy、Entropy、EAV、JPEG、JPEG2
3 ) Variance、Vollath 算法所得数据非常接近,无法分辨出图像质量。
4) Laplacian 在判断 img29 和 img183 的时候出现失误,这两个图片的质量都非常差
第二组测试图片 (省略了图片显示,有兴趣的朋友可以去网上下载):
DatabaseRelease2\jpeg\img20.bmp (原始图片)
DatabaseRelease2\jpeg\img23.bmp
DatabaseRelease2\jpeg\img56.bmp
DatabaseRelease2\jpeg\img152.bmp
DatabaseRelease2\jpeg\img215.bmp
DatabaseRelease2\jpeg\img228.bmp
第二组测试数据(阈值 T = 50)
算法 | img20 | img23 | img56 | img152 | img215 | img228 |
---|---|---|---|---|---|---|
Brenner | 756.67 | 500.89 | 615.53 | 553.55 | 418.77 | 725.29 |
Tenengrad | 8.00 | 6.17 | 7.08 | 6.66 | 5.56 | 7.73 |
Laplacian | 11.36 | 6.04 | 8.02 | 6.87 | 5.78 | 10.86 |
SMD | 19.41 | 13.40 | 17.16 | 15.44 | 8.67 | 19.56 |
SMD2 | 231.65 | 120.85 | 169.69 | 141.39 | 81.10 | 224.10 |
Variance | 2773.79 | 2631.73 | 2690.92 | 2650.81 | 2649.59 | 2724.18 |
Energy | 775.58 | 466.00 | 581.42 | 510.01 | 421.47 | 743.86 |
Vollath | 2601.47 | 2535.77 | 2565.37 | 2542.39 | 2564.13 | 2558.90 |
Entropy | 7.15 | 6.84 | 7.28 | 7.21 | 4.16 | 7.29 |
EAV | 73.86 | 54.71 | 67.48 | 61.76 | 37.02 | 74.89 |
JPEG | 9.59 | 3.03 | 6.38 | 4.93 | -1.87 | 8.62 |
JPEG2 | 5.00 | 3.03 | 4.88 | 4.51 | 1.03 | 4.99 |
Remark:
1 ) 肉眼可以分辨以上图片的质量排名为:img20 > img228 > img56 > img152 > img23 > img215
2 ) 与主观感知一致的算法有:Brenner、Tenengrad、Laplacian、SMD2、Energy、JPEG、JPEG2
3 ) Vollat、Entropy 算法失误比较多。
4 ) SMD、EAV 在判断 img20 和 img228 的时候出现失误,这两个图片质量都非常好,肉眼有时候很难分辨,因此这种失误在可以接受的范围。
5 ) Variance 在判断 img23 和 img215 的时候出现失误,这两个图片质量都非常差。
python实现
1 Brenner 梯度函数
cobol
def brenner(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
shape = np.shape(img)
out = 0
for x in range(0, shape[0]-2):
for y in range(0, shape[1]):
out+=(int(img[x+2,y])-int(img[x,y]))**2
return out
2 Laplacian梯度函数
python
def Laplacian(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
return cv2.Laplacian(img,cv2.CV_64F).var()
3 SMD(灰度方差)
python
def SMD(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
shape = np.shape(img)
out = 0
for x in range(0, shape[0]-1):
for y in range(1, shape[1]):
out+=math.fabs(int(img[x,y])-int(img[x,y-1]))
out+=math.fabs(int(img[x,y]-int(img[x+1,y])))
return out
4 SMD2(灰度方差乘积)
cobol
def SMD2(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
shape = np.shape(img)
out = 0
for x in range(0, shape[0]-1):
for y in range(0, shape[1]-1):
out+=math.fabs(int(img[x,y])-int(img[x+1,y]))*math.fabs(int(img[x,y]-int(img[x,y+1])))
return out
5 方差函数
cobol
def variance(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
out = 0
u = np.mean(img)
shape = np.shape(img)
for x in range(0,shape[0]):
for y in range(0,shape[1]):
out+=(img[x,y]-u)**2
return out
6 能量梯度函数
cobol
def energy(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
shape = np.shape(img)
out = 0
for x in range(0, shape[0]-1):
for y in range(0, shape[1]-1):
out+=((int(img[x+1,y])-int(img[x,y]))**2)+((int(img[x,y+1]-int(img[x,y])))**2)
return out
7 Vollath函数
cobol
def Vollath(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
shape = np.shape(img)
u = np.mean(img)
out = -shape[0]*shape[1]*(u**2)
for x in range(0, shape[0]-1):
for y in range(0, shape[1]):
out+=int(img[x,y])*int(img[x+1,y])
return out
8 熵函数
cobol
def entropy(img):
'''
:param img:narray 二维灰度图像
:return: float 图像约清晰越大
'''
out = 0
count = np.shape(img)[0]*np.shape(img)[1]
p = np.bincount(np.array(img).flatten())
for i in range(0, len(p)):
if p[i]!=0:
out-=p[i]*math.log(p[i]/count)/count
return out
参考文献:
- 面向无参考图像的清晰度评价方法研究
- 图像清晰度评价方法研究
- 数字图像清晰度评价函数的研究与改进
- 一种针对图像模糊的无参考质量评价指标
- 一种快速高灵敏度聚焦评价函数
- No-Reference Perceptual Quality Assessment of JPEG Compressed Images
- No-Reference Image Quality Assessment forJPEG/JPEG2000 Coding
- No-Reference Image Quality Assessment using Blur and Noise
AF 自动对焦 CDAF PDAF
Camera Man 已于 2022-03-19 15:55:53 修改
前言
主流的 AF: CDAF, PDAF, laser assist AF (这个只是辅助,在微距或者拍摄纹理不明显的场景下好用)。
cdaf 原理
CDAF 的大致原理就是检测图像锐度或者等价于锐度的参数,不断推动马达寻找最清晰点实现合焦或者对焦。如 下图:
自动对焦算法
thisiszdy 于 2020-10-09 19:30:24 发布
1、介绍
图像清晰度是衡量图像质量的一个重要指标,对于相机来说,其一般工作在无参考图像的模式下,所以在拍照时需要进行对焦的控制。对焦不准确,图像就会变得比较模糊不清晰。相机对焦时通过一些清晰度评判指标,控制镜头与 CCD 的距离,使图像成像清晰。一般对焦时有一个调整的过程,图像从模糊到清晰,再到模糊,确定清晰度峰值,再最终到达最清晰的位置。
常见的图像清晰度评价一般都是基于梯度的方法,本文将介绍五种简单的评价指标,分别是 Brenner 梯度法、Tenegrad 梯度法、laplace 梯度法、方差法、能量梯度法。
2、Halcon 代码
①、Tenegrad 函数
//Tenegrad 梯度法
sobel_amp (Image, EdgeAmplitude, 'sum_sqrt', 3)
min_max_gray (EdgeAmplitude, EdgeAmplitude, 0, Min, Max, Range)
threshold (EdgeAmplitude, Region1, 20, 255)
region_to_bin (Region1, BinImage, 1, 0, Width, Height)
mult_image (EdgeAmplitude, BinImage, ImageResult4, 1, 0)
mult_image (ImageResult4, ImageResult4, ImageResult, 1, 0)
intensity (ImageResult, ImageResult, Value, Deviation)
②、方差函数
// 方差法
region_to_mean (ImageReduced, Image, ImageMean)
convert_image_type (ImageMean, ImageMean, 'real')
convert_image_type (Image, Image, 'real')
sub_image (Image, ImageMean, ImageSub, 1, 0)
mult_image (ImageSub, ImageSub, ImageResult, 1, 0)
intensity (ImageResult, ImageResult, Value, Deviation)
③、能量函数
// 能量梯度函数
crop_part (Image, ImagePart00, 0, 0, Width-1, Height-1)
crop_part (Image, ImagePart01, 0, 1, Width-1, Height-1)
crop_part (Image, ImagePart10, 1, 0, Width-1, Height-1)
convert_image_type (ImagePart00, ImagePart00, 'real')
convert_image_type (ImagePart10, ImagePart10, 'real')
convert_image_type (ImagePart01, ImagePart01, 'real')
sub_image (ImagePart10, ImagePart00, ImageSub1, 1, 0)
mult_image (ImageSub1, ImageSub1, ImageResult1, 1, 0)
sub_image (ImagePart01, ImagePart00, ImageSub2, 1, 0)
mult_image (ImageSub2, ImageSub2, ImageResult2, 1, 0)
add_image (ImageResult1, ImageResult2, ImageResult, 1, 0)
intensity (ImageResult, ImageResult, Value, Deviation)
④、Brenner 函数
//Brenner 梯度法
crop_part (Image, ImagePart00, 0, 0, Width, Height-2)
convert_image_type (ImagePart00, ImagePart00, 'real')
crop_part (Image, ImagePart20, 2, 0, Width, Height-2)
convert_image_type (ImagePart20, ImagePart20, 'real')
sub_image (ImagePart20, ImagePart00, ImageSub, 1, 0)
mult_image (ImageSub, ImageSub, ImageResult, 1, 0)
intensity (ImageResult, ImageResult, Value, Deviation)
⑤、Laplace 函数
// 拉普拉斯梯度函数
laplace (Image, ImageLaplace4, 'signed', 3, 'n_4')
laplace (Image, ImageLaplace8, 'signed', 3, 'n_8')
add_image (ImageLaplace4, ImageLaplace4, ImageResult1, 1, 0)
add_image (ImageLaplace4, ImageResult1, ImageResult1, 1, 0)
add_image (ImageLaplace8, ImageResult1, ImageResult1, 1, 0)
mult_image (ImageResult1, ImageResult1, ImageResult, 1, 0)
intensity (ImageResult, ImageResult, Value, Deviation)
自动对焦算法(OpenCV 实现)
Isaac320 于 2021-12-13 16:38:13 发布
看了一篇用 halcon 实现自动对焦算法的文章,
- 自动对焦算法-CSDN博客见上文)
https://blog.csdn.net/thisiszdy/article/details/108984491
文中提到了五个评价函数,评价值越高,图像即越清晰,配合控制电机或其他,通过拍摄多张照片,分析其评价值,可实现自动对焦。
我这边用 opencv 实现下这篇文章提到的几个方法。
C++ 代码如下:
①、Tenegrad 函数
cpp
case 0: //Tenegrad 函数
{
Mat xgrad;
Mat ygrad;
Sobel (grayImg, xgrad, CV_32F, 1, 0);
Sobel (grayImg, ygrad, CV_32F, 0, 1);
Mat xygrad = xgrad.mul (xgrad) + ygrad.mul (ygrad);
sqrt (xygrad, xygrad);
Mat thMat;
threshold (xygrad, thMat, th, 1, ThresholdTypes::THRESH_BINARY);
Mat resMat = xygrad.mul (thMat);
pow (resMat, 2, resMat);
OutValue = mean (resMat)[0];
break;
}
②、方差函数
cpp
case 1: // 方差
{
Mat meanImg, stdImg;
meanStdDev (grayImg, meanImg, stdImg);
OutValue = stdImg.at<double>(0, 0);
break;
}
③、能量函数
cpp
case 2: // 能量函数
{
Mat kern1 = (Mat_<char>(2, 1) << -1, 1);
Mat kern2 = (Mat_<char>(1, 2) << -1, 1);
Mat engImg1, engImg2;
filter2D (grayImg, engImg1, CV_32F, kern1);
filter2D (grayImg, engImg2, CV_32F, kern2);
Mat resImg = engImg1.mul (engImg1) + engImg2.mul (engImg2);
OutValue = mean (resImg)[0];
break;
}
④、Brenner 函数
cpp
case 3: //Brenner 函数
{
Mat kernBre = (Mat_<char>(3, 1) << -1, 0, 1);
Mat BreImg;
filter2D (grayImg, BreImg, CV_32F, kernBre);
pow (BreImg, 2, BreImg);
OutValue = mean (BreImg)[0];
break;
}
⑤、Laplace 函数
cpp
case 4: //Laplace 函数
{
Mat kernLap = (Mat_<char>(3, 3) << -1, -1, -1, -1, 8, -1, -1, -1, -1);
Mat LapImg;
filter2D (grayImg, LapImg, CV_32F, kernLap);
pow (LapImg, 2, LapImg);
OutValue = mean (LapImg)[0];
break;
}
OK!
OpenCV 图像清晰度评价(相机自动对焦)
- 牧野 - 于 2016-12-09 20:33:08 发布
相机的自动对焦要求相机根据拍摄环境和场景的变化,通过相机内部的微型驱动马达,自动调节相机镜头和 CCD 之间的距离,保证像平面正好投影到 CCD 的成像表面上。这时候物体的成像比较清晰,图像细节信息丰富。
相机自动对焦的过程,其实就是对成像清晰度评价的过程,对焦不准确,拍摄出来的图像清晰度低,视觉效果模糊,如果是在工业检测测量领域,对焦不准导致的后果可能是致命的;对焦准确的图像清晰度较高,层次鲜明,对比度高。
图像清晰度评价算法有很多种,在空域中,主要思路是考察图像的领域对比度,即相邻像素间的灰度特征的梯度差;在频域中,主要思路是考察图像的频率分量,对焦清晰的图像高频分量较多,对焦模糊的图像低频分量较多。
这里实现 3 种清晰度评价方法,分别是 Tenengrad 梯度方法、Laplacian 梯度方法和方差方法。
Tenengrad 梯度方法
Tenengrad 梯度方法利用 Sobel 算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。以下是具体实现,这里衡量的指标是经过 Sobel 算子处理后的图像的平均灰度值,值越大,代表图像越清晰。
cpp
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main ()
{
Mat imageSource = imread ("2.jpg");
Mat imageGrey;
cvtColor (imageSource, imageGrey, CV_RGB2GRAY);
Mat imageSobel;
Sobel (imageGrey, imageSobel, CV_16U, 1, 1);
// 图像的平均灰度
double meanValue = 0.0;
meanValue = mean (imageSobel)[0];
//double to string
stringstream meanValueStream;
string meanValueString;
meanValueStream << meanValue;
meanValueStream >> meanValueString;
meanValueString = "Articulation (Sobel Method):" + meanValueString;
putText (imageSource, meanValueString, Point (20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar (255, 255, 25), 2);
imshow ("Articulation", imageSource);
waitKey ();
}
使用三张测试图片模拟不同对焦。第一张最清晰,得分最高,第二三张越来越模糊,得分依次降低。
Laplacian 梯度方法:
Laplacian 梯度是另一种求图像梯度的方法,在上例的 OpenCV 代码中直接替换 Sobel 算子即可。
cpp
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main ()
{
Mat imageSource = imread ("1.jpg");
Mat imageGrey;
cvtColor (imageSource, imageGrey, CV_RGB2GRAY);
Mat imageSobel;
Laplacian (imageGrey, imageSobel, CV_16U);
//Sobel (imageGrey, imageSobel, CV_16U, 1, 1);
// 图像的平均灰度
double meanValue = 0.0;
meanValue = mean (imageSobel)[0];
//double to string
stringstream meanValueStream;
string meanValueString;
meanValueStream << meanValue;
meanValueStream >> meanValueString;
meanValueString = "Articulation (Laplacian Method):" + meanValueString;
putText (imageSource, meanValueString, Point (20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar (255, 255, 25), 2);
imshow ("Articulation", imageSource);
waitKey ();
}
用同样的三张测试图片测试,结果一致,随着对焦模糊得分降低:
方差方法:
方差是概率论中用来考察一组离散数据和其期望(即数据的均值)之间的离散(偏离)成都的度量方法。方差较大,表示这一组数据之间的偏差就较大,组内的数据有的较大,有的较小,分布不均衡;方差较小,表示这一组数据之间的偏差较小,组内的数据之间分布平均,大小相近。
对焦清晰的图像相比对焦模糊的图像,它的数据之间的灰度差异应该更大,即它的方差应该较大,可以通过图像灰度数据的方差来衡量图像的清晰度,方差越大,表示清晰度越好。
cpp
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main ()
{
Mat imageSource = imread ("2.jpg");
Mat imageGrey;
cvtColor (imageSource, imageGrey, CV_RGB2GRAY);
Mat meanValueImage;
Mat meanStdValueImage;
// 求灰度图像的标准差
meanStdDev (imageGrey, meanValueImage, meanStdValueImage);
double meanValue = 0.0;
meanValue = meanStdValueImage.at<double>(0, 0);
//double to string
stringstream meanValueStream;
string meanValueString;
meanValueStream << meanValue*meanValue;
meanValueStream >> meanValueString;
meanValueString = "Articulation (Variance Method):" + meanValueString;
putText (imageSource, meanValueString, Point (20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar (255, 255, 25), 2);
imshow ("Articulation", imageSource);
waitKey ();
}
方差数值随着清晰度的降低逐渐降低:
在工业应用中,最清晰的对焦拍摄出来的图像不一定是最好的,有可能出现摩尔纹(水波纹)现象,一般需要在最清晰对焦位置附件做一个微调。
via:
-
相机自动对焦原理_音圈 自动聚焦
https://blog.csdn.net/skyloveyue/article/details/104009506 -
PDAF 原理简介
https://blog.csdn.net/qq_41897352/article/details/124118928 -
图像算法 --- 自动对焦 AF_af 算法
https://blog.csdn.net/jiangchaobing_2017/article/details/139506620 -
3A 算法 --- 自动对焦(AF)_自动对焦算法
https://blog.csdn.net/weixin_44690935/article/details/114933962 -
AF 自动对焦 CDAF PDAF
https://blog.csdn.net/zsl091125/article/details/88979016 -
自动对焦算法
https://blog.csdn.net/thisiszdy/article/details/108984491 -
反差检测自动对焦(CDAF)与相位检测自动对焦(PDAF)原理
https://blog.csdn.net/qq_42059060/article/details/129883402 -
图像清晰度的评价指标_图像清晰度评价指标-CSDN博客
https://blog.csdn.net/charlene_bo/article/details/72673490 -
对比 PDAF、CDAF 和 LAAF 自动对焦技术
https://blog.csdn.net/2401_83885036/article/details/141727881 -
自动对焦算法(OpenCV 实现)_opencv 自动对焦算法
https://blog.csdn.net/Isaac320/article/details/121905866_ -
OpenCV 图像清晰度评价(相机自动对焦)_opencv 模糊图像变清晰
https://blog.csdn.net/dcrmg/article/details/53543341