📄 ximaint.cpp
字号:
return(0.0f); */}/////////////////////////////////////////////////////////////////////////////////** * Bilinear interpolation kernel: \verbatim / | 1-t , if 0 <= t <= 1 h(t) = | t+1 , if -1 <= t < 0 | 0 , otherwise \ \endverbatim * ***bd*** 2.2004 */float CxImage::KernelLinear(const float t){// if (0<=t && t<=1) return 1-t;// if (-1<=t && t<0) return 1+t;// return 0; //<Vladim韗 Kloucek> if (t < -1.0f) return 0.0f; if (t < 0.0f) return 1.0f+t; if (t < 1.0f) return 1.0f-t; return 0.0f;}/////////////////////////////////////////////////////////////////////////////////** * Bicubic interpolation kernel (a=-1): \verbatim / | 1-2|t|**2+|t|**3 , if |t| < 1 h(t) = | 4-8|t|+5|t|**2-|t|**3 , if 1<=|t|<2 | 0 , otherwise \ \endverbatim * ***bd*** 2.2004 */float CxImage::KernelCubic(const float t){ float abs_t = (float)fabs(t); float abs_t_sq = abs_t * abs_t; if (abs_t<1) return 1-2*abs_t_sq+abs_t_sq*abs_t; if (abs_t<2) return 4 - 8*abs_t +5*abs_t_sq - abs_t_sq*abs_t; return 0;}/////////////////////////////////////////////////////////////////////////////////** * Bicubic kernel (for a=-1 it is the same as BicubicKernel): \verbatim / | (a+2)|t|**3 - (a+3)|t|**2 + 1 , |t| <= 1 h(t) = | a|t|**3 - 5a|t|**2 + 8a|t| - 4a , 1 < |t| <= 2 | 0 , otherwise \ \endverbatim * Often used values for a are -1 and -1/2. */float CxImage::KernelGeneralizedCubic(const float t, const float a){ float abs_t = (float)fabs(t); float abs_t_sq = abs_t * abs_t; if (abs_t<1) return (a+2)*abs_t_sq*abs_t - (a+3)*abs_t_sq + 1; if (abs_t<2) return a*abs_t_sq*abs_t - 5*a*abs_t_sq + 8*a*abs_t - 4*a; return 0;}/////////////////////////////////////////////////////////////////////////////////** * Lanczos windowed sinc interpolation kernel with radius r. \verbatim / h(t) = | sinc(t)*sinc(t/r) , if |t|<r | 0 , otherwise \ \endverbatim * ***bd*** 2.2004 */float CxImage::KernelLanczosSinc(const float t, const float r){ if (fabs(t) > r) return 0; if (t==0) return 1; float pit=PI*t; float pitd=pit/r; return (float)((sin(pit)/pit) * (sin(pitd)/pitd));}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelBox(const float x){ if (x < -0.5f) return 0.0f; if (x < 0.5f) return 1.0f; return 0.0f;}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelHermite(const float x){ if (x < -1.0f) return 0.0f; if (x < 0.0f) return (-2.0f*x-3.0f)*x*x+1.0f; if (x < 1.0f) return (2.0f*x-3.0f)*x*x+1.0f; return 0.0f;// if (fabs(x)>1) return 0.0f;// return(0.5f+0.5f*(float)cos(PI*x));}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelHamming(const float x){ if (x < -1.0f) return 0.0f; if (x < 0.0f) return 0.92f*(-2.0f*x-3.0f)*x*x+1.0f; if (x < 1.0f) return 0.92f*(2.0f*x-3.0f)*x*x+1.0f; return 0.0f;// if (fabs(x)>1) return 0.0f;// return(0.54f+0.46f*(float)cos(PI*x));}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelSinc(const float x){ if (x == 0.0) return(1.0); return((float)sin(PI*x)/(PI*x));}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelBlackman(const float x){ //if (fabs(x)>1) return 0.0f; return (0.42f+0.5f*(float)cos(PI*x)+0.08f*(float)cos(2.0f*PI*x));}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelBessel_J1(const float x){ double p, q; register long i; static const double Pone[] = { 0.581199354001606143928050809e+21, -0.6672106568924916298020941484e+20, 0.2316433580634002297931815435e+19, -0.3588817569910106050743641413e+17, 0.2908795263834775409737601689e+15, -0.1322983480332126453125473247e+13, 0.3413234182301700539091292655e+10, -0.4695753530642995859767162166e+7, 0.270112271089232341485679099e+4 }, Qone[] = { 0.11623987080032122878585294e+22, 0.1185770712190320999837113348e+20, 0.6092061398917521746105196863e+17, 0.2081661221307607351240184229e+15, 0.5243710262167649715406728642e+12, 0.1013863514358673989967045588e+10, 0.1501793594998585505921097578e+7, 0.1606931573481487801970916749e+4, 0.1e+1 }; p = Pone[8]; q = Qone[8]; for (i=7; i >= 0; i--) { p = p*x*x+Pone[i]; q = q*x*x+Qone[i]; } return (float)(p/q);}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelBessel_P1(const float x){ double p, q; register long i; static const double Pone[] = { 0.352246649133679798341724373e+5, 0.62758845247161281269005675e+5, 0.313539631109159574238669888e+5, 0.49854832060594338434500455e+4, 0.2111529182853962382105718e+3, 0.12571716929145341558495e+1 }, Qone[] = { 0.352246649133679798068390431e+5, 0.626943469593560511888833731e+5, 0.312404063819041039923015703e+5, 0.4930396490181088979386097e+4, 0.2030775189134759322293574e+3, 0.1e+1 }; p = Pone[5]; q = Qone[5]; for (i=4; i >= 0; i--) { p = p*(8.0/x)*(8.0/x)+Pone[i]; q = q*(8.0/x)*(8.0/x)+Qone[i]; } return (float)(p/q);}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelBessel_Q1(const float x){ double p, q; register long i; static const double Pone[] = { 0.3511751914303552822533318e+3, 0.7210391804904475039280863e+3, 0.4259873011654442389886993e+3, 0.831898957673850827325226e+2, 0.45681716295512267064405e+1, 0.3532840052740123642735e-1 }, Qone[] = { 0.74917374171809127714519505e+4, 0.154141773392650970499848051e+5, 0.91522317015169922705904727e+4, 0.18111867005523513506724158e+4, 0.1038187585462133728776636e+3, 0.1e+1 }; p = Pone[5]; q = Qone[5]; for (i=4; i >= 0; i--) { p = p*(8.0/x)*(8.0/x)+Pone[i]; q = q*(8.0/x)*(8.0/x)+Qone[i]; } return (float)(p/q);}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelBessel_Order1(float x){ float p, q; if (x == 0.0) return (0.0f); p = x; if (x < 0.0) x=(-x); if (x < 8.0) return(p*KernelBessel_J1(x)); q = (float)sqrt(2.0f/(PI*x))*(float)(KernelBessel_P1(x)*(1.0f/sqrt(2.0f)*(sin(x)-cos(x)))-8.0f/x*KernelBessel_Q1(x)* (-1.0f/sqrt(2.0f)*(sin(x)+cos(x)))); if (p < 0.0f) q = (-q); return (q);}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelBessel(const float x){ if (x == 0.0f) return(PI/4.0f); return(KernelBessel_Order1(PI*x)/(2.0f*x));}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelGaussian(const float x){ return (float)(exp(-2.0f*x*x)*0.79788456080287f/*sqrt(2.0f/PI)*/);}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelQuadratic(const float x){ if (x < -1.5f) return(0.0f); if (x < -0.5f) return(0.5f*(x+1.5f)*(x+1.5f)); if (x < 0.5f) return(0.75f-x*x); if (x < 1.5f) return(0.5f*(x-1.5f)*(x-1.5f)); return(0.0f);}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelMitchell(const float x){#define KM_B (1.0f/3.0f)#define KM_C (1.0f/3.0f)#define KM_P0 (( 6.0f - 2.0f * KM_B ) / 6.0f)#define KM_P2 ((-18.0f + 12.0f * KM_B + 6.0f * KM_C) / 6.0f)#define KM_P3 (( 12.0f - 9.0f * KM_B - 6.0f * KM_C) / 6.0f)#define KM_Q0 (( 8.0f * KM_B + 24.0f * KM_C) / 6.0f)#define KM_Q1 ((-12.0f * KM_B - 48.0f * KM_C) / 6.0f)#define KM_Q2 (( 6.0f * KM_B + 30.0f * KM_C) / 6.0f)#define KM_Q3 (( -1.0f * KM_B - 6.0f * KM_C) / 6.0f) if (x < -2.0) return(0.0f); if (x < -1.0) return(KM_Q0-x*(KM_Q1-x*(KM_Q2-x*KM_Q3))); if (x < 0.0f) return(KM_P0+x*x*(KM_P2-x*KM_P3)); if (x < 1.0f) return(KM_P0+x*x*(KM_P2+x*KM_P3)); if (x < 2.0f) return(KM_Q0+x*(KM_Q1+x*(KM_Q2+x*KM_Q3))); return(0.0f);}////////////////////////////////////////////////////////////////////////////////float CxImage::KernelCatrom(const float x){ if (x < -2.0) return(0.0f); if (x < -1.0) return(0.5f*(4.0f+x*(8.0f+x*(5.0f+x)))); if (x < 0.0) return(0.5f*(2.0f+x*x*(-5.0f-3.0f*x))); if (x < 1.0) return(0.5f*(2.0f+x*x*(-5.0f+3.0f*x))); if (x < 2.0) return(0.5f*(4.0f+x*(-8.0f+x*(5.0f-x)))); return(0.0f);}////////////////////////////////////////////////////////////////////////////////#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -