AE(自动曝光)系统简介

AE系统简介

1. 简介

  现代成像系统已经很普及了,不仅有给人看的各类相机、手机、行车记录仪,还有用于机器视觉的各类摄像头。在这些成像系统中,一般都有AE功能(自动曝光),它直接关系到画面的亮度和图像质量,是成像的基础。这里对AE系统进行一个简单介绍,相机中的具体实现可能有所区别。

2.APEX系统

  提到曝光,不得不提APEX(The Additive System of Photographic Exposure),它是由美国国家标准机构(ASA)为了方便计算胶片机的曝光参数,提出的一个经验公式,也称为曝光方程。下面将会对该方程的推导做简单介绍。
  在拍摄平均亮度为 Ls L s 的场景时,满足如下方程的曝光参数,认为可以得到一个亮度合适的照片:
  

F2t=LsSK(2.1) (2.1) F 2 t = L s S K

其中, t t 表示曝光时间,F表示光圈值(即常说的F-number), Ls L s 表示环境光平均亮度, S S 表示是相机感度。K是任意常数,一般由相机厂商决定,它和相机厂商所认为的正确曝光有关,现在一般将 K K 取值为12.5。在(2.1)式两边同时取对数,有
log2(F2)+log2(1t)=log2(SN)+log2(LsKN)(2.2) (2.2) l o g 2 ( F 2 ) + l o g 2 ( 1 t ) = l o g 2 ( S ∗ N ) + l o g 2 ( L s K ∗ N )

