HDR 拍照模式的原理,实现及应用

HDR 拍照:

(High Dynamic Range Imaging)高动态范围成像,是用来实现比普通数字图像技术更大曝光动态范围(即更大的明暗区别)的一组技术。

高动态范围成像的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度。如今一般的数码相机和手机中都实现这样的拍照模式。

适合场景:

比較适合在阴暗变化明显的场景下使用,这样能使明处的景物不致过曝,而使得暗处的景物不致欠曝。譬如逆光环境下拍人物,能够将人物和环境都能拍清晰。

或者说能将处在暗处的景物拍摄出来的细节表现得更加充分!

以下来看几组照片:

图1

如上图1中所看到的,开启 HDR 后,暗处的树和墙壁都获得正确的曝光,都能看得清楚。

图2

图3

如上图3中开启了 HDR, 左上角及楼道里的场景能拍得更亮一些。图片均来自网络!

详细实现方法:

事实上现方法是通过设三组 ev 值来对当前拍摄的景物曝光,一张照片是使用当前測光从而算出来的正常情况下的ev值曝光,另外两张则分别使用其0.5倍的ev值和2倍的ev值进行曝光。终于对三张照片按某种算法进行合成,暗处的景物使用2倍ev曝光的局部照片,而亮处的物体则使用0.5倍ev曝光的局部照片。这样就能使得整个照片的场景都不致于太亮或太暗。

代码实现:

在 xxx\ALPS.JB3.TDD.MP.V2_TD_xxx\mediatek\custom\common\kernel\imgsensor\ov5645_mipi_yuv\ov5645mipiyuv_Sensor.c 驱动文件里有这样一个函数

BOOL OV5645MIPI_set_param_exposure_for_HDR(UINT16 para)
{
    kal_uint32 totalGain = 0, exposureTime = 0;
	OV5645MIPISENSORDB("[OV5645MIPI]enter OV5645MIPI_set_param_exposure_for_HDR function:\n ");
	OV5645MIPISENSORDB("[OV5645MIPI]enter para=%d,manualAEStart%d\n",para,OV5645MIPISensor.manualAEStart);
    if (0 == OV5645MIPISensor.manualAEStart)
    {
        OV5645MIPI_set_AE_mode(KAL_FALSE);//Manual AE enable
        spin_lock(&ov5645mipi_drv_lock);
        OV5645MIPISensor.manualAEStart = 1;
		spin_unlock(&ov5645mipi_drv_lock);
    }
	totalGain = OV5645MIPISensor.currentAxDGain;
    exposureTime = OV5645MIPISensor.currentExposureTime;
	switch (para)
	{
	   case AE_EV_COMP_20:	//+2 EV
       case AE_EV_COMP_10:	// +1 EV
		   totalGain = totalGain<<1;
           exposureTime = exposureTime<<1;
           OV5645MIPISENSORDB("[4EC] HDR AE_EV_COMP_20\n");
		 break;
	   case AE_EV_COMP_00:	// +0 EV
           OV5645MIPISENSORDB("[4EC] HDR AE_EV_COMP_00\n");
		 break;
	   case AE_EV_COMP_n10:  // -1 EV
	   case AE_EV_COMP_n20:  // -2 EV
		   totalGain = totalGain >> 1;
           exposureTime = exposureTime >> 1;
           OV5645MIPISENSORDB("[4EC] HDR AE_EV_COMP_n20\n");
		 break;
	   default:
		 break;//return FALSE;
	}
	totalGain = (totalGain > OV5645MIPI_MAX_AXD_GAIN) ? OV5645MIPI_MAX_AXD_GAIN : totalGain;
    //exposureTime = (exposureTime > OV5645MIPI_MAX_EXPOSURE_TIME) ? OV5645MIPI_MAX_EXPOSURE_TIME : exposureTime;
    OV5645MIPIWriteSensorGain(totalGain);
	OV5645MIPIWriteShutter(exposureTime);
	OV5645MIPISENSORDB("[OV5645MIPI]exit OV5645MIPI_set_param_exposure_for_HDR function:\n ");
	return TRUE;
}

此函数会运行三次,分别跑了 AE_EV_COMP_00, AE_EV_COMP_20, AE_EV_COMP_n20 这三个 case, 这三个 case 中分别以三组 totalGain 和 exposureTime 值来进行曝光的。

能够看到这三组值所呈现的0.5,1,2倍的关系。

參考文档:

http://bbs.fengbao.com/thread-236103-1-1.html

注:此篇文章中将 HDR 拍摄技巧描写叙述得非常好,有须要的能够具体看下

时间: 2024-10-11 16:55:42

HDR 拍照模式的原理,实现及应用的相关文章

HDR拍照

