double interpolate_2d_linear_gray(double Tlocalx, double Tlocaly, int *Isize, double *Iin) { /* Linear interpolation variables */ int xBas0, xBas1, yBas0, yBas1; double perc[4]={0, 0, 0, 0}; double xCom, yCom, xComi, yComi; double color[4]={0, 0, 0, 0}; /* Rounded location */ double fTlocalx, fTlocaly; /* Determine the coordinates of the pixel(s) which will be come the current pixel */ /* (using linear interpolation) */ fTlocalx = floor(Tlocalx); fTlocaly = floor(Tlocaly); xBas0=(int) fTlocalx; yBas0=(int) fTlocaly; xBas1=xBas0+1; yBas1=yBas0+1; /* Linear interpolation constants (percentages) */ xCom=Tlocalx-fTlocalx; yCom=Tlocaly-fTlocaly; xComi=(1-xCom); yComi=(1-yCom); perc[0]=xComi * yComi; perc[1]=xComi * yCom; perc[2]=xCom * yComi; perc[3]=xCom * yCom; if(xBas0<0) { xBas0=0; if(xBas1<0) { xBas1=0; }} if(yBas0<0) { yBas0=0; if(yBas1<0) { yBas1=0; }} if(xBas1>(Isize[0]-1)) { xBas1=Isize[0]-1; if(xBas0>(Isize[0]-1)) { xBas0=Isize[0]-1; }} if(yBas1>(Isize[1]-1)) { yBas1=Isize[1]-1; if(yBas0>(Isize[1]-1)) { yBas0=Isize[1]-1; }} color[0]=getintensity_mindex2(xBas0, yBas0, Isize[0], Isize[1], Iin); color[1]=getintensity_mindex2(xBas0, yBas1, Isize[0], Isize[1], Iin); color[2]=getintensity_mindex2(xBas1, yBas0, Isize[0], Isize[1], Iin); color[3]=getintensity_mindex2(xBas1, yBas1, Isize[0], Isize[1], Iin); return color[0]*perc[0]+color[1]*perc[1]+color[2]*perc[2]+color[3]*perc[3]; }
double interpolate_2d_linear_gray_black(double Tlocalx, double Tlocaly, int *Isize, double *Iin) { /* Linear interpolation variables */ int xBas0, xBas1, yBas0, yBas1; double perc[4]={0, 0, 0, 0}; double xCom, yCom, xComi, yComi; double Ipixel=0; /* Rounded location */ double fTlocalx, fTlocaly; /* Determine the coordinates of the pixel(s) which will be come the current pixel */ /* (using linear interpolation) */ fTlocalx = floor(Tlocalx); fTlocaly = floor(Tlocaly); xBas0=(int) fTlocalx; yBas0=(int) fTlocaly; xBas1=xBas0+1; yBas1=yBas0+1; /* Linear interpolation constants (percentages) */ xCom=Tlocalx-fTlocalx; yCom=Tlocaly-fTlocaly; xComi=(1-xCom); yComi=(1-yCom); perc[0]=xComi * yComi; perc[1]=xComi * yCom; perc[2]=xCom * yComi; perc[3]=xCom * yCom; if((xBas0>=0)&&(xBas0<Isize[0])) { if((yBas0>=0)&&(yBas0<Isize[1])) { Ipixel+=getintensity_mindex2(xBas0, yBas0, Isize[0], Isize[1], Iin)*perc[0]; } if((yBas1>=0)&&(yBas1<Isize[1])) { Ipixel+=getintensity_mindex2(xBas0, yBas1, Isize[0], Isize[1], Iin)*perc[1]; } } if((xBas1>=0)&&(xBas1<Isize[0])) { if((yBas0>=0)&&(yBas0<Isize[1])) { Ipixel+=getintensity_mindex2(xBas1, yBas0, Isize[0], Isize[1], Iin)*perc[2]; } if((yBas1>=0)&&(yBas1<Isize[1])) { Ipixel+=getintensity_mindex2(xBas1, yBas1, Isize[0], Isize[1], Iin)*perc[3]; } } return Ipixel; }
double interpolate_2d_cubic_gray_black(double Tlocalx, double Tlocaly, int *Isize, double *Iin) { /* Floor of coordinate */ double fTlocalx, fTlocaly; /* Zero neighbor */ int xBas0, yBas0; /* The location in between the pixels 0..1 */ double tx, ty; /* Neighbor loccations */ int xn[4], yn[4]; /* The vectors */ double vector_tx[4], vector_ty[4]; double vector_qx[4], vector_qy[4]; /* Interpolated Intensity; */ double Ipixel=0, Ipixelx=0; /* Loop variable */ int i; /* Determine of the zero neighbor */ fTlocalx = floor(Tlocalx); fTlocaly = floor(Tlocaly); xBas0=(int) fTlocalx; yBas0=(int) fTlocaly; /* Determine the location in between the pixels 0..1 */ tx=Tlocalx-fTlocalx; ty=Tlocaly-fTlocaly; /* Determine the t vectors */ vector_tx[0]= 0.5; vector_tx[1]= 0.5*tx; vector_tx[2]= 0.5*pow2(tx); vector_tx[3]= 0.5*pow3(tx); vector_ty[0]= 0.5; vector_ty[1]= 0.5*ty; vector_ty[2]= 0.5*pow2(ty); vector_ty[3]= 0.5*pow3(ty); /* t vector multiplied with 4x4 bicubic kernel gives the to q vectors */ vector_qx[0]= -1.0*vector_tx[1]+2.0*vector_tx[2]-1.0*vector_tx[3]; vector_qx[1]= 2.0*vector_tx[0]-5.0*vector_tx[2]+3.0*vector_tx[3]; vector_qx[2]= 1.0*vector_tx[1]+4.0*vector_tx[2]-3.0*vector_tx[3]; vector_qx[3]= -1.0*vector_tx[2]+1.0*vector_tx[3]; vector_qy[0]= -1.0*vector_ty[1]+2.0*vector_ty[2]-1.0*vector_ty[3]; vector_qy[1]= 2.0*vector_ty[0]-5.0*vector_ty[2]+3.0*vector_ty[3]; vector_qy[2]= 1.0*vector_ty[1]+4.0*vector_ty[2]-3.0*vector_ty[3]; vector_qy[3]= -1.0*vector_ty[2]+1.0*vector_ty[3]; /* Determine 1D neighbour coordinates */ xn[0]=xBas0-1; xn[1]=xBas0; xn[2]=xBas0+1; xn[3]=xBas0+2; yn[0]=yBas0-1; yn[1]=yBas0; yn[2]=yBas0+1; yn[3]=yBas0+2; /* First do interpolation in the x direction followed by interpolation in the y direction */ for(i=0; i<4; i++) { Ipixelx=0; if((yn[i]>=0)&&(yn[i]<Isize[1])) { if((xn[0]>=0)&&(xn[0]<Isize[0])) { Ipixelx+=vector_qx[0]*getintensity_mindex2(xn[0], yn[i], Isize[0], Isize[1], Iin); } if((xn[1]>=0)&&(xn[1]<Isize[0])) { Ipixelx+=vector_qx[1]*getintensity_mindex2(xn[1], yn[i], Isize[0], Isize[1], Iin); } if((xn[2]>=0)&&(xn[2]<Isize[0])) { Ipixelx+=vector_qx[2]*getintensity_mindex2(xn[2], yn[i], Isize[0], Isize[1], Iin); } if((xn[3]>=0)&&(xn[3]<Isize[0])) { Ipixelx+=vector_qx[3]*getintensity_mindex2(xn[3], yn[i], Isize[0], Isize[1], Iin); } } Ipixel+= vector_qy[i]*Ipixelx; } return Ipixel; }
__inline double interpolate_2d_cubic_gray(double Tlocalx, double Tlocaly, int *Isize, double *Iin) { /* Floor of coordinate */ double fTlocalx, fTlocaly; /* Zero neighbor */ int xBas0, yBas0; /* The location in between the pixels 0..1 */ double tx, ty; /* Neighbor loccations */ int xn[4], yn[4]; /* The vectors */ double vector_tx[4],vector_ty[4]; double vector_qx[4]; /*={0.25,0.25,0.25,0.25}; */ double vector_qy[4]; /*={0.25,0.25,0.25,0.25}; */ double vector_b[4]; /* Interpolated Intensity; */ double Ipixel=0; /* Temporary value boundary */ int b; /* Loop variable */ int i; /* Determine of the zero neighbor */ fTlocalx = floor(Tlocalx); fTlocaly = floor(Tlocaly); xBas0=(int) fTlocalx; yBas0=(int) fTlocaly; /* Determine the location in between the pixels 0..1 */ tx=Tlocalx-fTlocalx; ty=Tlocaly-fTlocaly; /* Determine the t vectors */ vector_tx[0]= 0.5; vector_tx[1]= 0.5*tx; vector_tx[2]= 0.5*pow2(tx); vector_tx[3]= 0.5*pow3(tx); vector_ty[0]= 0.5; vector_ty[1]= 0.5*ty; vector_ty[2]= 0.5*pow2(ty); vector_ty[3]= 0.5*pow3(ty); /* t vector multiplied with 4x4 bicubic kernel gives the to q vectors */ vector_qx[0]= -1.0*vector_tx[1]+2.0*vector_tx[2]-1.0*vector_tx[3]; vector_qx[1]= 2.0*vector_tx[0]-5.0*vector_tx[2]+3.0*vector_tx[3]; vector_qx[2]= 1.0*vector_tx[1]+4.0*vector_tx[2]-3.0*vector_tx[3]; vector_qx[3]= -1.0*vector_tx[2]+1.0*vector_tx[3]; vector_qy[0]= -1.0*vector_ty[1]+2.0*vector_ty[2]-1.0*vector_ty[3]; vector_qy[1]= 2.0*vector_ty[0]-5.0*vector_ty[2]+3.0*vector_ty[3]; vector_qy[2]= 1.0*vector_ty[1]+4.0*vector_ty[2]-3.0*vector_ty[3]; vector_qy[3]= -1.0*vector_ty[2]+1.0*vector_ty[3]; /* Determine 1D neighbour coordinates */ xn[0]=xBas0-1; xn[1]=xBas0; xn[2]=xBas0+1; xn[3]=xBas0+2; yn[0]=yBas0-1; yn[1]=yBas0; yn[2]=yBas0+1; yn[3]=yBas0+2; /* Clamp to image boundary if outside image */ if(xn[0]<0) { xn[0]=0;if(xn[1]<0) { xn[1]=0;if(xn[2]<0) { xn[2]=0; if(xn[3]<0) { xn[3]=0; }}}} if(yn[0]<0) { yn[0]=0;if(yn[1]<0) { yn[1]=0;if(yn[2]<0) { yn[2]=0; if(yn[3]<0) { yn[3]=0; }}}} b=Isize[0]-1; if(xn[3]>b) { xn[3]=b;if(xn[2]>b) { xn[2]=b;if(xn[1]>b) { xn[1]=b; if(xn[0]>b) { xn[0]=b; }}}} b=Isize[1]-1; if(yn[3]>b) { yn[3]=b;if(yn[2]>b) { yn[2]=b;if(yn[1]>b) { yn[1]=b; if(yn[0]>b) { yn[0]=b; }}}} /* First do interpolation in the x direction followed by interpolation in the y direction */ for(i=0; i<4; i++) { vector_b[i] =vector_qx[0]*getintensity_mindex2(xn[0], yn[i], Isize[0], Isize[1], Iin); vector_b[i]+=vector_qx[1]*getintensity_mindex2(xn[1], yn[i], Isize[0], Isize[1], Iin); vector_b[i]+=vector_qx[2]*getintensity_mindex2(xn[2], yn[i], Isize[0], Isize[1], Iin); vector_b[i]+=vector_qx[3]*getintensity_mindex2(xn[3], yn[i], Isize[0], Isize[1], Iin); Ipixel+= vector_qy[i]*vector_b[i]; } return Ipixel; }