其中, N N 为一个常数,近似为0.3。将(2.1)取对数后,乘性方程变成了加性方程 (2.2) ( 2.2 ) ,方便了AE算法的计算和计算量的减少。将 Av=log2(F2) A v = l o g 2 ( F 2 ) Tv=log2(1t T v = l o g 2 ( 1 t Sv=log2(SN) S v = l o g 2 ( S ∗ N ) Bv=log2(LsKN B v = l o g 2 ( L s K ∗ N ) 代入 (2.2) ( 2.2 ) ,可以得到APEX变量表示的曝光方程:
Av+Tv=Sv+Bv(2.3) (2.3) A v + T v = S v + B v

从直观意义上理解这几个变量:

  1. Av A v 表示光圈大小,其值每增1加个单位,表示进光量减少一半。
  2. Tv T v 表示快门快慢,其值每增1加个单位,表示进光量减少一半。
  3. Sv S v 表示相机感度,其值每增1加个单位,表示相机对同样进光量的敏感度增加一倍,体现在照片上就是亮度增加一倍。
  4. Bv B v 表示环境光的平均亮度,其每增加1个单位,表示环境光平均亮度增加一倍。

从直观上理解 (2.3) ( 2.3 ) 式:当等式右边增加时,表示相机敏感度或环境光增加,为了保持照片同样亮度,需要减少进光量,即减少等式左边的和。同理,当相机敏感度或环境光减少时,需要增加进光量,即增加左边的和。因此,在测出环境光亮度 Bv B v 时,根据等式 (2.3) ( 2.3 ) 可以计算出合适的曝光参数光圈、快门、ISO组合(当然这里有很多组合可以满足等式 (2.3) ( 2.3 ) ,具体选择方法会在文章第4部分进行简介)。
  以上就是APEX系统的曝光方程,下面将会简单介绍相机的测光系统,以计算合适的相机曝光参数。
注:不要将这里的 Av A v Tv T v 与相机上的 Av A v Tv T v 混淆,相机上的这个两个档位分别表示的是曝光模式为光圈优先和快门优先模式。

3.测光系统

  在相机AE系统中, (2.3) ( 2.3 ) 左右两边的和称为 Ev E v 值,即:

Ev=Av+Tv=Sv+Bv(3.1) (3.1) E v = A v + T v = S v + B v

根据 (3.1) ( 3.1 ) 式,当我们测出 Bv B v 值时,即可获得满足曝光方程的参数组合。决定这个 Bv B v 值的过程,我们称之为测光。现代相机测光系统一般分为两个部分:标定和测光。标定是在开发阶段为相机标定一个测光表,其步骤为:


  1. 将相机对着灯箱,调节灯箱的亮度为 Ls L s ,计算出对应的 Bv B v 值。
  2. 调节相机曝光参数 (Av,Tv,Sv) ( A v , T v , S v ) ,使得照片亮度适合人眼。同时,根据ISP给出的统计值,计算出一个加权平均值(计算方式包括点测光模式、中央重点测光、全局平均测光等),即为的 AEtarget A E t a r g e t
    3.重复步骤1,2,不断改变灯箱的亮度 Ls L s ,可以产生很多的 (Bv_i>(Av_i,Tv_i,Sv_i,AEtarget_i)) ( B v _ i − > ( A v _ i , T v _ i , S v _ i , A E t a r g e t _ i ) ) 对,这些 (Bv_i) ( B v _ i ) -曝光参数- AEtarget_i A E t a r g e t _ i 对称为测光表。

测光,是相机在使用时,计算环境光亮度(即计算 Bv B v ),步骤如下:


  1. 给定相机一组初始曝光参数 (Av_0,Tv_0,Sv_0) ( A v _ 0 , T v _ 0 , S v _ 0 ) ,根据ISP的统计值获得加权平均值 M_0 M _ 0 ,可得参数对 (Av_0,Tv_0,Sv_0,M_0) ( A v _ 0 , T v _ 0 , S v _ 0 , M _ 0 )
  2. 根据步骤1中曝光参数,在测光表中选择与之最近的一组参数 (Bv_i>(Av_i,Tv_i,Sv_i,AEtarget_i)) ( B v _ i − > ( A v _ i , T v _ i , S v _ i , A E t a r g e t _ i ) ) 。根据 (Av_0,Tv_0,Sv_0) ( A v _ 0 , T v _ 0 , S v _ 0 ) (Av_i,Tv_i,Sv_i) ( A v _ i , T v _ i , S v _ i ) 差的档数 δ δ ,调节 M_0 M _ 0 M_0=M_0+δ M _ 0 ′ = M _ 0 + δ 。(例如,当 Av_0Av_i=1 A v _ 0 − A v _ i = 1 而其他参数一样时, M_0=M_0+1 M _ 0 ′ = M _ 0 + 1 )。
  3. 实际获得的测光值为 Bv=Bv_i+log2(M_0AEtarget_i) B v = B v _ i + l o g 2 ( M _ 0 ′ A E t a r g e t _ i )

通过上面的测光,即可获得当前环境光的强度 Bv B v
注:这一部分找到的资料甚少,上面不少过程都是猜测所得,具体实现可能不一样。

4.曝光表

  根据 (3.1) ( 3.1 ) 式,当测出 Bv B v 并选定 Sv S v 时,可以确定 Ev E v 。从前面的描述可知,在获得 Bv B v 后,有很多组曝光参数 (Av,Tv,Sv) ( A v , T v , S v ) 可以满足方程 (3.1) ( 3.1 ) 。本节将要介绍的曝光表,就是从众多组曝光参数中选择比较合适的曝光参数组合。曝光表也称为曝光线图,如图1所示。
程序自动曝光表

图1 程序自动曝光线图 [2] [ 2 ]

图1中的曝光线图分为曝光方程部分和程序线部分,他们分别用来确定 ISO/EV I S O / E V Av/Tv A v / T v (即光圈/快门)。

4.1 曝光方程部分

  图1的左上部分,是一个二维坐标系,其中横坐标为 Bv B v 值,纵坐标为 Ev E v 值。由 (3.1) ( 3.1 ) 可知,
  

Ev=Sv+Bv(4.1) (4.1) E v = S v + B v

Sv S v (即ISO)固定时, Ev E v Bv B v 在该坐标系中是斜率为1,截距为 Sv S v 的直线,即为图1中左上部分的红色直线。当我们测出 Bv B v ,选定 Sv S v (ISO)(一般倾向选低ISO,以减少图像中的噪声),即可确定 Ev E v 值。

4.2程序线图部分

  图1右下角的红色线是相机设计的曝光程序线,三条红色线对应的最大光圈值是不一样的(zoom镜头在不同焦段的最大光圈是不一样的),线上对应的横坐标是快门值,纵坐标是光圈值,线上每个点都对应不同的 Ev E v 值。 Ev E v 值刚好可以和4.1中的 Bv B v Sv S v 对应起来,从而确定快门和光圈值。
  程序线图可以有很多种设计方式,这取决与各家相机厂商的做法。这里给出佳能设计线图的三个原则:


  1. Ev E v 值变化时,在快门和光圈值允许范围内,尽量以同等增量去改变光圈和快门,即保持快门和光圈组成的直线的斜率为1。
  2. 在光圈不可避免的达到最大或者最小值时,直线会变成水平线(即光圈保持最大或最小值,只改变快门的值)。
  3. Ev E v 值相同时,长焦对应的快门应该越快(为了防止相机抖动带来的画面模块)。

  曝光方程和程序线图构成了相机的曝光表,在AE系统工作时,可以给出合适的曝光参数。

5.AE流程

  上面的第3章和第4章只是描述了一个理想的AE工作方式,即认为测光是完全准确的,通过一次曝光参数调整即可获得亮度理想的照片。其实,这往往是不现实的,测光系统获得的 Bv B v 值并不一定准确,所以需要多次迭代解决。记得在第3章标定测光表时,给每个 Bv_i B v _ i 记录了一个 AEtarget_i A E t a r g e t _ i ,这个实际上就是用来判断AE是否收敛的目标值。假设调整完曝光参数后,根据ISP统计值获得的均值为 M_i M _ i ,可以根据 log2(M_iAEtarget_i) l o g 2 ( M _ i A E t a r g e t _ i ) 的值来调高或者调低AE参数。如果当前 Bv_i B v _ i 下无法收敛,可以重新计算 Bv B v ,再进行迭代计算。
  下面是一个简单的AE流程图(相机中的具体实现可能不完全一致):

Created with Raphaël 2.1.2 环境光 相机模组 ISP统计值,M 获得Bv值和AEtarget abs(M-AETarget)<delta? 输出曝光参数 选定ISO,查表得Shutter和Aperture yes no

参考文献

  1. Douglas A. Kerr. 2007. APEX-The Additive System of Photographic Exposure.
  2. Douglas A. Kerr. 2005. Programmed Automatic Exposure
    in Canon EOS Digital Cameras
  • 35
    点赞
  • 228
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在安卓设备上固定摄像头的帧率,你可以使用 Camera2 API 来控制摄像头的参数。具体来说,你可以使用 CaptureRequest.Builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range) 方法来设置摄像头的帧率范围,然后使用 CameraCaptureSession.setRepeatingRequest(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler) 方法来启动摄像头捕获。在这个方法中,传入的 CaptureRequest 对象应该包含你设置的帧率范围以及其他的摄像头参数。 下面是一个简单的示例代码,演示如何使用 Camera2 API 来设置摄像头的帧率范围: ``` // 创建 CameraCaptureSession.CaptureCallback 对象,用于处理摄像头捕获的结果 CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { // 处理捕获结果 } }; // 获取 CameraManager 对象,用于管理摄像头设备 CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); // 获取可用的摄像头列表,选择一个摄像头进行操作 String cameraId = cameraManager.getCameraIdList()[0]; // 打开摄像头设备,获取 CameraDevice 对象 cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { try { // 创建 CaptureRequest.Builder 对象,设置摄像头参数 CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range(30, 30)); // 设置帧率范围为 30 fps // 创建 CameraCaptureSession 对象,启动摄像头捕获 camera.createCaptureSession(Collections.singletonList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { try { session.setRepeatingRequest(builder.build(), captureCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { // 处理配置失败 } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onDisconnected(@NonNull CameraDevice camera) { // 处理摄像头断开连接 } @Override public void onError(@NonNull CameraDevice camera, int error) { // 处理摄像头错误 } }, null); ``` 这个示例代码中,我们首先获取 CameraManager 对象,然后选择第一个可用的摄像头,打开它并获取 CameraDevice 对象。接着,我们创建一个 CaptureRequest.Builder 对象,设置帧率范围为 30 fps,然后创建 CameraCaptureSession 对象并启动摄像头捕获。在 CameraCaptureSession.setRepeatingRequest() 方法中,我们传入了我们创建的 CaptureRequest 对象以及一个 CaptureCallback 对象,用于处理摄像头捕获的结果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值