Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

static void Impala::Core::Array::f_iir_yline_filter ( DSTTYPE *  src,
DSTTYPE *  dest,
int  sx,
int  sy,
double *  filter 
) [inline, static]

Definition at line 120 of file AniGauss.h.

References TriggsM().

Referenced by anigauss().

00121 {
00122     double   *p0, *p1, *p2, *p3, *pswap;
00123     double   *buf0, *buf1, *buf2, *buf3;
00124     double   *uplusbuf;
00125     int      i, j;
00126     double   b1, b2, b3;
00127     double   pix;
00128     double   sum, sumsq;
00129     double   uplus, vplus;
00130     double   unp, unp1, unp2;
00131     double   M[9];
00132 
00133     sumsq = filter[3];
00134     sum = sumsq*sumsq;
00135 
00136     uplusbuf = (double*) malloc(sx*sizeof(*uplusbuf));
00137 
00138     buf0 = (double*) malloc(sx*sizeof(*buf0));
00139     buf1 = (double*) malloc(sx*sizeof(*buf1));
00140     buf2 = (double*) malloc(sx*sizeof(*buf2));
00141     buf3 = (double*) malloc(sx*sizeof(*buf3));
00142 
00143     p0 = buf0; p1 = buf1; p2 = buf2; p3 = buf3;
00144 
00145     /* causal filter */
00146     b1 = filter[2]; b2 = filter[1]; b3 = filter[0];
00147 
00148     /* border first line*/
00149     for (j = 0; j < sx; j++) {
00150         pix = *src++/sumsq;
00151                 p1[j] = pix; p2[j] = pix; p3[j] = pix;
00152     }
00153     /* calc last line for Triggs boundary condition */
00154     src += (sy-2)*sx;
00155     for (j = 0; j < sx; j++)
00156         uplusbuf[j] = *src++/(1.0-b1-b2-b3);
00157     src -= sy*sx;
00158 
00159     for (i = 0; i < sy; i++) {
00160         for (j = 0; j < sx; j++) {
00161             pix = *src++ + b1*p1[j] + b2*p2[j] + b3*p3[j];
00162             *dest++ = pix;
00163             p0[j] = pix;
00164         }
00165 
00166         /* shift history */
00167                 pswap = p3; p3 = p2; p2 = p1; p1 = p0; p0 = pswap;
00168     }
00169 
00170 
00171     /* anti-causal filter */
00172 
00173     /* apply Triggs border condition */
00174     b1 = filter[4]; b2 = filter[5]; b3 = filter[6];
00175     TriggsM(filter, M);
00176 
00177     /* first line */
00178     p0 = uplusbuf;
00179     for (j = sx-1; j >= 0; j--) {
00180         uplus = p0[j];
00181         vplus = uplus/(1.0-b1-b2-b3);
00182 
00183         unp = p1[j]-uplus;
00184         unp1 = p2[j]-uplus;
00185         unp2 = p3[j]-uplus;
00186         pix = M[0]*unp+M[1]*unp1+M[2]*unp2 + vplus;
00187         pix *= sum;
00188         *(--dest) = pix;
00189         p1[j] = pix;
00190         pix  = M[3]*unp+M[4]*unp1+M[5]*unp2 + vplus;
00191         p2[j] = pix*sum;
00192         pix  = M[6]*unp+M[7]*unp1+M[8]*unp2 + vplus;
00193         p3[j] = pix*sum;
00194     }
00195 
00196     for (i = sy-2; i >= 0; i--) {
00197         for (j = sx-1; j >= 0; j--) {
00198             pix = sum * *(--dest) + b1*p1[j] + b2*p2[j] + b3*p3[j];
00199             *dest = pix;
00200             p0[j] = pix;
00201         }
00202 
00203         /* shift history */
00204                 pswap = p3; p3 = p2; p2 = p1; p1 = p0; p0 = pswap;
00205     }
00206 
00207     free(buf0);
00208     free(buf1);
00209     free(buf2);
00210     free(buf3);
00211     free(uplusbuf);
00212 }

Here is the call graph for this function:


Generated on Fri Mar 19 10:56:04 2010 for ImpalaSrc by  doxygen 1.5.1