// run the initilized retina filter in order to perform color tone mapping, after this call all retina outputs are updated void _runRGBToneMapping(const std::valarray<float> &RGBimageInput, std::valarray<float> &RGBimageOutput, const bool useAdaptiveFiltering) { // multiplex the image with the color sampling method specified in the constructor _colorEngine->runColorMultiplexing(RGBimageInput); // apply tone mapping on the multiplexed image _runGrayToneMapping(_colorEngine->getMultiplexedFrame(), RGBimageOutput); // demultiplex tone maped image _colorEngine->runColorDemultiplexing(RGBimageOutput, useAdaptiveFiltering, _multiuseFilter->getMaxInputValue());//_ColorEngine->getMultiplexedFrame());//_ParvoRetinaFilter->getPhotoreceptorsLPfilteringOutput()); // rescaling result between 0 and 255 _colorEngine->normalizeRGBOutput_0_maxOutputValue(255.0); // return the result RGBimageOutput=_colorEngine->getDemultiplexedColorFrame(); }
/** * method that applies a luminance correction (initially High Dynamic Range (HDR) tone mapping) using only the 2 local adaptation stages of the retina parvocellular channel : photoreceptors level and ganlion cells level. Spatio temporal filtering is applied but limited to temporal smoothing and eventually high frequencies attenuation. This is a lighter method than the one available using the regular retina::run method. It is then faster but it does not include complete temporal filtering nor retina spectral whitening. Then, it can have a more limited effect on images with a very high dynamic range. This is an adptation of the original still image HDR tone mapping algorithm of David Alleyson, Sabine Susstruck and Laurence Meylan's work, please cite: * -> Meylan L., Alleysson D., and Susstrunk S., A Model of Retinal Local Adaptation for the Tone Mapping of Color Filter Array Images, Journal of Optical Society of America, A, Vol. 24, N 9, September, 1st, 2007, pp. 2807-2816 @param inputImage the input image to process RGB or gray levels @param outputToneMappedImage the output tone mapped image */ virtual void applyFastToneMapping(InputArray inputImage, OutputArray outputToneMappedImage) { // first convert input image to the compatible format : const bool colorMode = _convertCvMat2ValarrayBuffer(inputImage.getMat(), _inputBuffer); // process tone mapping if (colorMode) { _runRGBToneMapping(_inputBuffer, _imageOutput, true); _convertValarrayBuffer2cvMat(_imageOutput, _multiuseFilter->getNBrows(), _multiuseFilter->getNBcolumns(), true, outputToneMappedImage); }else { _runGrayToneMapping(_inputBuffer, _imageOutput); _convertValarrayBuffer2cvMat(_imageOutput, _multiuseFilter->getNBrows(), _multiuseFilter->getNBcolumns(), false, outputToneMappedImage); } }
// run the initilized retina filter in order to perform color tone mapping, after this call all retina outputs are updated void RetinaFilter::runRGBToneMapping(const std::valarray<float> &RGBimageInput, std::valarray<float> &RGBimageOutput, const bool useAdaptiveFiltering, const float PhotoreceptorsCompression, const float ganglionCellsCompression) { // preliminary check if (!checkInput(RGBimageInput, true)) return; // multiplex the image with the color sampling method specified in the constructor _colorEngine.runColorMultiplexing(RGBimageInput); // apply tone mapping on the multiplexed image _runGrayToneMapping(_colorEngine.getMultiplexedFrame(), RGBimageOutput, PhotoreceptorsCompression, ganglionCellsCompression); // demultiplex tone maped image _colorEngine.runColorDemultiplexing(RGBimageOutput, useAdaptiveFiltering, _photoreceptorsPrefilter.getMaxInputValue());//_ColorEngine->getMultiplexedFrame());//_ParvoRetinaFilter->getPhotoreceptorsLPfilteringOutput()); // rescaling result between 0 and 255 _colorEngine.normalizeRGBOutput_0_maxOutputValue(255.0); // return the result RGBimageOutput=_colorEngine.getDemultiplexedColorFrame(); }