//////////////////////////////////////////////////////////////// // // //exposure correction before interpolation // // code dated: December 27, 2010 // // Expo_before.cc is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // //////////////////////////////////////////////////////////////// //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Jacques Desmis // use fast-demo(provisional) from Emil Martinec // inspired from work Guillermo Luijk and Manuel LLorens(Perfectraw) // I use OMP // This function uses parameters: // exposure (lineal): 2^(-8..0..8): currently 0.5 +3 // preserve (log) : 0..8 : currently 0.1 1 //modi : 31/12/2010 #define LIM(x,min,max) MAX(min,MIN(x,max)) #define CLIPF(x) LIM(x,0.0,65535.0) void RawImageSource::exp_bef(float expos, float preser) { double dt,dT2; clock_t t1, t2,t3,t4,t5; float Yp, exposure2, K, EV; // float LUT[65536]; float *LUT = new float[65536]; int i; int row,col; int width=W, height=H; // I use with Dcraw FDD interpolate from Luis Sanz , very fast and good, one can change for another : here with Rawtherpee == fastdemo() from Emil Martinec //t1 = clock(); //float *img = new float[H*W];//to save configuration : with RT is it necessary ?? unsigned short** imgd; imgd = allocArray< unsigned short >(W,H);//with memcpy : faster than for (...) for (int i=0; i(imgd, H);//free memory imgd //exposure correction inspired from G.Luijk if(preser==0.0){ // protect highlights #pragma omp parallel for shared(expos) for(int row=0;row1){ K=65535/expos*exp(-preser*log((double) 2)); for(int j=0;j<=65535;j++) LUT[(int)j]=CLIPF(((65535-K*expos)/(65535-K)*(j-65535)+65535)/j); #pragma omp parallel for shared(expos) for(int row=0;row