#include <iostream>
#include <cstring>
-#include "opencv2/opencv.hpp"
+#include "opencv2/bioinspired.hpp" // retina based algorithms
+#include "opencv2/imgproc.hpp" // cvCvtcolor function
+#include "opencv2/highgui.hpp" // display
static void help(std::string errorMessage)
{
cv::Mat displayedCurveImage = cv::Mat::ones(200, curve.size().height, CV_8U);
cv::Mat windowNormalizedCurve;
- normalize(curve, windowNormalizedCurve, 0, 200, CV_MINMAX, CV_32F);
+ normalize(curve, windowNormalizedCurve, 0, 200, cv::NORM_MINMAX, CV_32F);
displayedCurveImage = cv::Scalar::all(255); // set a white background
int binW = cvRound((double)displayedCurveImage.cols/curve.size().height);
normalize(hist, normalizedHist, 1, 0, cv::NORM_L1, CV_32F); // normalize histogram so that its sum equals 1
double min_val, max_val;
- CvMat histArr(normalizedHist);
- cvMinMaxLoc(&histArr, &min_val, &max_val);
+ minMaxLoc(normalizedHist, &min_val, &max_val);
//std::cout<<"Hist max,min = "<<max_val<<", "<<min_val<<std::endl;
// compute density probability
normalize(imageInputRescaled, imageInputRescaled, 0.0, 255.0, cv::NORM_MINMAX);
}
- cv::Ptr<cv::Retina> retina;
+ cv::Ptr<cv::bioinspired::Retina> retina;
int retinaHcellsGain;
int localAdaptation_photoreceptors, localAdaptation_Gcells;
static void callBack_updateRetinaParams(int, void*)
}
bool useLogSampling = !strcmp(argv[argc-1], "log"); // check if user wants retina log sampling processing
+ int chosenMethod=0;
+ if (!strcmp(argv[argc-1], "fast"))
+ {
+ chosenMethod=1;
+ std::cout<<"Using fast method (no spectral whithning), adaptation of Meylan&al 2008 method"<<std::endl;
+ }
std::string inputImageName=argv[1];
* -> if the last parameter is 'log', then activate log sampling (favour foveal vision and subsamples peripheral vision)
*/
if (useLogSampling)
- {
- retina = new cv::Retina(inputImage.size(),true, cv::RETINA_COLOR_BAYER, true, 2.0, 10.0);
+ {
+ retina = cv::bioinspired::createRetina(inputImage.size(),true, cv::bioinspired::RETINA_COLOR_BAYER, true, 2.0, 10.0);
}
else// -> else allocate "classical" retina :
- retina = new cv::Retina(inputImage.size());
+ retina = cv::bioinspired::createRetina(inputImage.size());
+
+ // create a fast retina tone mapper (Meyla&al algorithm)
+ std::cout<<"Allocating fast tone mapper..."<<std::endl;
+ //cv::Ptr<cv::RetinaFastToneMapping> fastToneMapper=createRetinaFastToneMapping(inputImage.size());
+ std::cout<<"Fast tone mapper allocated"<<std::endl;
- // save default retina parameters file in order to let you see this and maybe modify it and reload using method "setup"
- retina->write("RetinaDefaultParameters.xml");
+ // save default retina parameters file in order to let you see this and maybe modify it and reload using method "setup"
+ retina->write("RetinaDefaultParameters.xml");
- // desactivate Magnocellular pathway processing (motion information extraction) since it is not usefull here
- retina->activateMovingContoursProcessing(false);
+ // desactivate Magnocellular pathway processing (motion information extraction) since it is not usefull here
+ retina->activateMovingContoursProcessing(false);
// declare retina output buffers
cv::Mat retinaOutput_parvo;
histogramClippingValue=0; // default value... updated with interface slider
//inputRescaleMat = inputImage;
//outputRescaleMat = imageInputRescaled;
- cv::namedWindow("Retina input image (with cut edges histogram for basic pixels error avoidance)",1);
- cv::createTrackbar("histogram edges clipping limit", "Retina input image (with cut edges histogram for basic pixels error avoidance)",&histogramClippingValue,50,callBack_rescaleGrayLevelMat);
+ cv::namedWindow("Processing configuration",1);
+ cv::createTrackbar("histogram edges clipping limit", "Processing configuration",&histogramClippingValue,50,callBack_rescaleGrayLevelMat);
- cv::namedWindow("Retina Parvocellular pathway output : 16bit=>8bit image retina tonemapping", 1);
colorSaturationFactor=3;
- cv::createTrackbar("Color saturation", "Retina Parvocellular pathway output : 16bit=>8bit image retina tonemapping", &colorSaturationFactor,5,callback_saturateColors);
+ cv::createTrackbar("Color saturation", "Processing configuration", &colorSaturationFactor,5,callback_saturateColors);
retinaHcellsGain=40;
- cv::createTrackbar("Hcells gain", "Retina Parvocellular pathway output : 16bit=>8bit image retina tonemapping",&retinaHcellsGain,100,callBack_updateRetinaParams);
+ cv::createTrackbar("Hcells gain", "Processing configuration",&retinaHcellsGain,100,callBack_updateRetinaParams);
localAdaptation_photoreceptors=197;
localAdaptation_Gcells=190;
- cv::createTrackbar("Ph sensitivity", "Retina Parvocellular pathway output : 16bit=>8bit image retina tonemapping", &localAdaptation_photoreceptors,199,callBack_updateRetinaParams);
- cv::createTrackbar("Gcells sensitivity", "Retina Parvocellular pathway output : 16bit=>8bit image retina tonemapping", &localAdaptation_Gcells,199,callBack_updateRetinaParams);
+ cv::createTrackbar("Ph sensitivity", "Processing configuration", &localAdaptation_photoreceptors,199,callBack_updateRetinaParams);
+ cv::createTrackbar("Gcells sensitivity", "Processing configuration", &localAdaptation_Gcells,199,callBack_updateRetinaParams);
/////////////////////////////////////////////
while(continueProcessing)
{
// run retina filter
- retina->run(imageInputRescaled);
- // Retrieve and display retina output
- retina->getParvo(retinaOutput_parvo);
- cv::imshow("Retina input image (with cut edges histogram for basic pixels error avoidance)", imageInputRescaled/255.0);
- cv::imshow("Retina Parvocellular pathway output : 16bit=>8bit image retina tonemapping", retinaOutput_parvo);
+ if (!chosenMethod)
+ {
+ retina->run(imageInputRescaled);
+ // Retrieve and display retina output
+ retina->getParvo(retinaOutput_parvo);
+ cv::imshow("Retina input image (with cut edges histogram for basic pixels error avoidance)", imageInputRescaled/255.0);
+ cv::imshow("Retina Parvocellular pathway output : 16bit=>8bit image retina tonemapping", retinaOutput_parvo);
+ cv::imwrite("HDRinput.jpg",imageInputRescaled/255.0);
+ cv::imwrite("RetinaToneMapping.jpg",retinaOutput_parvo);
+ }
+ else
+ {
+ // apply the simplified hdr tone mapping method
+ cv::Mat fastToneMappingOutput;
+ retina->applyFastToneMapping(imageInputRescaled, fastToneMappingOutput);
+ cv::imshow("Retina fast tone mapping output : 16bit=>8bit image retina tonemapping", fastToneMappingOutput);
+ }
+ /*cv::Mat fastToneMappingOutput_specificObject;
+ fastToneMapper->setup(3.f, 1.5f, 1.f);
+ fastToneMapper->applyFastToneMapping(imageInputRescaled, fastToneMappingOutput_specificObject);
+ cv::imshow("### Retina fast tone mapping output : 16bit=>8bit image retina tonemapping", fastToneMappingOutput_specificObject);
+*/
cv::waitKey(10);
}
}catch(cv::Exception e)