From 10354bc8fe002c37a86dfc2c8ac871fec8c41571 Mon Sep 17 00:00:00 2001 From: Emil Martinec Date: Mon, 13 Feb 2012 09:29:59 -0600 Subject: [PATCH] Minor improvements to chroma denoise; still loses to much low amplitude chroma detail. --- rtengine/FTblockDNchroma.cc | 181 +++++++++++++++++++--------------- rtengine/cplx_wavelet_level.h | 14 --- rtengine/improcfun.cc | 17 ++-- 3 files changed, 113 insertions(+), 99 deletions(-) diff --git a/rtengine/FTblockDNchroma.cc b/rtengine/FTblockDNchroma.cc index 81d904641..bc0e81308 100644 --- a/rtengine/FTblockDNchroma.cc +++ b/rtengine/FTblockDNchroma.cc @@ -52,7 +52,7 @@ //#define ULIM(x,y,z) ((y) < (z) ? LIM(x,y,z) : LIM(x,z,y)) //#define CLIP(x) LIM(x,0,65535) -#define TS 128 // Tile size +#define TS 256 // Tile size #define offset (TS/4) // shift between tiles #define fTS ((TS/2+1)) // second dimension of Fourier tiles //#define eps 0.01f/(TS*TS) //tolerance @@ -85,7 +85,7 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // gamma transform input channel data - float gam = dnparams.gamma-0.5; + float gam = dnparams.gamma; float gamthresh = 0.03; float gamslope = exp(log((double)gamthresh)/gam)/gamthresh; @@ -103,16 +103,16 @@ namespace rtengine { for (int i=0; iheight; i++) for (int j=0; jwidth; j++) { - float X = xyz_prophoto[0][0]*src->r[i][j] + xyz_prophoto[0][1]*src->g[i][j] + xyz_prophoto[0][2]*src->b[i][j]; - float Y = xyz_prophoto[1][0]*src->r[i][j] + xyz_prophoto[1][1]*src->g[i][j] + xyz_prophoto[1][2]*src->b[i][j]; - float Z = xyz_prophoto[2][0]*src->r[i][j] + xyz_prophoto[2][1]*src->g[i][j] + xyz_prophoto[2][2]*src->b[i][j]; + float X = src->r[i][j];//xyz_prophoto[0][0]*src->r[i][j] + xyz_prophoto[0][1]*src->g[i][j] + xyz_prophoto[0][2]*src->b[i][j]; + float Y = src->g[i][j];//xyz_prophoto[1][0]*src->r[i][j] + xyz_prophoto[1][1]*src->g[i][j] + xyz_prophoto[1][2]*src->b[i][j]; + float Z = src->b[i][j];//xyz_prophoto[2][0]*src->r[i][j] + xyz_prophoto[2][1]*src->g[i][j] + xyz_prophoto[2][2]*src->b[i][j]; X = X<65535.0f ? gamcurve[X] : (gamma((double)X/65535.0, gam, gamthresh, gamslope, 1.0, 0.0)*32768.0f); Y = Y<65535.0f ? gamcurve[Y] : (gamma((double)Y/65535.0, gam, gamthresh, gamslope, 1.0, 0.0)*32768.0f); Z = Z<65535.0f ? gamcurve[Z] : (gamma((double)Z/65535.0, gam, gamthresh, gamslope, 1.0, 0.0)*32768.0f); dst->L[i][j] = Y; - dst->a[i][j] = 0.5f*(X-Y); + dst->a[i][j] = 0.2f*(X-Y); dst->b[i][j] = 0.2f*(Y-Z); //Y = 0.05+0.1*((float)rand()/(float)RAND_MAX);//test with random data @@ -130,7 +130,7 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // gamma transform output channel data - float gam = dnparams.gamma-0.5; + float gam = dnparams.gamma; float gamthresh = 0.03; float gamslope = exp(log((double)gamthresh)/gam)/gamthresh; float igam = 1/gam; @@ -152,7 +152,7 @@ namespace rtengine { //input normalized to (0,1) //Y = igamcurveL[ src->L[i][j] ]; Y = src->L[i][j]; - X = (2.0f*(src->a[i][j])) + Y; + X = (5.0f*(src->a[i][j])) + Y; Z = Y - (5.0f*(src->b[i][j])); X = X<32768.0f ? igamcurve[X] : (gamma((float)X/32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); @@ -161,9 +161,9 @@ namespace rtengine { //Y = 65535.0f*(0.05+0.1*((float)rand()/(float)RAND_MAX));//test with random data - dst->r[i][j] = prophoto_xyz[0][0]*X + prophoto_xyz[0][1]*Y + prophoto_xyz[0][2]*Z; - dst->g[i][j] = prophoto_xyz[1][0]*X + prophoto_xyz[1][1]*Y + prophoto_xyz[1][2]*Z; - dst->b[i][j] = prophoto_xyz[2][0]*X + prophoto_xyz[2][1]*Y + prophoto_xyz[2][2]*Z; + dst->r[i][j] = X;//prophoto_xyz[0][0]*X + prophoto_xyz[0][1]*Y + prophoto_xyz[0][2]*Z; + dst->g[i][j] = Y;//prophoto_xyz[1][0]*X + prophoto_xyz[1][1]*Y + prophoto_xyz[1][2]*Z; + dst->b[i][j] = Z;//prophoto_xyz[2][0]*X + prophoto_xyz[2][1]*Y + prophoto_xyz[2][2]*Z; } } @@ -285,14 +285,14 @@ namespace rtengine { for( int i = 0 ; i < 8 ; i++ ) { Lblox[i] = (float *) fftwf_malloc (numblox_W*TS*TS * sizeof (float)); - RLblox[i] = (float *) fftwf_malloc (numblox_W*TS*TS * sizeof (float)); - BLblox[i] = (float *) fftwf_malloc (numblox_W*TS*TS * sizeof (float)); + //RLblox[i] = (float *) fftwf_malloc (numblox_W*TS*TS * sizeof (float)); + //BLblox[i] = (float *) fftwf_malloc (numblox_W*TS*TS * sizeof (float)); fLblox[i] = (fftwf_complex *) fftwf_malloc (numblox_W*TS*fTS * sizeof (fftwf_complex)); //for FT //fLblox[i] = (float *) fftwf_malloc (numblox_W*TS*TS * sizeof (float)); //for DCT - fRLblox[i] = (fftwf_complex *) fftwf_malloc (numblox_W*TS*fTS * sizeof (fftwf_complex)); - fBLblox[i] = (fftwf_complex *) fftwf_malloc (numblox_W*TS*fTS * sizeof (fftwf_complex)); + //fRLblox[i] = (fftwf_complex *) fftwf_malloc (numblox_W*TS*fTS * sizeof (fftwf_complex)); + //fBLblox[i] = (fftwf_complex *) fftwf_malloc (numblox_W*TS*fTS * sizeof (fftwf_complex)); } //make a plan for FFTW @@ -343,8 +343,8 @@ namespace rtengine { for (int j=jmin; jL[top+i][left+j]-labblur->L[top+i][left+j]);// luma data - RLblox[vblkmod][(indx + i)*TS+j] = tilemask_in[i][j]*(labin->a[top+i][left+j]-labblur->a[top+i][left+j]);// high pass chroma data - BLblox[vblkmod][(indx + i)*TS+j] = tilemask_in[i][j]*(labin->b[top+i][left+j]-labblur->b[top+i][left+j]);// high pass chroma data + //RLblox[vblkmod][(indx + i)*TS+j] = tilemask_in[i][j]*(labin->a[top+i][left+j]-labblur->a[top+i][left+j]);// high pass chroma data + //BLblox[vblkmod][(indx + i)*TS+j] = tilemask_in[i][j]*(labin->b[top+i][left+j]-labblur->b[top+i][left+j]);// high pass chroma data totwt[top+i][left+j] += tilemask_in[i][j]*tilemask_out[i][j]; } @@ -356,15 +356,15 @@ namespace rtengine { for (int i=0; iL[2*imin-i-1][left+j]-labblur->L[2*imin-i-1][left+j]); - RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[2*imin-i-1][left+j]-labblur->a[2*imin-i-1][left+j]); - BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[2*imin-i-1][left+j]-labblur->b[2*imin-i-1][left+j]); + //RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[2*imin-i-1][left+j]-labblur->a[2*imin-i-1][left+j]); + //BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[2*imin-i-1][left+j]-labblur->b[2*imin-i-1][left+j]); } if (jmin>0) { for (int i=0; iL[2*imin-i-1][2*jmin-j-1]-labblur->L[2*imin-i-1][2*jmin-j-1]); - RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[2*imin-i-1][2*jmin-j-1]-labblur->a[2*imin-i-1][2*jmin-j-1]); - BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[2*imin-i-1][2*jmin-j-1]-labblur->b[2*imin-i-1][2*jmin-j-1]); + //RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[2*imin-i-1][2*jmin-j-1]-labblur->a[2*imin-i-1][2*jmin-j-1]); + //BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[2*imin-i-1][2*jmin-j-1]-labblur->b[2*imin-i-1][2*jmin-j-1]); } } } @@ -373,15 +373,15 @@ namespace rtengine { for (int i=imax; iL[height+imax-i-1][left+j]-labblur->L[height+imax-i-1][left+j]); - RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[height+imax-i-1][left+j]-labblur->a[height+imax-i-1][left+j]); - BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[height+imax-i-1][left+j]-labblur->b[height+imax-i-1][left+j]); + //RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[height+imax-i-1][left+j]-labblur->a[height+imax-i-1][left+j]); + //BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[height+imax-i-1][left+j]-labblur->b[height+imax-i-1][left+j]); } if (jmaxL[height+imax-i-1][width+jmax-j-1]-labblur->L[height+imax-i-1][width+jmax-j-1]); - RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[height+imax-i-1][width+jmax-j-1]-labblur->a[height+imax-i-1][width+jmax-j-1]); - BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[height+imax-i-1][width+jmax-j-1]-labblur->b[height+imax-i-1][width+jmax-j-1]); + //RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[height+imax-i-1][width+jmax-j-1]-labblur->a[height+imax-i-1][width+jmax-j-1]); + //BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[height+imax-i-1][width+jmax-j-1]-labblur->b[height+imax-i-1][width+jmax-j-1]); } } } @@ -390,15 +390,15 @@ namespace rtengine { for (int j=0; jL[top+i][2*jmin-j-1]-labblur->L[top+i][2*jmin-j-1]); - RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[top+i][2*jmin-j-1]-labblur->a[top+i][2*jmin-j-1]); - BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[top+i][2*jmin-j-1]-labblur->b[top+i][2*jmin-j-1]); + //RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[top+i][2*jmin-j-1]-labblur->a[top+i][2*jmin-j-1]); + //BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[top+i][2*jmin-j-1]-labblur->b[top+i][2*jmin-j-1]); } if (imaxL[height+imax-i-1][2*jmin-j-1]-labblur->L[height+imax-i-1][2*jmin-j-1]); - RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[height+imax-i-1][2*jmin-j-1]-labblur->a[height+imax-i-1][2*jmin-j-1]); - BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[height+imax-i-1][2*jmin-j-1]-labblur->b[height+imax-i-1][2*jmin-j-1]); + //RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[height+imax-i-1][2*jmin-j-1]-labblur->a[height+imax-i-1][2*jmin-j-1]); + //BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[height+imax-i-1][2*jmin-j-1]-labblur->b[height+imax-i-1][2*jmin-j-1]); } } } @@ -408,15 +408,15 @@ namespace rtengine { for (int j=jmax; jL[top+i][width+jmax-j-1]-labblur->L[top+i][width+jmax-j-1]); - RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[top+i][width+jmax-j-1]-labblur->a[top+i][width+jmax-j-1]); - BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[top+i][width+jmax-j-1]-labblur->b[top+i][width+jmax-j-1]); + //RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[top+i][width+jmax-j-1]-labblur->a[top+i][width+jmax-j-1]); + //BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[top+i][width+jmax-j-1]-labblur->b[top+i][width+jmax-j-1]); } if (imin>0) { for (int i=0; iL[2*imin-i-1][width+jmax-j-1]-labblur->L[2*imin-i-1][width+jmax-j-1]); - RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[2*imin-i-1][width+jmax-j-1]-labblur->a[2*imin-i-1][width+jmax-j-1]); - BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[2*imin-i-1][width+jmax-j-1]-labblur->b[2*imin-i-1][width+jmax-j-1]); + //RLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->a[2*imin-i-1][width+jmax-j-1]-labblur->a[2*imin-i-1][width+jmax-j-1]); + //BLblox[vblkmod][(indx + i)*TS+j]=tilemask_in[i][j]*(labin->b[2*imin-i-1][width+jmax-j-1]-labblur->b[2*imin-i-1][width+jmax-j-1]); } } } @@ -430,8 +430,8 @@ namespace rtengine { fftwf_execute_dft_r2c(plan_forward_blox,Lblox[vblkmod],fLblox[vblkmod]); // FT an entire row of tiles //fftwf_execute_r2r(plan_forward_blox,Lblox[vblkmod],fLblox[vblkmod]); // DCT an entire row of tiles - fftwf_execute_dft_r2c(plan_forward_blox,RLblox[vblkmod],fRLblox[vblkmod]);// FT an entire row of tiles - fftwf_execute_dft_r2c(plan_forward_blox,BLblox[vblkmod],fBLblox[vblkmod]);// FT an entire row of tiles + //fftwf_execute_dft_r2c(plan_forward_blox,RLblox[vblkmod],fRLblox[vblkmod]);// FT an entire row of tiles + //fftwf_execute_dft_r2c(plan_forward_blox,BLblox[vblkmod],fBLblox[vblkmod]);// FT an entire row of tiles if (vblkL[i][j] = labblur->L[i][j] + hpdn; //labdn->L[i][j] = -(hporig)+0.25; - hpdn = labdn->a[i][j]/totwt[i][j]; - labdn->a[i][j] = labblur->a[i][j] + hpdn; + //hpdn = labdn->a[i][j]/totwt[i][j]; + //labdn->a[i][j] = labblur->a[i][j] + hpdn; - hpdn = labdn->b[i][j]/totwt[i][j]; - labdn->b[i][j] = labblur->b[i][j] + hpdn; + //hpdn = labdn->b[i][j]/totwt[i][j]; + //labdn->b[i][j] = labblur->b[i][j] + hpdn; - //labdn->a[i][j] = labblur->a[i][j]; - //labdn->b[i][j] = labblur->b[i][j]; + labdn->a[i][j] = labblur->a[i][j]; + labdn->b[i][j] = labblur->b[i][j]; } } @@ -619,11 +619,11 @@ namespace rtengine { //float Lcoeff = fLblox[vblprocmod][(hblproc*TS+i)*TS+j]; //for DCT - float RLcoeffre = fRLblox[vblprocmod][(hblproc*TS+i)*fTS+j][0]; - float RLcoeffim = fRLblox[vblprocmod][(hblproc*TS+i)*fTS+j][1]; + //float RLcoeffre = fRLblox[vblprocmod][(hblproc*TS+i)*fTS+j][0]; + //float RLcoeffim = fRLblox[vblprocmod][(hblproc*TS+i)*fTS+j][1]; - float BLcoeffre = fBLblox[vblprocmod][(hblproc*TS+i)*fTS+j][0]; - float BLcoeffim = fBLblox[vblprocmod][(hblproc*TS+i)*fTS+j][1]; + //float BLcoeffre = fBLblox[vblprocmod][(hblproc*TS+i)*fTS+j][0]; + //float BLcoeffim = fBLblox[vblprocmod][(hblproc*TS+i)*fTS+j][1]; /*double nbrave=0, nbrsqave=0, coeffsq; int vblnbrmod, hblnbrmod; @@ -642,20 +642,20 @@ namespace rtengine { float Lwsq = eps+SQR( Lcoeffre)+SQR( Lcoeffim); //for FT //float Lwsq = eps+SQR( Lcoeff); //for DCT - float RLwsq = eps+SQR(RLcoeffre)+SQR(RLcoeffim); - float BLwsq = eps+SQR(BLcoeffre)+SQR(BLcoeffim); + //float RLwsq = eps+SQR(RLcoeffre)+SQR(RLcoeffim); + //float BLwsq = eps+SQR(BLcoeffre)+SQR(BLcoeffim); //wsqave += Lwsq; //float Lfactor = (4*Lblockvar)/(eps+(Lwsq+nbrvar)+2*Lblockvar); //float Lfactor = expf(-Lwsq/(9*Lblockvar)); float freqfactor = 1.0f-MAX((expf(-(SQR(i)+SQR(j))/cutoffsq)),(expf(-(SQR(TS-i)+SQR(j))/cutoffsq))); float Lfactor = 1;//freqfactor;//*(2* Lblockvar)/(eps+ Lwsq+ Lblockvar); - float RLfactor = 1;//(2*RLblockvar)/(eps+RLwsq+RLblockvar); - float BLfactor = 1;//(2*BLblockvar)/(eps+BLwsq+BLblockvar); + //float RLfactor = 1;//(2*RLblockvar)/(eps+RLwsq+RLblockvar); + //float BLfactor = 1;//(2*BLblockvar)/(eps+BLwsq+BLblockvar); float Lshrinkfactor = SQR(Lwsq/(Lwsq + noisevar_L * Lfactor*exp(-Lwsq/(3*noisevar_L)))); - float RLshrinkfactor = RLwsq/(RLwsq+noisevar_ab*RLfactor*exp(-Lwsq/(3*noisevar_L))); - float BLshrinkfactor = BLwsq/(BLwsq+noisevar_ab*BLfactor*exp(-Lwsq/(3*noisevar_L))); + //float RLshrinkfactor = RLwsq/(RLwsq+noisevar_ab*RLfactor*exp(-Lwsq/(3*noisevar_L))); + //float BLshrinkfactor = BLwsq/(BLwsq+noisevar_ab*BLfactor*exp(-Lwsq/(3*noisevar_L))); //float shrinkfactor = (wsqL[top+i][left+j] += tilemask_out[i][j]*bloxrow_L[(indx + i)*TS+j]/(TS*TS); - labdn->a[top+i][left+j] += tilemask_out[i][j]*bloxrow_a[(indx + i)*TS+j]/(TS*TS); - labdn->b[top+i][left+j] += tilemask_out[i][j]*bloxrow_b[(indx + i)*TS+j]/(TS*TS); + //labdn->a[top+i][left+j] += tilemask_out[i][j]*bloxrow_a[(indx + i)*TS+j]/(TS*TS); + //labdn->b[top+i][left+j] += tilemask_out[i][j]*bloxrow_b[(indx + i)*TS+j]/(TS*TS); } } @@ -1089,7 +1089,7 @@ void ImProcFunctions::FixImpulse_ab(LabImage * src, LabImage * dst, double radiu //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - float ImProcFunctions::UniversalThresh(float * HH_Coeffs, int datalen) { + float ImProcFunctions::UniversalThresh(float * Detail_Coeffs, int datalen) { int * histo = new int[65536]; //memset(histo, 0, 65536*sizeof(histo)); @@ -1097,10 +1097,10 @@ void ImProcFunctions::FixImpulse_ab(LabImage * src, LabImage * dst, double radiu //calculate histogram of absolute values of HH wavelet coeffs for (int i=0; i2*thresh_a ? 1 : (coeff_a2*thresh_b ? 1 : (coeff_b2*thresh_L ? 1 : (coeff_L2*thresh_L ? 1 : (coeff_L #include -#include "array2D.h" #include "gauss.h" namespace rtengine { @@ -59,16 +58,6 @@ namespace rtengine { // spacing of filter taps size_t skip; - // array of pointers to lines of coeffs - // actually is a single contiguous data array pointed by m_coeffs[0] - //T ** m_coeffs; - //array2D wavcoeffs(4,1); - //data structure: first label is output channel (LL,LH,HL,HH), second is pixel location in flattened array - - // weights storage - //T ** m_weights_rows; - //T ** m_weights_cols; - // allocation and destruction of data storage T ** create(size_t n); void destroy(T ** subbands); @@ -77,9 +66,6 @@ namespace rtengine { template void loadbuffer(E * src, E * dst, int srclen, int pitch); - //void dwt_2d(size_t w, size_t h); - //void idwt_2d(size_t w, size_t h, int alpha); - void AnalysisFilter (T * srcbuffer, T * dstLo, T * dstHi, float *filterLo, float *filterHi, int taps, int offset, int pitch, int srclen); void SynthesisFilter (T * srcLo, T * srcHi, T * dst, T *bufferLo, T *bufferHi, diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7a43e78d3..faf602c4f 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -563,7 +563,8 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) { //impulse_nr (lab, (float)params->impulseDenoise.thresh/10.0 );//20 is normal int datalen = lab->W*lab->H; for (int i=0; idata[i] *= lab->data[i]/32768.0f; + //lab->data[i] *= lab->data[i]/32768.0f; + lab->data[i] = pow(lab->data[i]/32768.0f,3.0)*32768.0f; //lab->data[i] = 5000; } //lab->data[100*lab->W+100] = 20000; @@ -572,7 +573,7 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) { wavelet_decomposition bdecomp(lab->data+2*datalen, lab->W, lab->H, 5, 1 );//last args are maxlevels, subsampling float noisevar_L = SQR((float)params->impulseDenoise.thresh/25.0f); - float noisevar_ab = SQR((float)params->defringe.threshold / 5.0f); + float noisevar_ab = SQR((float)params->defringe.threshold / 25.0f); //WaveletDenoise(Ldecomp, SQR((float)params->impulseDenoise.thresh/25.0f)); WaveletDenoiseAll(Ldecomp, adecomp, bdecomp, noisevar_L, noisevar_ab); @@ -595,8 +596,8 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) { // Ldecomp.level_coeffs(4)[0][i] = 0; //} Ldecomp.reconstruct(labtmp->data); - adecomp.reconstruct(lab->data+datalen); - bdecomp.reconstruct(lab->data+2*datalen); + adecomp.reconstruct(labtmp->data+datalen); + bdecomp.reconstruct(labtmp->data+2*datalen); //double radius = (int)(params->impulseDenoise.thresh/10) ; //boxvar(lab->data, lab->data, radius, radius, lab->W, lab->H); @@ -624,8 +625,8 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) { //impulse_nr (labtmp, 50.0f/20.0f); for (int i=0; idata[i] = 4*(labtmp->data[i]-lab->data[i])+10000; - lab->data[i] = sqrt(MAX(0,labtmp->data[i]/32768.0f))*32768.0f; + lab->data[i] = 4*(labtmp->data[i+datalen]-lab->data[i+datalen])+10000; + //lab->data[i] = sqrt(MAX(0,labtmp->data[i]/32768.0f))*32768.0f; } delete labtmp; @@ -636,9 +637,9 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) { void ImProcFunctions::defringe (LabImage* lab) { - if (params->defringe.enabled && lab->W>=8 && lab->H>=8) + //if (params->defringe.enabled && lab->W>=8 && lab->H>=8) - PF_correct_RT(lab, lab, params->defringe.radius, params->defringe.threshold); + //PF_correct_RT(lab, lab, params->defringe.radius, params->defringe.threshold); } void ImProcFunctions::dirpyrdenoise (LabImage* lab) {