camera HDR 拍照:
(High Dynamic Range Imaging)高动态范围成像
1. 什么是HDR?:
用来实现比普通数字图像技术更大曝光动态范围(即更大的明暗差别)的一组技术。
2. HDR原理:
相比普通的图像,可以提供更多的动态范围和图像细节,根据不同的曝光时间的LDR(Low-Dynamic Range)图像,利用每个曝光时间相对应最佳细节的LDR图像来合成最终HDR图像。
3. HDR目的:
正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度,现在一般的数码相机和手机中都实现这种拍照模式。
4.HDR适合场景:
比较适合在阴暗变化明显的场景下使用,这样能使明处的景物不致过曝,而使得暗处的景物不致欠曝。譬如逆光环境下拍人物,可以将人物和环境都能拍清晰。
或者说能将处在暗处的景物拍摄出来的细节表现得更加充分!
HDR具体实现方法:
其实现方法是通过设三组 ev 值来对当前拍摄的景物曝光,一张照片是使用当前测光从而算出来的正常情况下的ev值曝光,另外两张则分别使用其0.5倍的ev值和2倍的ev值进行曝光。最终对三张照片按某种算法进行合成,暗处的景物使用2倍ev曝光的局部照片,而亮处的物体则使用0.5倍ev曝光的局部照片。这样就能使得整个照片的场景都不致于太亮或太暗。
HDR代码实现:
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倍的关系。