HDR 拍照模式的原理,实现及应用
转自:http://blog.csdn.net/fulinwsuafcie/article/details/9792189
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 驱动文件中有这样一个函数
1 BOOL OV5645MIPI_set_param_exposure_for_HDR(UINT16 para) 2 { 3 kal_uint32 totalGain = 0, exposureTime = 0; 4 OV5645MIPISENSORDB("[OV5645MIPI]enter OV5645MIPI_set_param_exposure_for_HDR function:\n "); 5 OV5645MIPISENSORDB("[OV5645MIPI]enter para=%d,manualAEStart%d\n",para,OV5645MIPISensor.manualAEStart); 6 if (0 == OV5645MIPISensor.manualAEStart) 7 { 8 OV5645MIPI_set_AE_mode(KAL_FALSE);//Manual AE enable 9 spin_lock(&ov5645mipi_drv_lock); 10 OV5645MIPISensor.manualAEStart = 1; 11 spin_unlock(&ov5645mipi_drv_lock); 12 } 13 totalGain = OV5645MIPISensor.currentAxDGain; 14 exposureTime = OV5645MIPISensor.currentExposureTime; 15 switch (para) 16 { 17 case AE_EV_COMP_20: //+2 EV 18 case AE_EV_COMP_10: // +1 EV 19 totalGain = totalGain<<1; 20 exposureTime = exposureTime<<1; 21 OV5645MIPISENSORDB("[4EC] HDR AE_EV_COMP_20\n"); 22 break; 23 case AE_EV_COMP_00: // +0 EV 24 OV5645MIPISENSORDB("[4EC] HDR AE_EV_COMP_00\n"); 25 break; 26 case AE_EV_COMP_n10: // -1 EV 27 case AE_EV_COMP_n20: // -2 EV 28 totalGain = totalGain >> 1; 29 exposureTime = exposureTime >> 1; 30 OV5645MIPISENSORDB("[4EC] HDR AE_EV_COMP_n20\n"); 31 break; 32 default: 33 break;//return FALSE; 34 } 35 totalGain = (totalGain > OV5645MIPI_MAX_AXD_GAIN) ? OV5645MIPI_MAX_AXD_GAIN : totalGain; 36 //exposureTime = (exposureTime > OV5645MIPI_MAX_EXPOSURE_TIME) ? OV5645MIPI_MAX_EXPOSURE_TIME : exposureTime; 37 OV5645MIPIWriteSensorGain(totalGain); 38 OV5645MIPIWriteShutter(exposureTime); 39 OV5645MIPISENSORDB("[OV5645MIPI]exit OV5645MIPI_set_param_exposure_for_HDR function:\n "); 40 return TRUE; 41 }
此函数会执行三次,分别跑了 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 拍摄技巧描述得很好,有需要的可以详细看下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了