4,496
社区成员




template<class T1,class T2>
inline void CubicInterpolation(MImageArray<T1>* sourceImage,MImageArray<T2>* targetImage,int targetIndex,float dblXX,float dblYY)
{
int intXX,intYY;
intXX=floor(dblXX);
intYY=floor(dblYY);
float u,v;
u=dblXX-intXX;
v=dblYY-intYY;
float u0,u1,u2,u3;
float v0,v1,v2,v3;
u0=1+u;
u1=u;
u2=1-u;
u3=2-u;
v0=1+v;
v1=v;
v2=1-v;
v3=2-v;
u0=4-8*u0+5*u0*u0-u0*u0*u0;
u1=1-2*u1*u1+u1*u1*u1;
u2=1-2*u2*u2+u2*u2*u2;
u3=4-8*u3+5*u3*u3-u3*u3*u3;
v0=4-8*v0+5*v0*v0-v0*v0*v0;
v1=1-2*v1*v1+v1*v1*v1;
v2=1-2*v2*v2+v2*v2*v2;
v3=4-8*v3+5*v3*v3-v3*v3*v3;
float f00,f01,f02,f03;
float f10,f11,f12,f13;
float f20,f21,f22,f23;
float f30,f31,f32,f33;
f00=sourceImage->at(intXX-1,intYY-1);
f01=sourceImage->at(intXX,intYY-1);
f02=sourceImage->at(intXX+1,intYY-1);
f03=sourceImage->at(intXX+2,intYY-1);
f10=sourceImage->at(intXX-1,intYY);
f11=sourceImage->at(intXX,intYY);
f12=sourceImage->at(intXX+1,intYY);
f13=sourceImage->at(intXX+2,intYY);
f20=sourceImage->at(intXX-1,intYY+1);
f21=sourceImage->at(intXX,intYY+1);
f22=sourceImage->at(intXX+1,intYY+1);
f23=sourceImage->at(intXX+2,intYY+1);
f30=sourceImage->at(intXX-1,intYY+2);
f31=sourceImage->at(intXX,intYY+2);
f32=sourceImage->at(intXX+1,intYY+2);
f33=sourceImage->at(intXX+2,intYY+2);
float g0,g1,g2,g3;
g0=v0*f00+v1*f10+v2*f20+v3*f30;
g1=v0*f01+v1*f11+v2*f21+v3*f31;
g2=v0*f02+v1*f12+v2*f22+v3*f32;
g3=v0*f03+v1*f13+v2*f23+v3*f33;
float s;
s=g0*u0+g1*u1+g2*u2+g3*u3;
if (s<0) s=0;
if (s>255) s=255;
targetImage->at(targetIndex)=s;
}