diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index e2929abd1..d19d6aa2c 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -870,29 +870,71 @@ void RawImageSource::border_interpolate(unsigned int border, float (*image)[4], } } -void RawImageSource::border_interpolate2(unsigned int border, float (*image)[3], unsigned int start, unsigned int end) +void RawImageSource::border_interpolate2( int winw, int winh, int lborders) { - unsigned row, col, y, x, f, c, sum[8]; - unsigned int width=W, height=H; - unsigned int colors=3; +int bord=lborders; +int width=winw; +int height=winh; + for (int i=0; i= border && row < height-border) - col = width-border; - memset (sum, 0, sizeof sum); - for (y=row-1; y != row+2; y++) - for (x=col-1; x != col+2; x++) - if (y < height && x < width) { - f = fc(y,x); - sum[f] += image[y*width+x][f]; - sum[f+4]++; + float sum[6]; + + for (int j=0; j -1) && (i1 < height) && (j1 > -1)) { + int c = FC(i1,j1); + sum[c] += rawData[i1][j1]; + sum[c+3]++; } - f = fc(row,col); - FORCC if (c != f && sum[c+4]) - image[row*width+col][c] = sum[c] / sum[c+4]; - } + } + int c=FC(i,j); + if (c==1) { + red[i][j]=sum[0]/sum[3]; + green[i][j]=rawData[i][j]; + blue[i][j]=sum[2]/sum[5]; + } else { + green[i][j]=sum[1]/sum[4]; + if (c==0) { + red[i][j]=rawData[i][j]; + blue[i][j]=sum[2]/sum[5]; + } else { + red[i][j]=sum[0]/sum[3]; + blue[i][j]=rawData[i][j]; + } + } + }//j + + for (int j=width-bord; j -1) && (i1 < height ) && (j1 < width)) { + int c = FC(i1,j1); + sum[c] += rawData[i1][j1]; + sum[c+3]++; + } + } + int c=FC(i,j); + if (c==1) { + red[i][j]=sum[0]/sum[3]; + green[i][j]=rawData[i][j]; + blue[i][j]=sum[2]/sum[5]; + } else { + green[i][j]=sum[1]/sum[4]; + if (c==0) { + red[i][j]=rawData[i][j]; + blue[i][j]=sum[2]/sum[5]; + } else { + red[i][j]=sum[0]/sum[3]; + blue[i][j]=rawData[i][j]; + } + } + }//j + }//i + + } // Joint Demosaicing and Denoising using High Order Interpolation Techniques @@ -1021,7 +1063,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh) float (*qix)[6]; float (*glut); - const bool applyGamma=true; + bool applyGamma=true; char *buffer; const int width=winw, height=winh; @@ -1053,14 +1095,20 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh) float maxdata=0.f; // float epsil=0.00001f; unused image = (float (*)[4]) calloc (width*height, sizeof *image); - +// int curr0=0; +// int curr1=0; +// int curr2=0; unsigned int a=0; for (int ii=0; ii 65535.f) curr0=1; + // if(fc(ii,jj)==1 && currData > 65535.f) curr1=1; + // if(fc(ii,jj)==2 && currData > 65535.f) curr2=1; if (currData > maxdata) maxdata=currData; } +// if(curr1==1 || curr2==1 || curr0==1) applyGamma=false; // LMMSE without gamma = reduce artefact in highlight if(maxdata<65535.f) maxdata=65535.f; if (applyGamma) buffer = (char *)malloc(rr1*cc1*6*sizeof(float)+(int)(maxdata+1.f)*sizeof(float)); @@ -1315,9 +1363,9 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh) for (int ii=0; iisetProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::methodstring[RAWParams::igv])); plistener->setProgress (0.0); } - #ifdef _OPENMP #pragma omp parallel default(none) shared(rgb,vdif,hdif,chr) #endif @@ -1376,8 +1426,9 @@ void RawImageSource::igv_interpolate() for (int row=0; rowsetProgress (0.8); //Interpolate borders - border_interpolate2(7, rgb); +// border_interpolate2(7, rgb); } - +/* #ifdef _OPENMP #pragma omp for #endif @@ -1493,7 +1545,7 @@ void RawImageSource::igv_interpolate() green[row][col] = rgb[indxc][1]; blue [row][col] = rgb[indxc][2]; } - +*/ #ifdef _OPENMP #pragma omp single #endif diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index b77910bfe..8c2a98678 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1090,6 +1090,7 @@ void RawImageSource::demosaic(const RAWParams &raw) if (ri->isBayer()) { MyTime t1,t2; t1.set(); + bool nofast=true; if ( raw.dmethod == RAWParams::methodstring[RAWParams::hphd] ) hphd_demosaic (); else if (raw.dmethod == RAWParams::methodstring[RAWParams::vng4] ) @@ -1103,7 +1104,7 @@ void RawImageSource::demosaic(const RAWParams &raw) else if (raw.dmethod == RAWParams::methodstring[RAWParams::eahd]) eahd_demosaic (); else if (raw.dmethod == RAWParams::methodstring[RAWParams::igv]) - igv_interpolate(); + igv_interpolate(W,H); else if (raw.dmethod == RAWParams::methodstring[RAWParams::lmmse]) lmmse_interpolate_omp(W,H); else if (raw.dmethod == RAWParams::methodstring[RAWParams::fast] ) diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index e01f45e94..6fd5998f5 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -225,15 +225,15 @@ class RawImageSource : public ImageSource { void vng4_demosaic(); void ppg_demosaic(); void jdl_interpolate_omp(); - void igv_interpolate(); + void igv_interpolate(int winw, int winh); void lmmse_interpolate_omp(int winw, int winh); void amaze_demosaic_RT(int winx, int winy, int winw, int winh);//Emil's code for AMaZE - void fast_demosaic(int winx, int winy, int winw, int winh);//Emil's code for fast demosaicing + void fast_demosaic(int winx, int winy, int winw, int winh );//Emil's code for fast demosaicing void dcb_demosaic(int iterations, bool dcb_enhance); void ahd_demosaic(int winx, int winy, int winw, int winh); void border_interpolate(unsigned int border, float (*image)[4], unsigned int start = 0, unsigned int end = 0); - void border_interpolate2(unsigned int border, float (*image)[3], unsigned int start = 0, unsigned int end = 0); + void border_interpolate2(int winw, int winh, int lborders); void dcb_initTileLimits(int &colMin, int &rowMin, int &colMax, int &rowMax, int x0, int y0, int border); void fill_raw( float (*cache )[4], int x0, int y0, float** rawData); void fill_border( float (*cache )[4], int border, int x0, int y0);