0.参考资料
[1]AEC10 SA计算整理 — 基础SA
[2]AEC10 SA计算整理 — ADRCCapSA & AuxRoleFrameSA & AFBrktFrameSA
[3]AEC10 SA计算整理 — QLL相关
[4]AEC10 SA计算整理 — ExtremeColorSA & SaliencySA
[5]AEC10 SA计算整理 — Depth & Tracker
[6]AEC10 SA计算整理 — Agg相关
[7]AEC10 SA计算整理 — SatPrev & DarkPrev
[8]AEC10 SA计算整理 — YHistSA & BrightenImgSA
[9]AEC10 SA计算整理 — Touch & Face
[10]AEC10 SA计算整理 — 3HDR相关
[11]AEC10 SA计算整理 — flash部分
1.各个变量作用
1.1 LuxSA
LuxSALuma=AvgLumaBE16x16 LuxSATarget=[setparam/tr:lux+lux] LuxSAAdjRatio=LuxSATarget/LuxSALuma- LuxSALuma: 计算16x16区域的平均亮度(Luma值)。
- LuxSATarget: 通过参数设置获取目标亮度值(通常与当前光线条件相关)。
- LuxSAAdjRatio: 计算调整比例,即目标亮度与当前亮度的比值。
1.2. FrameSA
FrameSALuma=FrameLumaBE16x16 FrameSATarget=[setparam/tr:lux+lux] FrameSAAdjRatio=FrameSATarget/FrameSALumaFrameSALuma: 计算整帧的平均亮度(Luma值)。
FrameSATarget: 与LuxSATarget相同,或根据具体需求调整。
FrameSAAdjRatio: 计算调整比例。
1.3 EVFrameSA
EVFrameSALuma=NormalizedWeightedSum(FrameLumaBE16x16,FaceROILuma,TouchROILuma) EVFrameSATarget=[setparam/tr:lux+lux] EVFrameSAAdjRatio=EVFrameSATarget/EVFrameSALumaEVFrameSALuma: 使用加权和计算包括面部区域和触摸区域在内的亮度值。
EVFrameSATarget: 类 似FrameSATarget,但可能考虑更多因素。
EVFrameSAAdjRatio: 计算调整比例。
1.4 SimpLuxSA
SimpleLuxSA_Luma=AvgLumaBE16x16 SimpleLuxSA_Target=[setparam/tr:lux+lux] SimpleLuxSA_AdjRatio=SimpleLuxSA_Target/SimpleLuxSA_Luma- SimpleLuxSA_Luma: 与LuxSALuma相同。
- SimpleLuxSA_Target: 类似LuxSATarget。
- SimpleLuxSA_AdjRatio: 计算调整比例。
1.5 IlluminanceSA
IlluminanceSATarget=FrameSATarget IlluminanceSALuma=TriggerCtrlShortExp*[setparam/tr:lux+TriggerCtrlInputIlluminance]/1000000 IlluminanceSAAdjRatioFSATgt=IlluminanceSATarget/(IlluminanceSALuma*FrameSAAdjRatio) IlluminanceSAAdjRatio.Start=0 IlluminanceSAAdjRatio.End=IlluminanceSAAdjRatioFSATgt*[setparam/tr:lux+IlluminanceSAAdjRatioFSATgt]*FrameSAAdjRatio- IlluminanceSATarget: 与FrameSATarget相同。
- IlluminanceSALuma: 结合短曝光时间和输入照度计算当前照度下的亮度。
- IlluminanceSAAdjRatioFSATgt: 计算最终调整比例,考虑FrameSA的调整比例。
- IlluminanceSAAdjRatio.Start/End: 初始化及结束调整比例(这里似乎有误,通常不需要动态调整这两个值,除非有特殊逻辑)。
1.6 QLLShortFrameSA
QLLShortFrameSatAdjRatio=[setparam/tr:lux+lux]/QLLShortFrameSatPctlLuma QLLShortFrameSelAdjRatio=[setparam/tr:lux+lux]/QLLShortFrameHighPctlLuma QLLShortFrameSelAdjRatio=Smallest(QLLShortFrameSatAdjRatio,QLLShortFrameSelAdjRatio,1) QLLShortFrameExp=QLLShortFrameSelAdjRatio*TriggerCtrlShortExp QLLShortFrameSelAdjRatio=QLLShortFrameSelAdjRatio1.7 QLLLongFrameShortSA
QLLLongFrameDarkAdjRatio=[setparam/tr:lux+lux]/[set param/tr:lux+QLLLongFrameDarkPctlLuma] QLLLongFrameSelAdjRatio=[setparam/tr:lux+lux]/[set param/tr:lux+QLLLongFrameLowPctlLuma] QLLLongFrameSatPrevAdjRatio=[setparam/tr:lux+lux]/QLLLongFrameSatPctlLuma QLLLongFrameSelAdjRatio=Largest(QLLLongFrameDarkAdjRatio,QLLLongFrameSelAdjRatio,1) QLLLongFrameSatPrevAdjRatio=Min(QLLLongFrameSelAdjRatio,QLLLongFrameSatPrevAdjRatio) QLLLongFrameShortExp=Max(QLLLongFrameSatPrevAdjRatioTriggerCtrlShortExp,TriggerCtrlLongExp) TriggerCtrlQLLDynamicRange=QLLLongFrameShortExpQLLShortFrameExp QLLMaxUnderExposure=QLLLongFrameShortExp/TriggerCtrlSafeExp TriggerCtrlQLLUnderExposure=Smallest(TriggerCtrlQLLUnderExposure,QLLMaxUnderExposure,TriggerCtrlQLLDynamicRange,256) QLLLongShortSensorExpRatio=TriggerCtrlQLLDynamicRange/TriggerCtrlQLLUnderExposure QLLLongFrameShortExposure=QLLShortFrameExp*[setparam/tr:lux+QLLLongShortSensorExpRange] QLLLongFrameShortAdjRatio=QLLLongFrameSHortExposure/TriggerCtrlShortExp1.8 QLLLongFrameSafeSA
QLLADRC=(QLLLongFrameShortExposure/QLLShortFrameExp)QLLADRCAdditional QLLADRCAdditional=Min(1,TriggerCtrlQLLUnderExposure) QLLLongFrameSafeExposure=QLLLongFrameShortExposureQLLADRC QLLLongFrameSafeAdjRatio=QLLLongFrameSafeExposure*TriggerCtrlShortExp1.9 QLLLongFrameLongSA
QLLDarkBoost=TriggerCtrlQLLUnderExposureQLLADRCAdditional QLLLongFrameLongExposure=QLLLongFrameSafeExposureQLLDarkBoost QLLLongFrameLongAdjRatio=QLLLongFrameLongExposure*TriggerCtrlShortExp1.10 ADRCCapSA
TriggerCtrlADRCCap=Min(TriggerCtrlADRCCap,ADRCFlickerCap,ADRCExposureCountCap) TriggerCtrlADRCCap=(FaceSAConfidence<0.000100)?[setparam/tr:TriggerCtrlGyro+lux]:[set param/tr:TriggerCtrlGyro+lux] ADRCFlickerCap=(TriggerCtrlIsFlickerDetected<0.001)?TriggerCtrlADRCCap:[setparam/tr:lux+lux] ADRCExposureCountCap=[setparam/tr:lux+TriggerCtrlExposureCount]在计算 TriggerCtrlADRCCap 时,需要综合考虑多个限制条件,包括闪烁检测、曝光次数限制等。优化后的公式如下:
- 触发控制自动动态范围压缩(ADRC)的能力值计算:
TriggerCtrlADRCCap = Min(
TriggerCtrlADRCCap, # 初始或预设值
ADRCFlickerCap, # 基于闪烁检测的限制
ADRCExposureCountCap # 基于曝光次数的限制
)
- 触发控制自动动态范围压缩(ADRC)的能力值计算:
- 如果人脸检测置信度极低,则可能使用不同的计算方式(但原公式似乎有误,未明确展示不同计算)
- 假设这里是一个占位符,实际应用中可能需要替换为具体的逻辑
- TriggerCtrlADRCCap = (FaceSAConfidence < 0.0001) ? 特定计算方式 : TriggerCtrlADRCCap_base
- 闪烁检测限制
ADRCFlickerCap = (TriggerCtrlIsFlickerDetected < 0.001) ? TriggerCtrlADRCCap : 更高值 # 假设’更高值’为2*lux,但具体值需根据上下文确定
- 闪烁检测限制
- 曝光次数限制
ADRCExposureCountCap = lux + TriggerCtrlExposureCount
- 曝光次数限制
1.11 AuxRoleFrameSA
AuxRoleFrameSALuma=FrameLumaBE16x16 AuxRoleFrameSATarget=[setparam/tr:lux+lux] AuxRoleFrameSAAdjRatio=AuxRoleFrameSATarget/AuxRoleFrameSALuma辅助角色帧的亮度调整
AuxRoleFrameSALuma = FrameLumaBE16x16 # 当前帧的亮度(16x16块)
AuxRoleFrameSATarget = lux + lux # 目标亮度值,这里假设是双倍当前亮度环境值(需根据实际情况调整)
AuxRoleFrameSAAdjRatio = AuxRoleFrameSATarget / AuxRoleFrameSALuma # 亮度调整比例
1.12 AFBrktFrameSA
AFBrktCDF10Flag=(AFBrktCDF10Pctl>0.2)?1:0 AFBrktCDF110Flag=(AFBrktCDF110Pctl>0.8)?0:1 AFBrktCDF145Flag=(AFBrktCDF145Pctl>0.9)?1:0 AFBrktMTFFlag=AFBrktCDF10Flag*AFBrktCDF110Flag*AFBrktCDF145Flag AFBrktFlatFlag=AFBrktCDF10Flag*AFBrktCDF110Flag*AFBrktCDF145Flag AFBrktFileScanFlag=AFBrktCDF10Flag*AFBrktCDF110Flag*AFBrktCDF145Flag 相同的方法计算剩下三组,而且值也相同 AFBrktCDF10Flag=(AFBrktCDF10Pctl>1)?1:0 AFBrktCDF110Flag=(AFBrktCDF110Pctl>0)?0:1 AFBrktCDF145Flag=(AFBrktCDF145Pctl>1)?1:0 AFBrktMultiDepthFlag=AFBrktCDF10Flag*AFBrktCDF110Flag*AFBrktCDF145Flag自动对焦(AF)的曝光评估逻辑,这里存在重复和可能的错误,我们进行修正和统一:
自动对焦的曝光评估标志计算
注意:原公式中存在逻辑错误(如阈值设置不合理),这里进行了修正
AFBrktCDF10Flag = (AFBrktCDF10Pctl > 0.2) ? 1 : 0
AFBrktCDF110Flag = (AFBrktCDF110Pctl > 0.8) ? 0 : 1 # 注意这里通常检查是否小于阈值
AFBrktCDF145Flag = (AFBrktCDF145Pctl > 0.9) ? 1 : 0使用上述标志进行进一步计算
AFBrktMTFFlag = AFBrktCDF10Flag * AFBrktCDF110Flag * AFBrktCDF145Flag
AFBrktFlatFlag = AFBrktMTFFlag # 假设FlatFlag与MTFFlag相同,除非有特定逻辑区分
AFBrktFileScanFlag = AFBrktMTFFlag # 同样,假设FileScanFlag与MTFFlag相同注意:下面的重复计算部分已被移除,因为值相同且逻辑重复
如果确实需要基于不同阈值的类似计算,请确保阈值和逻辑的正确性
AFBrktCDF10Flag, AFBrktCDF110Flag, AFBrktCDF145Flag 重新计算部分已移除
MultiDepthFlag可能基于相同的逻辑,但通常用于不同的场景或处理
AFBrktMultiDepthFlag = AFBrktCDF10Flag * AFBrktCDF110Flag * AFBrktCDF145Flag
1.13 SaliencySA
SaliencySALuma=NormalizedWeightedSum(SaliencyLuma,FrameLumaBE16x16) SaliencySATarget=[setparam/tr:lux] SaliencySALumaWeight=[setparam/tr:lux+TriggerCtrlSaliencyValue] SaliencySAFrameWeight=1-SaliencySALumaWeight SaliencySAAdjRatioSaliency=SaliencySATarget/SaliencySALuma SaliencySAAdjRatioHigh=[setparam/tr:lux]/SaliencyHighPCTLLuma SaliencySAAdjRatioLow=[setparam/tr:lux]/SaliencyLowPCTLLuma SaliencySAAdjRatioMin=Min(SaliencySAAdjRatioSaliency,1.0,[setparam/tr:lux+SaliencySAAdjRatioHigh]) SaliencySAAdjRatioMin=Max(SaliencySAAdjRatioSaliency*0.4,SaliencySAAdjRatioMin) SaliencySAAdjRatioMax=Max(SaliencySAAdjRatioSaliency,[setparam/tr:lux+SaliencySAAdjRatioLow]) SaliencySAAdjRatioMax=Min(SaliencySAAdjRatioSaliency*1.5,SaliencySAAdjRatioMax) SaliencySAAdjRatioSel=(SaliencySAAdjRatioMin*[setparam/tr:lux+SaliencySAAdjRatioSaliency])/(SaliencySAAdjRatioMax*[setparam/tr:lux+SaliencySAAdjRatioSaliency] SaliencySAAdjRatioFSATgt=(SaliencySAAdjRatioSel*FrameSALuma)/FrameSATarget SaliencySAAdjRatio=[setparam/tr:lux+SaliencySAAdjRatioFSATgt]*FrameSATarget/FrameSALumaSaliencySA 算法主要基于图像的显著性(Saliency)和亮度(Luma)来调整曝光参数,以达到最佳的视觉效果。以下是该算法的详细优化步骤:
计算显著性亮度权重
SaliencySALuma = NormalizedWeightedSum(SaliencyLuma, FrameLumaBE16x16)
SaliencySALumaWeight = setparam[‘tr:lux’] + TriggerCtrlSaliencyValue
SaliencySAFrameWeight = 1 - SaliencySALumaWeight
这里,SaliencyLuma 表示图像的显著性亮度图,FrameLumaBE16x16 是图像块的亮度信息。通过调整显著性亮度的权重,可以更好地控制曝光调整的方向。计算曝光调整比例
SaliencySATarget = setparam[‘tr:lux’]
SaliencySAAdjRatioSaliency = SaliencySATarget / SaliencySALuma
SaliencySAAdjRatioHigh = setparam[‘tr:lux’] / SaliencyHighPCTLLuma
SaliencySAAdjRatioLow = setparam[‘tr:lux’] / SaliencyLowPCTLLuma
SaliencySAAdjRatioMin = min(SaliencySAAdjRatioSaliency, 1.0, setparam[‘tr:lux’] + SaliencySAAdjRatioHigh)
SaliencySAAdjRatioMin = max(SaliencySAAdjRatioSaliency * 0.4, SaliencySAAdjRatioMin)
SaliencySAAdjRatioMax = max(SaliencySAAdjRatioSaliency, setparam[‘tr:lux’] + SaliencySAAdjRatioLow)
SaliencySAAdjRatioMax = min(SaliencySAAdjRatioSaliency * 1.5, SaliencySAAdjRatioMax)
SaliencySAAdjRatioSel = (SaliencySAAdjRatioMin * (setparam[‘tr:lux’] + SaliencySAAdjRatioSaliency)) / (SaliencySAAdjRatioMax * (setparam[‘tr:lux’] + SaliencySAAdjRatioSaliency))
SaliencySAAdjRatioFSATgt = (SaliencySAAdjRatioSel * FrameSALuma) / FrameSATarget
SaliencySAAdjRatio = (setparam[‘tr:lux’] + SaliencySAAdjRatioFSATgt) * FrameSATarget / FrameSALuma
通过计算一系列调整比例,确保曝光调整既不过度也不过低,同时考虑了图像的高亮和低亮区域。
1.14 ExtremeColorSA
ExtremeColorSALuma=FrameSALuma ExtremeColorSATarget=ExtremeColorFinalTarget ExtremeColorGreemZoneSum=ExtremeGreenColorZone1Ratio+ExtremeGreenColorZone2Ratio+ExtremeGreenColorZone3Ratio ExtremeColorLargestRatio=Largest(ExtremeRedColorRatio,ExtremeColorGreemZoneSum,ExtremeBlueColorRatio,0.0) ExtremeColorRedTargetAdj=[setparam/tr:lux+ExtremeRedColorRatio] ExtremeColorGreenTargetAdj=[setparam/tr:lux+ExtremeColorGreenZoneSum] ExtremeColorBlueTargetAdj=[setparam/tr:lux+ExtremeColorBlueZoneSum] ExtremeColorSmallestTargetAdj=Smallest(ExtremeColorRedTargetAdj,ExtremeColorGreenTargetAdj,ExtremeColorBlueTargetAdj,1.0) ExtremeColorFinalTarget=FrameSATarget*ExtremeColorSmallestTargetAdj ExtremeColorSAAdjRatio=ExtremeColorSATarget/ExtremeColorSALumaExtremeColorSA 算法专注于通过调整颜色通道(红、绿、蓝)的曝光目标来改善图像的色彩表现。首先,计算了绿色区域的权重总和和最大的颜色区域比例。其次,基于各颜色区域的相对重要性,调整每个颜色通道的目标曝光值。最终,根据调整后的颜色目标和当前颜色亮度,计算出颜色曝光调整。
1.15 DepthSA
DepthSALuma=NormalizedWeightedSum(DepthLuma,FrameLumaBE16x16) DepthSATarget=[setparam/tr:lux+lux] DepthSADistanceStorage=(TriggerCtrlDistance>0.0)?TriggerCtrlDistance:DepthSADistanceStorage DepthSALumaWeight=[setparam/tr:lux+DepthSADistanceStorage] DepthSAFrameWeight=1.0-DepthSALumaWeight DepthSADepthLumaScale=DepthSALuma1000000/TriggerCtrlSafeExp DepthSADepthLumaStorage=(TriggerCtrlDistance>0)?DeptjSADepthLumaScale:DepthSADepthLumaStorage DepthSADepthLumaSelection=DepthSADepthLumaStorageTriggerCtrlSafeExp/1000000 DepthSAAdjRatioDepth=DepthSATarget/DepthSADepthLumaSelection DepthSAAdjRatioHigh=[setparam/tr:lux+lux]/DepthHighPCTLLuma DepthSAAdjRatioLow=[setparam/tr:lux+lux]/DepthLowPCTLLuma DepthSAAdjRatioMin=Max(DepthSAAdjRatioDepth0.5,Min(DepthSAAdjRatioDepth,[settparam/tr:lux+DepthSAAdjRatioHigh])) DepthSAAdjRatioMin=Min(DepthSAAdjRatioDepth1.4,Max(DepthSAAdjRatioDepth,[settparam/tr:lux+DepthSAAdjRatioLow])) DepthSAAdjRatioSel=DepthSAAdjRatioMin*[setparam/tr:lux+DepthSAAdjRatioDepth]+DepthSAAdjRatioMax*[setparam/tr:lux+DepthSAAdjRatioDepth] DepthSAAdjRatioFSATgt=DepthSAAdjRatioSel*FrameSALuma/FrameSATarget DepthSAAdjRatio=[setparam/tr:lux+DepthSAAdjRatioFSATgt]*FrameSATarget/FrameSALuma1.16 TrackerSA
TrackerSALuma=TrackerSALumaSelection TrackerSATarget=[setparam/tr:lux+lux] TrackerSALumaScale=TrickerROILuma1000000/TriggerCtrlSafeExp TrackerSALumaStorage=(TrackerROI==0)?0:TrackerSALumaStorage TrackerSALumaStorage=(TrackerROI>0)?TrackerSALumaStorage:TrackerSALumaStorage TrackerSALumaSelection=TrackerSALumaStorageTriggerCtrlSafeExp/1000000 TrackerSAWeightSelection=(TrackerROI==0)?0:TrackerSAWeightSelection AdjRatioTracker=TrackerSATarget/TrackerSALuma AdjRatioHighTracker[setparam/tr:lux+lux]/TrackerHighPCTLLuma AdjRatioLowTracker=[setparam/tr:lux+lux]/TrackerLowPCTLLuma CappedAdjRatioMinTracker=Min(AdjRatioTracker,[setparam/tr:lux+AdjRatioHighTracker]) CappedAdjRatioMinTracker=Max(AdjRatioTracker*[setparam/tr:lux+lux],CappedAdjRatioMinTracker) CappedAdjRatioMaxTracker=Max(AdjRatioTracker,[setparam/tr:lux+AdjRatioLowTracker]) CappedAdjRatioMaxTracker=Min(AdjRatioTracker*[setparam/tr:lux+lux],CappedAdjRatioMaxTracker) AdjRatioSelectionTracker=CappedAdjRatioMinTracker*[setparam/tr:lux+AdjRatioTracker]+CappedAdjRatioMaxTracker*[setparam/tr:lux+AdjRatioTracker] AdjRatioFSATgtTracker=AdjRatioSelectionTracker*FrameSALum/FrameSATarget AdjRatioTracker=[setparam/tr:lux+AdjRatioFSATgtTracker]*FrameSATarget/FrameSALuma1.17 SafeAggSA
SafeAggSATarget=MinWeightedAbsDiff(FrameSAAdjRatio,SatPrevSAAdjRatio,DarkPrevSAAdjRatio,BrightenImgSAAdjRatio,FaceSAAdjRatio,TouchSAAdjRatio,DepthSAAdjRatio,AdjRatioTacker,ExtremeColorSAAdjRatio,SaliencySAAdjRatio,IlluminanceSAAdjRatio) SafeAggSA3HDRSafeExp=SafeAggSATarget*TriggerCtrlShortExp EV0SafeAdjFactor=SafeAggSATarget/FrameSAAdjRatio SafeAggSAAdjRatio=SafeAggSATarget在SafeAggSA模块中,我们旨在通过最小化加权绝对差异来优化调整比例,以达到最佳的图像质量。具体计算如下:
SafeAggSATarget = MinWeightedAbsDiff(
FrameSAAdjRatio,
SatPrevSAAdjRatio,
DarkPrevSAAdjRatio,
BrightenImgSAAdjRatio,
FaceSAAdjRatio,
TouchSAAdjRatio,
DepthSAAdjRatio,
AdjRatioTacker,
ExtremeColorSAAdjRatio,
SaliencySAAdjRatio,
IlluminanceSAAdjRatio
)
计算HDR安全曝光下的调整因子
SafeAggSA3HDRSafeExp = SafeAggSATarget * TriggerCtrlShortExp计算EV0下的安全调整因子
EV0SafeAdjFactor = SafeAggSATarget / FrameSAAdjRatio最终确定SafeAggSA的调整比例
SafeAggSAAdjRatio = SafeAggSATarget
1.18 ShortAggSA
ShortAggSATarget=MinWeightedAbsDiff(SafeAggSAAdjRatio,ShortSatPrevSAAdjRatio) ShortAggSAAdjRatioShort=SafeAggSAAdjRatio/ShortAggSATarget ShortAggSAADRCGain=Min([setparam/tr:lux+ShortAggSAAdjRatioShort],TriggerCtrlADRCCap) TriggerCtrlEVNegativeOverride=[setparam/tr:lux+ShortAggSAAdjRatioShort] EV0ShortDRCGain=ShortAggSAADRCGain ShortAggSAAdjRatio=SafeAggSAAdjRatio/ShortAggSAADRCGainShortAggSA专注于短期内的调整优化,具体计算流程如下:
计算短期目标调整比例
ShortAggSATarget = MinWeightedAbsDiff(SafeAggSAAdjRatio, ShortSatPrevSAAdjRatio)计算短期调整比例(相对于目标)
ShortAggSAAdjRatioShort = SafeAggSAAdjRatio / ShortAggSATarget计算ADRC增益,并限制在最大值内
ShortAggSAADRCGain = Min([setparam/tr:lux + ShortAggSAAdjRatioShort], TriggerCtrlADRCCap)短期曝光负向调整覆盖
TriggerCtrlEVNegativeOverride = [setparam/tr:lux + ShortAggSAAdjRatioShort]EV0下的DRCGain
EV0ShortDRCGain = ShortAggSAADRCGain计算最终的短期调整比例
ShortAggSAAdjRatio = SafeAggSAAdjRatio / ShortAggSAADRCGain
1.19 LongAggSA
LongAggSATarget=MinWeightedAbsDiff(SafeAggSAAdjRatio,LongDarkPrevSAAdjRatio) LongAggSADRCGainRemainder=8/ShortAggSAADRCGain LongAggSAAdjRatioLong=LongAggSATarget/SafeAggAdjRatio LongAggSADarkBoostGain=[setparam/tr:lux+LongAggSAAdjRatioLong]/[setparam/tr:lux+LongAggSADRCGainRemainder] EV0LongDarkboostGain=LongAggSADarkBoostGain CompenDarkBoostGain=Min([setparam/tr:lux+LongAggSAAdjRatioLong],[setparam/tr:lux+LongAggSADRCGainRemainder] TriggerCtrlEVPositiveOverride=[setparam/tr:lux+LongAggSAAdjRatioLong] LongAggSAAdjRatio=ShortAggSAAdjRatio*LongAggSADarkBoostGainLongAggSA处理长期曝光调整,以优化暗部细节:
计算长期目标调整比例
LongAggSATarget = MinWeightedAbsDiff(SafeAggSAAdjRatio, LongDarkPrevSAAdjRatio)计算长期ADRC增益的剩余部分
LongAggSADRCGainRemainder = 8 / ShortAggSAADRCGain计算长期调整比例(相对于SafeAgg)
LongAggSAAdjRatioLong = LongAggSATarget / SafeAggSAAdjRatio # 注意:这里假设SafeAggSAAdjRatio为基准计算暗部增强增益
LongAggSADarkBoostGain = ([setparam/tr:lux + LongAggSAAdjRatioLong] / [setparam/tr:lux + LongAggSADRCGainRemainder])EV0下的暗部增强增益
EV0LongDarkboostGain = LongAggSADarkBoostGain补偿暗部增强增益(此处有遗漏的闭合括号)
CompenDarkBoostGain = Min([setparam/tr:lux + LongAggSAAdjRatioLong], [setparam/tr:lux + LongAggSADRCGainRemainder])长期曝光正向调整覆盖
TriggerCtrlEVPositiveOverride = [setparam/tr:lux + LongAggSAAdjRatioLong]计算最终的长期调整比例
LongAggSAAdjRatio = ShortAggSAAdjRatio * LongAggSADarkBoostGain
1.20 LLSSafeAggSA
SnapshotSafeAdj= TriggerCtrlSafeTgt / TriggerCtrlSafeExp1.21 LLSShortAggSA
SnapshotADRCGain= Min(TriggerCtrlSafeTgt / TriggerCtrlShortTgt, 16) SnapshotShortAdj= TriggerCtrlSafeTgt / (SnapshotADRCGain * TriggerCtrlShortExp)1.22 LLSLongAggSA
SnapshotDarkBoostGain= Min(1.0, TriggerCtrlLongTgt / TriggerCtrlSafeTgt) SnapshotLongAdj= TriggerCtrlSafeTgt * SnapshotDarkBoostGain / TriggerCtrlShortExp1.23 EVSafeAggSA
EVSafeAggSATarget=[setparam/tr:lux+EV0SafeAdjFactor]*EVFrameSAAdjRatio EVSafeAggSAAdjRatio=EVSafeAggSATarget1.24 EVShortAggSA
EVShortAggSATarget=RatioValue(EVSafeAggSAAdjRatio,[setparam/tr:lux+EV0ShortDRCGain]) EVShortAggSAAdjRatio=EVShortAggSATarget1.25 EVLongAggSA
EVLongAggSATarget=EVSafeAggSAAdjRatio*[setparam/tr:lux+EV0LongDarkboostGain] EVLongAggSAAdjRatio=EVLongAggSATarget1.26 HDRSnapshotSafeAggSA
SnapshotSafeAdj=TriggerCtrlSafeTgt/TriggerCtrlSafeExp1.27 HDRSnapshotShortAggSA
SnapshotShortAdj=TriggerCtrlShortTgt/TriggerCtrlShortExp1.28 HDRSnapshotLongAggSA
SnapshotLongAdj=TriggerCtrlLongTgt/TriggerCtrlLongExp1.29 SatPrevSA
SatPreSALuma=SatPrevHighPCTLLuma SatPrevSATarget=[setparam/tr:lux+lux] SatPrevSAAdjRatioFSAATgt=SatPrevTarget*FrameSALuma/(SatPrevSALuma*FrameSATarget) SatPrevSAAdjRatio.Start=0 SatPrevSAAdjRatio.End=[setparam/tr:lux+SatPrevSAAdjRatioFSATgt*FrameSATarget/FrameSALuma在SatPrevSA的计算中,我们首先定义亮部预览的亮度(Luma)为SatPrevHighPCTLLuma。目标饱和度(SATarget)通过参数设置获取,形式为[setparam/tr:lux+lux](这里假设lux为变量占位符,实际使用中需替换为具体值)。
接着,我们计算调整比率(Adjustment Ratio)的帧内平均目标值(FSATgt),该值基于目标饱和度、当前帧与目标帧的亮度比。调整比率的起始值设为0,结束值则根据FSATgt、当前帧与目标帧的饱和度与亮度计算得出,具体公式为:
SatPrevSAAdjRatio.End = [setparam/tr:lux + (SatPrevTarget * FrameSATarget) / (SatPrevSALuma * FrameSALuma) * FrameSATarget / FrameSALuma]
1.30 DarkPrevSA
DarkPrevSALuma= [set param/tr:lux+DarkPrevLowPCTLLuma] DarkPrevSATarget= [set param/tr: lux+lux] DarkPrevSAAdjRatioStartFSATgt=(DarkPrevSATarget*FrameSALuma)/(DarkPrevSALuma*FrameSATarget) DarkPrevSAAdjRatioEndFSATgt=(DarkPrevSATarget*FrameSALuma)/(DarkPrevSALuma*FrameSATarget) DarkPrevSAAdjRatio.Start=[setparam/tr:lux+DarkPrevSAAdjRatioStartFSATgt]*FrameSATarget/FrameSALuma DarkPrevSAAdjRatio.End=[setparam/tr:lux+DarkPrevSAAdjRatioEndFSATgt]*FrameSATarget/FrameSALuma对于暗部预览(DarkPrevSA),我们类 似地定义了暗部预览的亮度(DarkPrevLowPCTLLuma)和目标饱和度([setparam/tr:lux+lux])。调整比率的起始和结束值计算采用了相同的逻辑,但分别基于暗部预览的参数:
DarkPrevSAAdjRatioStartFSATgt = (DarkPrevSATarget * FrameSALuma) / (DarkPrevSALuma * FrameSATarget)
DarkPrevSAAdjRatio.Start = [setparam/tr:lux + DarkPrevSAAdjRatioStartFSATgt] * FrameSATarget / FrameSALuma
DarkPrevSAAdjRatio.End = 同上逻辑,但通常暗部调整范围较小或固定,可能无需变化,故这里也使用相同公式或设定为固定值。
1.31 LongDarkPrevSA
LongDarkPrevSALuma= [set param/tr: lux+LongDarkPrevLowPCTLLuma] LongDarkPrevSATarget= [set param/tr: lux] LongDarkPrevSAAdjRatioFSATgt= (LongDarkPrevSATarget * FrameSALuma) / (LongDarkPrevSALuma * FrameSATarget) LongDarkPrevSA3HDRLongExp= LongDarkPrevSATarget * TriggerCtrlShortExp / LongDarkPrevSALuma LongDarkPrevSA3HDRRealDRCGain= LongDarkPrevSA3HDRLongExp / ShortSatPrevSA3HDRShortExp LongDarkPrevSAAdjRatio.Start= [set param/tr:lux+LongDarkPrevSAAdjRatioFSATgt] * FrameSATarget / FrameSALuma LongDarkPrevSAAdjRatio.End= 256长期暗部预览(LongDarkPrevSA)的计算考虑了更长时间的暗部信息。我们定义了长期暗部预览的亮度(LongDarkPrevLowPCTLLuma)和目标饱和度([setparam/tr:lux])。此外,还计算了与HDR相关的曝光时间(LongDarkPrevSA3HDRLongExp)和动态范围控制增益(LongDarkPrevSA3HDRRealDRCGain)。
调整比率的起始值基于FSATgt计算,结束值固定为256(或根据具体需求调整):
LongDarkPrevSAAdjRatioFSATgt = (LongDarkPrevSATarget * FrameSALuma) / (LongDarkPrevSALuma * FrameSATarget)
LongDarkPrevSAAdjRatio.Start = [setparam/tr:lux + LongDarkPrevSAAdjRatioFSATgt] * FrameSATarget / FrameSALuma
LongDarkPrevSAAdjRatio.End = 256
1.32 ShortSatPrevSA
ShortSatPrevSALuma= ShortSatPrevHighPCTLLuma ShortSatPrevSATarget= [set param/tr:lux] ShortSatPrevSAAdjRatioFSATgt= (ShortSatPrevSATarget*FrameSALuma)/(ShortSatPrevSALuma*FrameSATarget) ShoartSatPrevSA3HDRShortExp= ShortSatPrevSATarget*TriggerCtrlShortExp/ShortSatPrevSALuma ShortSatPrevSAAdjRatio.Start= 0.0 ShortSatPrevSAAdjRatio.End= [set param/tr:lux+ShortSatPrevSAAdjRatioFSATgt]*FrameSATarget/FrameSALuma短期亮部预览(ShortSatPrevSA)的计算较为直接,定义了短期高亮度区域的亮度(ShortSatPrevHighPCTLLuma)和目标饱和度([setparam/tr:lux])。调整比率的起始值设为0.0,结束值根据FSATgt计算得出:
ShortSatPrevSAAdjRatioFSATgt = (ShortSatPrevSATarget * FrameSALuma) / (ShortSatPrevSALuma * FrameSATarget)
ShortSatPrevSAAdjRatio.Start = 0.0
ShortSatPrevSAAdjRatio.End = [setparam/tr:lux + ShortSatPrevSAAdjRatioFSATgt] * FrameSATarget / FrameSALuma
1.33 YHistSA
YHistClampValue=YHistLowPctlLuma- [set param/tr:lux+lux] YHistClampValue=Max(YHistClampValue,0.0) YHistClampValue=Min(YHistClampValue,[setparam/tr:lux+lux]) HighPctlLumaTarget=Max(YHistHighPctlLuma,[setparam/tr:lux+lux]) HighPctlLumaRemoveOffset=YHistHighPctlLuma- YHistClampValue YHistScaleValue=HighPctlLumaTarget/HighPctlLumaRemove YHistScaleValue=Min(YHistScaleValue,1.25)在YHistSA部分,我们主要对图像的亮度直方图进行动态调整,以适应不同的光照条件。具体步骤如下:
- 计算亮度钳制值:
YHistClampValue = YHistLowPctlLuma - [set param/tr:lux+lux]
YHistClampValue = Max(YHistClampValue, 0.0)
YHistClampValue = Min(YHistClampValue, [set param/tr:lux+lux])
这里,我们根据设定的光照参数调整亮度直方图的低阈值,并确保其值在合理范围内。 - 确定高亮目标值:
HighPctlLumaTarget = Max(YHistHighPctlLuma, [set param/tr:lux+lux])
设定高亮部分的目标亮度值,确保图像的高光部分不会过曝。 - 计算亮度缩放比例:
HighPctlLumaRemoveOffset = YHistHighPctlLuma - YHistClampValue
YHistScaleValue = HighPctlLumaTarget / HighPctlLumaRemoveOffset
YHistScaleValue = Min(YHistScaleValue, 1.25)
通过计算高亮部分的缩放比例,调整图像的亮度分布,同时限制最大缩放比例以防止失真。
1.34 BrightenImgSA
BrightenImgSALuma=BrightenImgPCTLLuma BrightenImgSATarget=[setparam/tr:lux+lux] BrightenImgSAAdjRatioBright=BrightenImgSATarget/BrightenImgSALuma BrightenImgSAAdjRatioSat=[setparam/tr:lux+lux]/BrightenImgSatPCTLLuma BrightenImgSAAdjRatioMin=Min(BrightenImgSAAdjRatioBright,BrightenImgSAAdjRatioSat) BrightenImgSAAdjRatioFSATgt=BrightenImgSAAdjRatioMin*FrameSALum/FrameSATarget BrightenImgSAAdjInc=BrightenImgSAMinRatio*((BrightenImgSAAdjRatioFSATgt-1)*[setparam/tr:lux+CtrlLuma])+1 BrightenImgSAMinRatio=Min([setparam/tr:lux+BrightenImgStatsRoughness],[setparam/tr:lux+BrightenImgFlatRatio]) BrightenImgSAAdjRatioFSATgt=(BrightenImgSAAdjRatioFSATgt>1)?BrightenImgSAAdjInc:BrightenImgSAAdjRatioFSATgt BrightenImgSAAdjRatio.Start=[setparam/tr:lux+BrightenImgSAAdjRatioFSATgt]*FrameSATarget/FrameSALum BrightenImgSAAdjRatio.End=256在BrightenImgSA部分,我们专注于根据光照条件动态调整图像的亮度和饱和度,以提升视觉质量。
初始化亮度和饱和度调整比例:
BrightenImgSALuma = BrightenImgPCTLLuma
BrightenImgSATarget = [set param/tr:lux+lux]
BrightenImgSAAdjRatioBright = BrightenImgSATarget / BrightenImgSALuma
BrightenImgSAAdjRatioSat = [set param/tr:lux+lux] / BrightenImgSatPCTLLuma
分别计算基于亮度和饱和度的调整比例。确定最小调整比例:
BrightenImgSAAdjRatioMin = Min(BrightenImgSAAdjRatioBright, BrightenImgSAAdjRatioSat)
取亮度和饱和度调整比例中的较小值,作为最终的调整基准。计算帧级别的调整目标和增量:
BrightenImgSAAdjRatioFSATgt = BrightenImgSAAdjRatioMin * FrameSALum / FrameSATarget
BrightenImgSAMinRatio = Min([set param/tr:lux+BrightenImgStatsRoughness], [set param/tr:lux+BrightenImgFlatRatio])
BrightenImgSAAdjInc = BrightenImgSAMinRatio * ((BrightenImgSAAdjRatioFSATgt - 1) * [set param/tr:lux+CtrlLuma]) + 1
根据帧级别的亮度和目标值,计算调整增量。应用调整比例:
BrightenImgSAAdjRatioFSATgt = (BrightenImgSAAdjRatioFSATgt > 1) ? BrightenImgSAAdjInc : BrightenImgSAAdjRatioFSATgt
BrightenImgSAAdjRatio.Start = [set param/tr:lux+BrightenImgSAAdjRatioFSATgt] * FrameSATarget / FrameSALum
BrightenImgSAAdjRatio.End = 256
如果调整后的目标比例大于1,则应用调整增量;否则保持原比例。最后,设置调整比例的起始和结束值。
1.35 Safe3HDRSnapshotSA
Safe3HDRSnapshotSAAdjRatio= SafeAggSA3HDRSafeExp / TriggerCtrlShortExp在探讨Safe3HDRSnapshotSA的计算时,我们首先需要明确其调整比例(AdjRatio)的计算方式。这一比例是基于SafeAggSA模式下的3HDR安全曝光 值(SafeExp)与触发控制短曝光值(TriggerCtrlShortExp)之间的比值来确定的。具体公式如下:
Safe3HDRSnapshotSAAdjRatio = SafeAggSA3HDRSafeExp / TriggerCtrlShortExp
1.36 Short3HDRSnapshotSA
Safe3HDRSnapshotSAScaledExp= SafeggSA3HDRShortExp * [set param/tr:lux+TriggerCtrlSatRatio] Short3HDRSnapshotSASelExp= (SafeAggSA3HDRSafeExp < Short3HDRSnapshotSAScaledExp) ? SafeAgg3HDRSafeExp: Short3HDRSnapshotSAScaledExp Short3HDRSnapshotSAAdjRatio= Short3HDRSnapshotSASelExp / TriggerCtrlShortExp接下来,我们进入Short3HDRSnapshotSA的计算。这里涉及到缩放曝光值(ScaledExp)和选择曝光值(SelExp)的计算,以及最终调整比例(AdjRatio)的确定。
缩放曝光值:通过当前设置的参数(如光照强度lux)和触发控制饱和度比例(TriggerCtrlSatRatio)来调整SafeAggSA模式下的3HDR短曝光值。
选择曝光值:根据缩放曝光值与SafeAggSA模式下的3HDR安全曝光值的大小关系来决定最终的曝光值。
具体公式如下:
Safe3HDRSnapshotSAScaledExp = SafeggSA3HDRShortExp * [set param/tr:lux + TriggerCtrlSatRatio]
Short3HDRSnapshotSASelExp = (SafeAggSA3HDRSafeExp < Short3HDRSnapshotSAScaledExp) ? SafeAggSA3HDRSafeExp : Short3HDRSnapshotSAScaledExp
Short3HDRSnapshotSAAdjRatio = Short3HDRSnapshotSASelExp / TriggerCtrlShortExp
1.37 Long3HDRSnapshotSA
Long3HDRSnapshotSAScaledDRCGain= Min([set param/tr:lux 64], LongDarkPrevSA3HDRLongExp * [setparam/tr:lux+TriggerCtrlDarkRatio] / Short3HDRSnapshotSASelExp Long3HDRSnapshotSAScaledExp= Long3HDRSnapshotSAScaledDRCGain * Short3HDRSnapshotSASelExp Long3HDRSnapshotSASelExp= (SafeAggSA3HDRSafeExp * Long3HDRSnapshotSAScaledExp) /(Long3HDRSnapshotSAScaledExp * SafeAggSA3HDRSafeExp) Long3HDRSnapshotSAAdjRatio= Long3HDRSnapshotSASelExp / TriggerCtrlShortExp最后,我们分析Long3HDRSnapshotSA的计算过程,这涉及到动态范围控制增益(DRCGain)的计算、缩放曝光值的应用以及选择曝光值和最终调整比例的确定。
缩放DRC增益:首先,根据光照强度参数和触发控制暗光比例(TriggerCtrlDarkRatio),结合之前的Short3HDRSnapshotSA选择曝光值,来计算一个缩放后的DRC增益。同时,确保增益不超过预设的最大值(如64)。
缩放曝光值:利用计算出的DRC增益与Short3HDRSnapshotSA的选择曝光值相乘,得到Long3HDRSnapshotSA的缩放曝光值。
选择曝光值与调整比例:通过特定的数学变换(这里可能是一个简化的表达,实际可能更复杂),确定最终的Long3HDRSnapshotSA选择曝光值,并计算其调整比例。
具体公式如下:
Long3HDRSnapshotSAScaledDRCGain = Min([set param/tr:lux, 64], LongDarkPrevSA3HDRLongExp * [set param/tr:lux + TriggerCtrlDarkRatio] / Short3HDRSnapshotSASelExp)
Long3HDRSnapshotSAScaledExp = Long3HDRSnapshotSAScaledDRCGain * Short3HDRSnapshotSASelExp
这里的Long3HDRSnapshotSASelExp计算可能是一个简化的描述,实际逻辑可能更复杂
假设简化为直接采用缩放曝光值作为选择曝光值(仅为示例)
Long3HDRSnapshotSASelExp = Long3HDRSnapshotSAScaledExp # 实际应用中需根据具体算法确定
Long3HDRSnapshotSAAdjRatio = Long3HDRSnapshotSASelExp / TriggerCtrlShortExp