From 380728e1f07df5f7f9754e3b8cf2a3f22b98b8d9 Mon Sep 17 00:00:00 2001 From: Emil Martinec Date: Thu, 8 Mar 2012 14:52:57 -0600 Subject: [PATCH] Minor updates, code cleanup. --- rtengine/FTblockDNchroma.cc | 56 ++++++++++++------- rtengine/cplx_wavelet_level.h | 101 ++++++++-------------------------- rtengine/improccoordinator.cc | 13 +++++ rtengine/improcfun.h | 2 +- 4 files changed, 74 insertions(+), 98 deletions(-) diff --git a/rtengine/FTblockDNchroma.cc b/rtengine/FTblockDNchroma.cc index 3335b981a..bc898dcab 100644 --- a/rtengine/FTblockDNchroma.cc +++ b/rtengine/FTblockDNchroma.cc @@ -184,9 +184,9 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*if (plistener) { - plistener->setProgressStr ("Denoise..."); - plistener->setProgress (0.0); - }*/ + plistener->setProgressStr ("Denoise..."); + plistener->setProgress (0.0); + }*/ volatile double progress = 0.0; @@ -207,15 +207,7 @@ namespace rtengine { } //const int blkrad=2; - float noisevar_L = SQR((100-dnparams.Ldetail) * TS * 100.0f); - float noisevar_ab = SQR(dnparams.chroma * TS * 150.0f); - - // calculation for tiling - const int numblox_W = ceil(((float)(width))/(offset))+2*blkrad; - const int numblox_H = ceil(((float)(height))/(offset))+2*blkrad; - //const int nrtiles = numblox_W*numblox_H; - // end of tiling calc - + float noisevar_Ldetail = SQR((100-dnparams.Ldetail) * TS * 100.0f); array2D tilemask_in(TS,TS); @@ -240,6 +232,18 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // TODO: begin block processing + + const int tilesize = 1000; + const int overlap = 100; + if (width>tilesize and height>tilesize) { + const int numtiles_W = ceil(((float)(width))/(tilesize-overlap)); + const int numtiles_H = ceil(((float)(height))/(tilesize-overlap)); + int tilewidth = ceil(((float)(width))/(numtiles_W)); + int tileheight = ceil(((float)(height))/(numtiles_H)); + tilewidth = tilewidth + (tilewidth&1); + tileheight = tileheight + (tileheight&1); + } LabImage * labin = new LabImage(width,height); LabImage * labdn = new LabImage(width,height); @@ -252,15 +256,17 @@ namespace rtengine { memcpy (labdn->data, labin->data, 3*width*height*sizeof(float)); + //initial impulse denoise impulse_nr (labdn, 50.0f/20.0f); int datalen = labin->W * labin->H; + //now perform basic wavelet denoise wavelet_decomposition Ldecomp(labin->data, labin->W, labin->H, 5/*maxlevels*/, 0/*subsampling*/ ); wavelet_decomposition adecomp(labin->data+datalen, labin->W, labin->H, 5, 1 );//last args are maxlevels, subsampling wavelet_decomposition bdecomp(labin->data+2*datalen, labin->W, labin->H, 5, 1 );//last args are maxlevels, subsampling - float noisevarL = SQR(dnparams.luma/25.0f);//TODO: clean up naming confusion about params + float noisevarL = SQR(dnparams.luma/25.0f); float noisevarab = SQR(dnparams.chroma/10.0f); WaveletDenoiseAll_BiShrink(Ldecomp, adecomp, bdecomp, noisevarL, noisevarab); @@ -269,6 +275,9 @@ namespace rtengine { adecomp.reconstruct(labdn->data+datalen); bdecomp.reconstruct(labdn->data+2*datalen); + //TODO: at this point wavelet coefficients storage can be freed + + //second impulse denoise impulse_nr (labdn, 50.0f/20.0f); //PF_correct_RT(dst, dst, defringe.radius, defringe.threshold); @@ -281,7 +290,17 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // allocate FT data structures + // now do detail recovery using block DCT to detect patterns + // missed by wavelet denoise + + + // allocate DCT data structures + + // calculation for detail recovery tiling + const int numblox_W = ceil(((float)(width))/(offset))+2*blkrad; + const int numblox_H = ceil(((float)(height))/(offset))+2*blkrad; + //const int nrtiles = numblox_W*numblox_H; + // end of tiling calc float ** Lblox = new float *[8] ; @@ -375,12 +394,12 @@ namespace rtengine { int hblproc = hblk; - RGBtile_denoise (fLblox, vblproc, hblproc, numblox_H, numblox_W, noisevar_L, noisevar_ab ); + RGBtile_denoise (fLblox, vblproc, hblproc, numblox_H, numblox_W, noisevar_Ldetail ); if (vblk==(numblox_H-1)) {//denoise last blkrad rows for (vblproc=(vblk-blkrad+1); vblproc - void wavelet_level::AnalysisFilterLeGall (T * srcbuffer, T * dstLo, T * dstHi, int pitch, int srclen) { - - // Basic convolution code - // Applies a LeGall (CDF 5/3) filter - - - for(size_t i = skip; i < (srclen - 3*skip); i++) { - dstLo[(pitch*(i))] = 0.25*(srcbuffer[i-skip] + 2*srcbuffer[i] + srcbuffer[i+skip]); - dstHi[(pitch*(i))] = -0.125*(srcbuffer[i-skip] + srcbuffer[i+3*skip]) - 0.25*(srcbuffer[i] + srcbuffer[i+2*skip]) + 0.75*srcbuffer[i+skip]; - } - - for(size_t i = 0; i < skip; i++) { - dstLo[(pitch*(i))] = 0.25*(srcbuffer[MAX(0,i-skip)] + 2*srcbuffer[i] + srcbuffer[i+skip]); - dstHi[(pitch*(i))] = (-0.125*(srcbuffer[MAX(0,i-skip)] + srcbuffer[i+3*skip]) - \ - 0.25*(srcbuffer[i] + srcbuffer[i+2*skip]) + 0.75*srcbuffer[i+skip]); - } - - for(size_t i = (srclen-3*skip); i < (srclen); i++) { - dstLo[(pitch*(i))] = 0.25*(srcbuffer[i-skip] + 2*srcbuffer[i] + srcbuffer[MIN(srclen-1,i+skip)]); - dstHi[(pitch*(i))] = (-0.125*(srcbuffer[i-skip] + srcbuffer[MIN(srclen-1,i+3*skip)]) - \ - 0.25*(srcbuffer[i] + srcbuffer[MIN(srclen-1,i+2*skip)]) + 0.75*srcbuffer[MIN(srclen-1,i+skip)]); - } - - } - - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - template - void wavelet_level::SynthesisFilterLeGall (T * srcLo, T * srcHi, T * dst, T *bufferLo, T *bufferHi, int pitch, int dstlen) { - - // Basic convolution code - //Applies a LeGall (CDF 5/3) filter - - int srclen = (dstlen==m_w ? m_w2 : m_h2);//length of row/col in src (coarser level) - - for (size_t i=0, j=0; i - void wavelet_level::SynthesisFilterSubsampHaar (T * srcLo, T * srcHi, T * dst, T *bufferLo, T *bufferHi, int pitch, int dstlen) { + void wavelet_level::SynthesisFilterSubsampHaar (T * srcLo, T * srcHi, T * dst, int pitch, int dstlen) { /* Basic convolution code * Applies a Haar filter - * Output was subsampled by two + * Input was subsampled by two */ // calculate coefficients - for(size_t i = m_pad; i < (dstlen+m_pad-skip); i+=2) { - dst[pitch*(i-m_pad)] = bufferLo[i/2]+bufferHi[i/2]; - dst[pitch*(i+1-m_pad)] = bufferLo[i/2]-bufferHi[i/2]; + //TODO: this code is buggy... + for(size_t i = m_pad; i < (dstlen+m_pad-skip); i+=2*skip) { + dst[pitch*(i-m_pad)] = srcLo[i/2]+srcHi[i/2]; + dst[pitch*(i+skip-m_pad)] = srcLo[i/2]-srcHi[i/2]; } - if ((dstlen+m_pad)&1) { - dst[pitch*(dstlen-1)] = bufferLo[(dstlen+m_pad-1)/2]+bufferHi[(dstlen+m_pad-1)/2]; + if ((dstlen+m_pad-skip)IsrgbSourceModified())){ if (settings->verbose) printf("Demosaic %s\n",rp.dmethod.c_str()); + + currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.method); + if (params.wb.method=="Camera") + currWB = imgsrc->getWB (); + else if (params.wb.method=="Auto") { + if (!awbComputed) { + autoWB = imgsrc->getAutoWB (); + awbComputed = true; + } + currWB = autoWB; + } + params.wb.temperature = currWB.getTemp (); + params.wb.green = currWB.getGreen (); imgsrc->demosaic( rp ); } lastHighDetail=highDetailNeeded; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 942d60343..25dfc1f8d 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -146,7 +146,7 @@ namespace rtengine { void RGB_OutputTransf(LabImage * src, Imagefloat * dst, const procparams::DirPyrDenoiseParams & dnparams); void output_tile_row (float *Lbloxrow, float ** Lhipassdn, float ** tilemask, int height, int width, int top, int blkrad ); void RGB_denoise(Imagefloat * src, Imagefloat * dst, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe); - void RGBtile_denoise (float ** fLblox, int vblproc, int hblproc, int numblox_H, int numblox_W, float noisevar_L, float noisevar_ab ); //for DCT + void RGBtile_denoise (float ** fLblox, int vblproc, int hblproc, int numblox_H, int numblox_W, float noisevar_L ); //for DCT void RGBoutput_tile_row (float *Lbloxrow, LabImage * labdn, float ** tilemask_out, int height, int width, int top ); void WaveletDenoise(cplx_wavelet_decomposition &DualTreeCoeffs, float noisevar ); void WaveletDenoise(wavelet_decomposition &WaveletCoeffs, float noisevar );