HDR 拍照:        (High Dynamic Range Imaging)高动态范围成像,是用来实现比普通数字图像技术更大曝光动态范围(即更大的明暗差别)的一组技术.高动态范围成像的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度.现在一般的数码相机和手机中都实现这种拍照模式. 适合场景:        比较适合在阴暗变化明显的场景下使用,这样能使明处的景物不致过曝,而使得暗处的景物不致欠曝.譬如逆光环境下拍人物,可以将人物和环境都能拍清晰.或者说能将处在暗处的

java多线程模式ThreadLocal原理简述及其使用详解

原创整理不易,转载请注明出处:java多线程模式ThreadLocal原理简述及其使用详解 代码下载地址:http://www.zuidaima.com/share/1781557457128448.htm ThreadLocal是为了使每个线程保存一份属于自己的数据. 先看一个使用ThreadLocal的实例. package com.zuidaima.aop.framework; import com.zuidaima.core.NamedThreadLocal; public abstra

MVC模式的原理

说说MVC模式的原理,Android SDK 中有哪些组件使用到了MVC模式,其基本原理是什么?[国内某著名软件外包公司 2010 年面试题] 答案:MVC 的基本原理就是通过Controller 连接View 和Model.也就是说,当View 中显示的数据变化时(如ListView要删除某个列表项),会通知Controller,而不是直接通知Model.这时Controller接到View的通知后,会在Model 中采取相应的动作(如删除数据库中的某条记录).如果模型的数据发生变化(如插入.

深入理解【代理模式】原理与技术

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问. 23种常用的面向对象软件的设计模式之一. 代理模式分为静态代理.动态代理. 如何理解代理模式? 思考抽象问题最好的办法就是具体化! 比如我们需要为一个业务方法在执行前后记录日志,为了达到解耦的目的,我们可以再新建一个类并定义一个新的业务方法,该方法既可以调用原业务方法,又可以在调用前后进行日志处理,例如: CarProxy.class public void move() { System.out.println("日志开始记录..

分组密码_计数器(CTR)模式_原理及java实现

一.原理: CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码,在CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流.最终的密文分组是通过将计数器加密得到的比特序列与明文分组进行XOR而得到的. 二.原理图: 三.CRT模式的优点: 1.硬件效率高,同三种链接模式相比,CTR能够并行加密和解密. 2.软件效率高,可以充分利用其并行特性进行并行计算 3.由于加密解密过程不依赖明文和密文,因此可以做预处理以提高效率 4.可以随机访问某一明文或者密文分组

突破Java面试-Redis集群模式的原理

1 面试题 Redis集群模式的工作原理说一下?在集群模式下,key是如何寻址的?寻址都有哪些算法?了解一致性hash吗? 2 考点分析 Redis不断在发展-Redis cluster集群模式,可以做到在多台机器上,部署多个实例,每个实例存储一部分的数据,同时每个实例可以带上Redis从实例,自动确保说,如果Redis主实例挂了,会自动切换到redis从实例顶上来. 现在新版本,大家都是用Redis cluster的,也就是原生支持的集群模式,那么面试官肯定会就redis cluster对你来

TreadLocal模式的原理

在JDK的早期版本中,提供了一种解决多线程并发问题的方案:java.lang.ThreadLocal类.ThreadLocal类在维护变量时,实际使用了当前线程(Thread)中的一个叫做ThreadLocalMap的独立副本,每个线程可以独立修改属于自己的副本而不会互相影响,从而隔离了线程和线程,避免了线程访问实例变量发生冲突的问题. ThreadLocal本身并不是一个线程,而是通过操作当前线程中的一个内部变量来达到与其他线程隔离的目的.之所以取名为ThreadLocal,所期望表达的含义是

请描述LVS的nat模式的原理

LVS-NAT:地址转换===收费站模式 virtual servervia network address translation(VS/NAT) LVS的nat模式类似于DNAT,但支持多目标转发.通过修改请求报文的目标地址为根据调度算法所挑选出的某RS的RIP来进行转发: 架构特性: (1)RS应该使用私有地址,即RIP应该为私有地址:各RS的网关必须指向DIP: (2)请求和响应报文都经由director转发:高负载场景中,dircetor可能成为瓶颈: (3)支持端口映射: (4)RS

EXC_BAD_ACCESS的本质详解以及僵尸模式调试原理

有时候,你会遇到由EXC_BAD_ACCESS造成的崩溃. 这篇文章会告诉你什么是EXC_BAD_ACCESS,以及它产生的原因.我还会提供一些EXC_BAD_ACCESS错误的解决方案. 1. 什么是 EXC_BAD_ACCESS? 一旦你理解EXC_BAD_ACCESS的本质,你就会更好地理解这个模糊的名词.这里有一个极为简单的解释,也有一个技术层面的解释.我们首先从简单的解释开始说起. 2. 简单的解释 不管什么时候当你遇到EXC_BAD_ACCESS这个错误,那就意味着你向一个已经释放的