diff --git a/rtengine/amaze_interpolate_RT.cc b/rtengine/amaze_interpolate_RT.cc index 5f6d7724e..e458c1f76 100644 --- a/rtengine/amaze_interpolate_RT.cc +++ b/rtengine/amaze_interpolate_RT.cc @@ -56,9 +56,8 @@ void RawImageSource::amaze_demosaic_RT() { int top, left; int ex, ey; - int rrmin, rrmax, ccmin, ccmax; static const int v1=TS, v2=2*TS, v3=3*TS, p1=-TS+1, p2=-2*TS+2, p3=-3*TS+3, m1=TS+1, m2=2*TS+2, m3=3*TS+3; - int nbr[5] = {-v2,-2,2,v2,0}; + static const int nbr[5] = {-v2,-2,2,v2,0}; static const float eps=1e-5; //tolerance to avoid dividing by zero static const float epssq=1e-10; //tolerance to avoid dividing by zero @@ -69,40 +68,22 @@ void RawImageSource::amaze_demosaic_RT() { static const float lbd=1.0, ubd=1.0;//lbd=0.66, ubd=1.5; static const float gaussodd[4] = {0.14659727707323927f, 0.103592713382435f, 0.0732036125103057f, 0.0365543548389495f};//gaussian on 5x5 quincunx, sigma=1.2 - float gaussgrad[6] = {0.07384411893421103f, 0.06207511968171489f, 0.0521818194747806f, \ + static const float gaussgrad[6] = {0.07384411893421103f, 0.06207511968171489f, 0.0521818194747806f, \ 0.03687419286733595f, 0.03099732204057846f, 0.018413194161458882f};//gaussian on 5x5, sigma=1.2 static const float gauss1[3] = {0.3376688223162362f, 0.12171198028231786f, 0.04387081413862306f};//gaussian on 3x3, sigma =0.7 static const float gausseven[2] = {0.13719494435797422f, 0.05640252782101291f};//gaussian on 5x5 alt quincunx, sigma=1.5 static const float gquinc[4] = {0.169917f, 0.108947f, 0.069855f, 0.0287182f}; - - //tile vars - int bottom, right, row, col; - int rr, cc, rr1, cc1, c, indx, indx1, dir, i, j, sgn; - - float crse, crnw, crne, crsw, rbse, rbnw, rbne, rbsw, wtse, wtnw, wtsw, wtne; - float pmwtalt; + // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - float cru, crd, crl, crr; - float vwt, hwt, pwt, mwt, Gintv, Ginth; - float guar, gdar, glar, grar, guha, gdha, glha, grha, Ginthar, Ginthha, Gintvar, Gintvha, hcdaltvar, vcdaltvar; - float Dgrbvvaru, Dgrbvvard, Dgrbhvarl, Dgrbhvarr; - float sumh, sumv, sumsqh, sumsqv, areawt; - float nyqtest, vcdvar, hcdvar, hvwtalt, vo, ve, gradp, gradm, gradv, gradh, gradpm, gradhv; - float vcdvar1, hcdvar1, varwt, diffwt; - float rbvarp, rbvarm; - float gu, gd, gl, gr; - float gvarh, gvarv; - float g[4], f[4]; - - char *buffer; // TS*TS*168 float (*rgb)[3]; // TS*TS*12 float (*delh); // TS*TS*4 float (*delv); // TS*TS*4 float (*delhsq); // TS*TS*4 float (*delvsq); // TS*TS*4 + float (*dirwts)[2]; // TS*TS*8 float (*vcd); // TS*TS*4 float (*hcd); // TS*TS*4 float (*vcdalt); // TS*TS*4 @@ -115,11 +96,6 @@ void RawImageSource::amaze_demosaic_RT() { float (*delp); // TS*TS*4 float (*delm); // TS*TS*4 float (*rbint); // TS*TS*4 - float (*dirwts)[2]; // TS*TS*8 - float (*Dgrbh1); // TS*TS*4 - float (*Dgrbv1); // TS*TS*4 - float (*Dgrbhsq1); // TS*TS*4 - float (*Dgrbvsq1); // TS*TS*4 float (*Dgrbh2); // TS*TS*4 float (*Dgrbv2); // TS*TS*4 float (*dgintv); // TS*TS*4 @@ -137,46 +113,42 @@ void RawImageSource::amaze_demosaic_RT() { // assign working space - buffer = (char *) malloc(156*TS*TS); + buffer = (char *) malloc((34*sizeof(float)+sizeof(int))*TS*TS); //merror(buffer,"amaze_interpolate()"); - memset(buffer,0,156*TS*TS); + memset(buffer,0,(34*sizeof(float)+sizeof(int))*TS*TS); // rgb array rgb = (float (*)[3]) buffer; //pointers to array - delh = (float (*)) (buffer + 12*TS*TS); - delv = (float (*)) (buffer + 16*TS*TS); - delhsq = (float (*)) (buffer + 20*TS*TS); - delvsq = (float (*)) (buffer + 24*TS*TS); - vcd = (float (*)) (buffer + 28*TS*TS); - hcd = (float (*)) (buffer + 32*TS*TS); - vcdalt = (float (*)) (buffer + 36*TS*TS); - hcdalt = (float (*)) (buffer + 40*TS*TS); - vcdsq = (float (*)) (buffer + 44*TS*TS); - hcdsq = (float (*)) (buffer + 48*TS*TS); - cddiffsq = (float (*)) (buffer + 52*TS*TS); - hvwt = (float (*)) (buffer + 56*TS*TS); - Dgrb = (float (*)[2]) (buffer + 60*TS*TS); - delp = (float (*)) (buffer + 68*TS*TS); - delm = (float (*)) (buffer + 72*TS*TS); - rbint = (float (*)) (buffer + 76*TS*TS); - dirwts = (float (*)[2]) (buffer + 80*TS*TS); - Dgrbh1 = (float (*)) (buffer + 88*TS*TS); - Dgrbv1 = (float (*)) (buffer + 92*TS*TS); - Dgrbhsq1 = (float (*)) (buffer + 96*TS*TS); - Dgrbvsq1 = (float (*)) (buffer + 100*TS*TS); - Dgrbh2 = (float (*)) (buffer + 104*TS*TS); - Dgrbv2 = (float (*)) (buffer + 108*TS*TS); - dgintv = (float (*)) (buffer + 112*TS*TS); - dginth = (float (*)) (buffer + 116*TS*TS); - Dgrbp1 = (float (*)) (buffer + 120*TS*TS); - Dgrbm1 = (float (*)) (buffer + 124*TS*TS); - Dgrbpsq1 = (float (*)) (buffer + 128*TS*TS); - Dgrbmsq1 = (float (*)) (buffer + 132*TS*TS); - cfa = (float (*)) (buffer + 136*TS*TS); - pmwt = (float (*)) (buffer + 140*TS*TS); - rbp = (float (*)) (buffer + 144*TS*TS); - rbm = (float (*)) (buffer + 148*TS*TS); + delh = (float (*)) (buffer + 3*sizeof(float)*TS*TS); + delv = (float (*)) (buffer + 4*sizeof(float)*TS*TS); + delhsq = (float (*)) (buffer + 5*sizeof(float)*TS*TS); + delvsq = (float (*)) (buffer + 6*sizeof(float)*TS*TS); + dirwts = (float (*)[2]) (buffer + 7*sizeof(float)*TS*TS); + vcd = (float (*)) (buffer + 9*sizeof(float)*TS*TS); + hcd = (float (*)) (buffer + 10*sizeof(float)*TS*TS); + vcdalt = (float (*)) (buffer + 11*sizeof(float)*TS*TS); + hcdalt = (float (*)) (buffer + 12*sizeof(float)*TS*TS); + vcdsq = (float (*)) (buffer + 13*sizeof(float)*TS*TS); + hcdsq = (float (*)) (buffer + 14*sizeof(float)*TS*TS); + cddiffsq = (float (*)) (buffer + 15*sizeof(float)*TS*TS); + hvwt = (float (*)) (buffer + 16*sizeof(float)*TS*TS); + Dgrb = (float (*)[2]) (buffer + 17*sizeof(float)*TS*TS); + delp = (float (*)) (buffer + 19*sizeof(float)*TS*TS); + delm = (float (*)) (buffer + 20*sizeof(float)*TS*TS); + rbint = (float (*)) (buffer + 21*sizeof(float)*TS*TS); + Dgrbh2 = (float (*)) (buffer + 22*sizeof(float)*TS*TS); + Dgrbv2 = (float (*)) (buffer + 23*sizeof(float)*TS*TS); + dgintv = (float (*)) (buffer + 24*sizeof(float)*TS*TS); + dginth = (float (*)) (buffer + 25*sizeof(float)*TS*TS); + Dgrbp1 = (float (*)) (buffer + 26*sizeof(float)*TS*TS); + Dgrbm1 = (float (*)) (buffer + 27*sizeof(float)*TS*TS); + Dgrbpsq1 = (float (*)) (buffer + 28*sizeof(float)*TS*TS); + Dgrbmsq1 = (float (*)) (buffer + 29*sizeof(float)*TS*TS); + cfa = (float (*)) (buffer + 30*sizeof(float)*TS*TS); + pmwt = (float (*)) (buffer + 31*sizeof(float)*TS*TS); + rbp = (float (*)) (buffer + 32*sizeof(float)*TS*TS); + rbm = (float (*)) (buffer + 33*sizeof(float)*TS*TS); - nyquist = (int (*)) (buffer + 152*TS*TS); + nyquist = (int (*)) (buffer + 34*sizeof(float)*TS*TS); // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -207,7 +179,7 @@ void RawImageSource::amaze_demosaic_RT() { // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - //determine GRBG coset + //determine GRBG coset; (ey,ex) is the offset of the R subarray if (FC(0,0)==1) {//first pixel is G if (FC(0,1)==0) {ey=0; ex=1;} else {ey=1; ex=0;} } else {//first pixel is R or B @@ -219,10 +191,108 @@ void RawImageSource::amaze_demosaic_RT() { //code is openmp ready; just have to pull local tile variable declarations inside the tile loop for (top=-16; top < height; top += TS-32) for (left=-16; left < width; left += TS-32) { - bottom = MIN( top+TS,height+16); - right = MIN(left+TS, width+16); - rr1 = bottom - top; - cc1 = right - left; + int bottom = MIN( top+TS,height+16); + int right = MIN(left+TS, width+16); + int rr1 = bottom - top; + int cc1 = right - left; + + //tile vars + int row, col; + int rrmin, rrmax, ccmin, ccmax; + int rr, cc, c, indx, indx1, dir, i, j, sgn; + + float crse, crnw, crne, crsw, rbse, rbnw, rbne, rbsw, wtse, wtnw, wtsw, wtne; + float pmwtalt; + + float cru, crd, crl, crr; + float vwt, hwt, pwt, mwt, Gintv, Ginth; + float guar, gdar, glar, grar, guha, gdha, glha, grha, Ginthar, Ginthha, Gintvar, Gintvha, hcdaltvar, vcdaltvar; + float Dgrbvvaru, Dgrbvvard, Dgrbhvarl, Dgrbhvarr; + float sumh, sumv, sumsqh, sumsqv, areawt; + float nyqtest, vcdvar, hcdvar, hvwtalt, vo, ve, gradp, gradm, gradv, gradh, gradpm, gradhv; + float vcdvar1, hcdvar1, varwt, diffwt; + float rbvarp, rbvarm; + float gu, gd, gl, gr; + float gvarh, gvarv; + + // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/* + char *buffer; // TS*TS*168 + float (*rgb)[3]; // TS*TS*12 + float (*delh); // TS*TS*4 + float (*delv); // TS*TS*4 + float (*delhsq); // TS*TS*4 + float (*delvsq); // TS*TS*4 + float (*dirwts)[2]; // TS*TS*8 + float (*vcd); // TS*TS*4 + float (*hcd); // TS*TS*4 + float (*vcdalt); // TS*TS*4 + float (*hcdalt); // TS*TS*4 + float (*vcdsq); // TS*TS*4 + float (*hcdsq); // TS*TS*4 + float (*cddiffsq); // TS*TS*4 + float (*hvwt); // TS*TS*4 + float (*Dgrb)[2]; // TS*TS*8 + float (*delp); // TS*TS*4 + float (*delm); // TS*TS*4 + float (*rbint); // TS*TS*4 + float (*Dgrbh2); // TS*TS*4 + float (*Dgrbv2); // TS*TS*4 + float (*dgintv); // TS*TS*4 + float (*dginth); // TS*TS*4 + float (*Dgrbp1); // TS*TS*4 + float (*Dgrbm1); // TS*TS*4 + float (*Dgrbpsq1); // TS*TS*4 + float (*Dgrbmsq1); // TS*TS*4 + float (*cfa); // TS*TS*4 + float (*pmwt); // TS*TS*4 + float (*rbp); // TS*TS*4 + float (*rbm); // TS*TS*4 + + int (*nyquist); // TS*TS*4 + + + // assign working space + buffer = (char *) malloc(35*sizeof(float)*TS*TS); + //merror(buffer,"amaze_interpolate()"); + memset(buffer,0,35*sizeof(float)*TS*TS); + // rgb array + rgb = (float (*)[3]) buffer; //pointers to array + delh = (float (*)) (buffer + 3*sizeof(float)*TS*TS); + delv = (float (*)) (buffer + 4*sizeof(float)*TS*TS); + delhsq = (float (*)) (buffer + 5*sizeof(float)*TS*TS); + delvsq = (float (*)) (buffer + 6*sizeof(float)*TS*TS); + dirwts = (float (*)[2]) (buffer + 7*sizeof(float)*TS*TS); + vcd = (float (*)) (buffer + 9*sizeof(float)*TS*TS); + hcd = (float (*)) (buffer + 10*sizeof(float)*TS*TS); + vcdalt = (float (*)) (buffer + 11*sizeof(float)*TS*TS); + hcdalt = (float (*)) (buffer + 12*sizeof(float)*TS*TS); + vcdsq = (float (*)) (buffer + 13*sizeof(float)*TS*TS); + hcdsq = (float (*)) (buffer + 14*sizeof(float)*TS*TS); + cddiffsq = (float (*)) (buffer + 15*sizeof(float)*TS*TS); + hvwt = (float (*)) (buffer + 16*sizeof(float)*TS*TS); + Dgrb = (float (*)[2]) (buffer + 17*sizeof(float)*TS*TS); + delp = (float (*)) (buffer + 19*sizeof(float)*TS*TS); + delm = (float (*)) (buffer + 20*sizeof(float)*TS*TS); + rbint = (float (*)) (buffer + 21*sizeof(float)*TS*TS); + Dgrbh2 = (float (*)) (buffer + 22*sizeof(float)*TS*TS); + Dgrbv2 = (float (*)) (buffer + 23*sizeof(float)*TS*TS); + dgintv = (float (*)) (buffer + 24*sizeof(float)*TS*TS); + dginth = (float (*)) (buffer + 25*sizeof(float)*TS*TS); + Dgrbp1 = (float (*)) (buffer + 26*sizeof(float)*TS*TS); + Dgrbm1 = (float (*)) (buffer + 27*sizeof(float)*TS*TS); + Dgrbpsq1 = (float (*)) (buffer + 28*sizeof(float)*TS*TS); + Dgrbmsq1 = (float (*)) (buffer + 29*sizeof(float)*TS*TS); + cfa = (float (*)) (buffer + 30*sizeof(float)*TS*TS); + pmwt = (float (*)) (buffer + 31*sizeof(float)*TS*TS); + rbp = (float (*)) (buffer + 32*sizeof(float)*TS*TS); + rbm = (float (*)) (buffer + 33*sizeof(float)*TS*TS); + + nyquist = (int (*)) (buffer + 34*sizeof(float)*TS*TS); +*/ + // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + // rgb from input CFA data // rgb values should be floating point number between 0 and 1 // after white balance multipliers are applied @@ -356,9 +426,9 @@ void RawImageSource::amaze_demosaic_RT() { //interpolate vertical and horizontal color differences //t1_vcdhcd = clock(); - for (rr=4; rr0) {nyquist[indx]=1;}//nyquist=1 for nyquist region } - for (rr=8; rrsetProgress(fabs((float)top/height)); }