// run filter for a new frame input // output return is (*_parvocellularOutputONminusOFF) const std::valarray<float> &ParvoRetinaFilter::runFilter(const std::valarray<float> &inputFrame, const bool useParvoOutput) { _spatiotemporalLPfilter(get_data(inputFrame), &_photoreceptorsOutput[0]); _spatiotemporalLPfilter(&_photoreceptorsOutput[0], &_horizontalCellsOutput[0], 1); _OPL_OnOffWaysComputing(); if (useParvoOutput) { // local adaptation processes on ON and OFF ways _spatiotemporalLPfilter(&_bipolarCellsOutputON[0], &(*_localAdaptationON)[0], 2); _localLuminanceAdaptation(&_parvocellularOutputON[0], &(*_localAdaptationON)[0]); _spatiotemporalLPfilter(&_bipolarCellsOutputOFF[0], &_localAdaptationOFF[0], 2); _localLuminanceAdaptation(&_parvocellularOutputOFF[0], &_localAdaptationOFF[0]); //// Final loop that computes the main output of this filter // //// loop that makes the difference between photoreceptor cells output and horizontal cells //// positive part goes on the ON way, negative pat goes on the OFF way register float *parvocellularOutputONminusOFF_PTR=&(*_parvocellularOutputONminusOFF)[0]; register float *parvocellularOutputON_PTR=&_parvocellularOutputON[0]; register float *parvocellularOutputOFF_PTR=&_parvocellularOutputOFF[0]; for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel) *(parvocellularOutputONminusOFF_PTR++)= (*(parvocellularOutputON_PTR++)-*(parvocellularOutputOFF_PTR++)); } return (*_parvocellularOutputONminusOFF); }
// local luminance adaptation of the input in regard of localLuminance buffer, the input is rewrited and becomes the output void BasicRetinaFilter::_localLuminanceAdaptation(float *inputOutputFrame, const float *localLuminance) { _localLuminanceAdaptation(inputOutputFrame, localLuminance, inputOutputFrame, false); /* const float *localLuminancePTR=localLuminance; float *inputOutputFramePTR=inputOutputFrame; for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputOutputFramePTR) { float X0=*(localLuminancePTR++)*_localLuminanceFactor+_localLuminanceAddon; *(inputOutputFramePTR) = (_maxInputValue+X0)**inputOutputFramePTR/(*inputOutputFramePTR +X0+0.00000000001); } */ }
// launch filter that runs all the IPL filter const std::valarray<double> &MagnoRetinaFilter::runFilter(const std::valarray<double> &OPL_ON, const std::valarray<double> &OPL_OFF) { // Compute the high pass temporal filter _amacrineCellsComputing(get_data(OPL_ON), get_data(OPL_OFF)); // apply low pass filtering on ON and OFF ways after temporal high pass filtering _spatiotemporalLPfilter(&_amacrinCellsTempOutput_ON[0], &_magnoXOutputON[0], 0); _spatiotemporalLPfilter(&_amacrinCellsTempOutput_OFF[0], &_magnoXOutputOFF[0], 0); // local adaptation of the ganglion cells to the local contrast of the moving contours _spatiotemporalLPfilter(&_magnoXOutputON[0], &_localProcessBufferON[0], 1); _localLuminanceAdaptation(&_magnoXOutputON[0], &_localProcessBufferON[0]); _spatiotemporalLPfilter(&_magnoXOutputOFF[0], &_localProcessBufferOFF[0], 1); _localLuminanceAdaptation(&_magnoXOutputOFF[0], &_localProcessBufferOFF[0]); /* Compute MagnoY */ register double *magnoYOutput= &(*_magnoYOutput)[0]; register double *magnoXOutputON_PTR= &_magnoXOutputON[0]; register double *magnoXOutputOFF_PTR= &_magnoXOutputOFF[0]; for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel) *(magnoYOutput++)=*(magnoXOutputON_PTR++)+*(magnoXOutputOFF_PTR++); return (*_magnoYOutput); }
// run local adaptation filter at a specific output adress with autonomous low pass filtering before adaptation void BasicRetinaFilter::runFilter_LocalAdapdation_autonomous(const std::valarray<float> &inputFrame, std::valarray<float> &outputFrame) { _spatiotemporalLPfilter(get_data(inputFrame), &_filterOutput[0]); _localLuminanceAdaptation(get_data(inputFrame), &_filterOutput[0], &outputFrame[0]); }
// run local adaptation filter at a specific output adress void BasicRetinaFilter::runFilter_LocalAdapdation(const std::valarray<float> &inputFrame, const std::valarray<float> &localLuminance, std::valarray<float> &outputFrame) { _localLuminanceAdaptation(get_data(inputFrame), get_data(localLuminance), &outputFrame[0]); }
/////////////////////////////////////////////////////////////////////// /// Local luminance adaptation functions // run local adaptation filter and save result in _filterOutput const std::valarray<float> &BasicRetinaFilter::runFilter_LocalAdapdation(const std::valarray<float> &inputFrame, const std::valarray<float> &localLuminance) { _localLuminanceAdaptation(get_data(inputFrame), get_data(localLuminance), &_filterOutput[0]); return _filterOutput; }