HLRecovery preview speedup: decoupling from demosaic (see issue 1038)

This commit is contained in:
michael
2011-10-11 21:48:27 -04:00
parent 81c988a852
commit f355b06318
7 changed files with 64 additions and 27 deletions

View File

@@ -68,9 +68,12 @@ class ImageSource : public InitialImage {
virtual ~ImageSource () {}
virtual int load (Glib::ustring fname, bool batch = false) =0;
virtual void preprocess (const RAWParams &raw, HRecParams hrp){};
virtual void demosaic (const RAWParams &raw, HRecParams hrp){};
virtual void HLRecovery_inpaint (float** red, float** green, float** blue){};
virtual void preprocess (const RAWParams &raw){};
virtual void demosaic (const RAWParams &raw){};
virtual void HLRecovery_Global (HRecParams hrp){};
virtual void HLRecovery_inpaint (float** red, float** green, float** blue){};
virtual bool IsrgbSourceModified() =0; // tracks whether cached rgb output of demosaic has been modified
virtual void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, HRecParams hlp, ColorManagementParams cmp, RAWParams raw) {}
virtual ColorTemp getWB () =0;

View File

@@ -117,14 +117,28 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) {
progress ("Applying white balance, color correction & sRBG conversion...",100*readyphase/numofphases);
if ( todo & M_PREPROC) {
imgsrc->preprocess( rp, params.hlrecovery );
imgsrc->preprocess( rp );
imgsrc->getRAWHistogram( histRedRaw, histGreenRaw, histBlueRaw );
}
/*
Demosaic is kicked off only when
Detail considerations:
accurate detail is not displayed yet needed based on preview specifics (driven via highDetailNeeded flag)
OR
HLR considerations:
Color HLR alters rgb output of demosaic, so re-demosaic is needed when Color HLR is being turned off;
if HLR is enabled and changing method *from* Color to any other method
OR HLR gets disabled when Color method was selected
*/
// If high detail (=100%) is newly selected, do a demosaic update, since the last was just with FAST
if ((todo & M_RAW) || (!lastHighDetail && highDetailNeeded)) {
if (settings->verbose) printf("Demosaic %s\n",rp.dmethod.c_str());
imgsrc->demosaic( rp, params.hlrecovery );
if ((todo & M_RAW)
|| (!lastHighDetail && highDetailNeeded)
|| (params.hlrecovery.enabled && params.hlrecovery.method!="Color" && imgsrc->IsrgbSourceModified())
|| (!params.hlrecovery.enabled && params.hlrecovery.method=="Color" && imgsrc->IsrgbSourceModified())){
if (settings->verbose) printf("Demosaic %s\n",rp.dmethod.c_str());
imgsrc->demosaic( rp );
}
lastHighDetail=highDetailNeeded;
@@ -132,6 +146,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) {
if (todo & M_INIT) {
Glib::Mutex::Lock lock(minit); // Also used in crop window
imgsrc->HLRecovery_Global( params.hlrecovery ); // this handles Color HLRecovery
if (settings->verbose) printf ("Applying white balance, color correction & sRBG conversion...\n");
currWB = ColorTemp (params.wb.temperature, params.wb.green);
if (params.wb.method=="Camera")
@@ -531,8 +547,8 @@ void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname) {
ppar.icm.input = "(none)";
Imagefloat* im = new Imagefloat (fW, fH);
Image16* im16 = new Image16 (fW, fH);
imgsrc->preprocess( ppar.raw, ppar.hlrecovery );
imgsrc->demosaic(ppar.raw, ppar.hlrecovery );
imgsrc->preprocess( ppar.raw );
imgsrc->demosaic(ppar.raw );
//imgsrc->getImage (imgsrc->getWB(), 0, im, pp, ppar.hlrecovery, ppar.icm, ppar.raw);
ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green);
if (params.wb.method=="Camera")

View File

@@ -86,6 +86,7 @@ RawImageSource::RawImageSource ()
//hpmap = NULL;
camProfile = NULL;
embProfile = NULL;
rgbSourceModified = false;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -951,7 +952,7 @@ int RawImageSource::load (Glib::ustring fname, bool batch) {
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void RawImageSource::preprocess (const RAWParams &raw, HRecParams hrp)
void RawImageSource::preprocess (const RAWParams &raw)
{
MyTime t1,t2;
t1.set();
@@ -1098,7 +1099,7 @@ void RawImageSource::preprocess (const RAWParams &raw, HRecParams hrp)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void RawImageSource::demosaic(const RAWParams &raw, HRecParams hrp )
void RawImageSource::demosaic(const RAWParams &raw)
{
if (ri->isBayer()) {
MyTime t1,t2;
@@ -1125,14 +1126,25 @@ void RawImageSource::demosaic(const RAWParams &raw, HRecParams hrp )
printf("Demosaicing: %s - %d usec\n",raw.dmethod.c_str(), t2.etime(t1));
if (raw.all_enhance) refinement_lassus();
rgbSourceModified = false;
}
//color propagation highlight recovery
if (hrp.enabled && hrp.method=="Color")
HLRecovery_inpaint (red,green,blue);
}
void RawImageSource::HLRecovery_Global(HRecParams hrp )
{
//color propagation highlight recovery
if (hrp.enabled && hrp.method=="Color"){
if (settings->verbose) printf ("Applying Highlight Recovery: Color propagation...\n");
HLRecovery_inpaint (red,green,blue);
rgbSourceModified = true;
}
else{
rgbSourceModified = false;
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/* Copy original pixel data and

View File

@@ -93,6 +93,7 @@ class RawImageSource : public ImageSource {
bool full;
cmsHPROFILE camProfile;
cmsHPROFILE embProfile;
bool rgbSourceModified;
RawImage* ri; // Copy of raw pixels, NOT corrected for initial gain, blackpoint etc.
@@ -131,10 +132,13 @@ class RawImageSource : public ImageSource {
~RawImageSource ();
int load (Glib::ustring fname, bool batch = false);
void preprocess (const RAWParams &raw, HRecParams hrp);
void demosaic (const RAWParams &raw, HRecParams hrp);
void preprocess (const RAWParams &raw);
void demosaic (const RAWParams &raw);
void HLRecovery_Global (HRecParams hrp);
void refinement_lassus ();
bool IsrgbSourceModified() {return rgbSourceModified;} // tracks whether cached rgb output of demosaic has been modified
void copyOriginalPixels(const RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile );
void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW );
void scaleColors (int winx,int winy,int winw,int winh, const RAWParams &raw);// raw for cblack

View File

@@ -85,9 +85,9 @@ TRANSFORM, // EvDISTAmount,
ALL, // EvBookmarkSelected,
CROP, // EvCrop,
TRANSFORM, // EvCACorr,
ALL, // EvHREnabled,
ALL, // EvHRAmount,
ALL, // EvHRMethod,
ALLNORAW, // EvHREnabled,
ALLNORAW, // EvHRAmount,
ALLNORAW, // EvHRMethod,
ALL, // EvWProfile,
ALL, // EvOProfile,
ALL, // EvIProfile,

View File

@@ -98,10 +98,12 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
currWB = imgsrc->getAutoWB ();
PreviewProps pp (0, 0, fw, fh, 1);
imgsrc->preprocess( params.raw, params.hlrecovery );
imgsrc->preprocess( params.raw);
if (pl) pl->setProgress (0.20);
imgsrc->demosaic( params.raw, params.hlrecovery );
if (pl) pl->setProgress (0.40);
imgsrc->demosaic( params.raw);
if (pl) pl->setProgress (0.30);
imgsrc->HLRecovery_Global( params.hlrecovery );
if (pl) pl->setProgress (0.40);
Imagefloat* baseImg = new Imagefloat (fw, fh);
imgsrc->getImage (currWB, tr, baseImg, pp, params.hlrecovery, params.icm, params.raw);
if (pl) pl->setProgress (0.45);

View File

@@ -36,7 +36,7 @@ class StdImageSource : public ImageSource {
void transform (PreviewProps pp, int tran, int &sx1, int &sy1, int &sx2, int &sy2);
void transformPixel (int x, int y, int tran, int& tx, int& ty);
bool rgbSourceModified;
public:
StdImageSource ();
~StdImageSource ();
@@ -62,7 +62,7 @@ class StdImageSource : public ImageSource {
static inline double intpow (double a, int b) { double r = 1.0; for (int i=0; i<b; i++) r *= a; return r; }
bool IsrgbSourceModified() {return rgbSourceModified;}
protected:
void getImage_ (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, HRecParams hrp);
void hflip (Imagefloat* im);