// local luminance adaptation of the input in regard of localLuminance buffer void BasicRetinaFilter::_localLuminanceAdaptation(const float *inputFrame, const float *localLuminance, float *outputFrame, const bool updateLuminanceMean) { if (updateLuminanceMean) { float meanLuminance=0; const float *luminancePTR=inputFrame; for (unsigned int i=0;i<_filterOutput.getNBpixels();++i) meanLuminance+=*(luminancePTR++); meanLuminance/=_filterOutput.getNBpixels(); //float tempMeanValue=meanLuminance+_meanInputValue*_tau; updateCompressionParameter(meanLuminance); } #ifdef MAKE_PARALLEL cv::parallel_for_(cv::Range(0,_filterOutput.getNBpixels()), Parallel_localAdaptation(localLuminance, inputFrame, outputFrame, _localLuminanceFactor, _localLuminanceAddon, _maxInputValue)); #else //std::cout<<meanLuminance<<std::endl; const float *localLuminancePTR=localLuminance; const float *inputFramePTR=inputFrame; float *outputFramePTR=outputFrame; for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputFramePTR, ++outputFramePTR) { float X0=*(localLuminancePTR++)*_localLuminanceFactor+_localLuminanceAddon; // TODO : the following line can lead to a divide by zero ! A small offset is added, take care if the offset is too large in case of High Dynamic Range images which can use very small values... *(outputFramePTR) = (_maxInputValue+X0)**inputFramePTR/(*inputFramePTR +X0+0.00000000001); //std::cout<<"BasicRetinaFilter::inputFrame[IDpixel]=%f, X0=%f, outputFrame[IDpixel]=%f\n", inputFrame[IDpixel], X0, outputFrame[IDpixel]); } #endif }
// local luminance adaptation of the input in regard of localLuminance buffer void BasicRetinaFilter::_localLuminanceAdaptation(const float *inputFrame, const float *localLuminance, float *outputFrame) { float meanLuminance=0; const float *luminancePTR=inputFrame; for (unsigned int i=0;i<_filterOutput.getNBpixels();++i) meanLuminance+=*(luminancePTR++); meanLuminance/=_filterOutput.getNBpixels(); //float tempMeanValue=meanLuminance+_meanInputValue*_tau; updateCompressionParameter(meanLuminance); //std::cout<<meanLuminance<<std::endl; const float *localLuminancePTR=localLuminance; const float *inputFramePTR=inputFrame; float *outputFramePTR=outputFrame; for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputFramePTR) { float X0=*(localLuminancePTR++)*_localLuminanceFactor+_localLuminanceAddon; *(outputFramePTR++) = (_maxInputValue+X0)**inputFramePTR/(*inputFramePTR +X0); //std::cout<<"BasicRetinaFilter::inputFrame[IDpixel]=%f, X0=%f, outputFrame[IDpixel]=%f\n", inputFrame[IDpixel], X0, outputFrame[IDpixel]); } }