#include "mrilib.h"
/*--------------------------------------------------------------------------*/
#define WT0 0.3
#define WT1 0.2
#define WT2 0.15
void MRI_5blur_inplace_3D( MRI_IMAGE *im )
{
int ii,jj,kk , nx,ny,nz , nxy,nxyz , off,top ;
float *f , *r ;
ENTRY("MRI_5blur_inplace_3D") ;
if( im == NULL || im->kind != MRI_float ) EXRETURN ;
nx = im->nx ; ny = im->ny ; nz = im->nz ; nxy = nx*ny ; nxyz = nxy*nz ;
f = MRI_FLOAT_PTR(im) ;
/* blur in x direction */
#undef D
#define D 1
if( nx > 3 ){
top = nx-2 ;
r = (float *) malloc(sizeof(float)*nx) ;
for( kk=0 ; kk < nz ; kk++ ){
for( jj=0 ; jj < ny ; jj++ ){
off = jj*nx + kk*nxy ;
r[0] = WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D]; off+=D;
r[1] = WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D]; off+=D;
for( ii=2 ; ii < top ; ii++,off+=D ){
r[ii] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D];
}
r[ii] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]; off+=D; ii++;
r[ii] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off] ;
off = jj*nx + kk*nxy ;
for( ii=0 ; ii < nx ; ii++ ) f[ii*D+off] = r[ii] ;
}
}
free(r) ;
}
/* blur in y direction */
#undef D
#define D nx
if( ny > 3 ){
top = ny-2 ;
r = (float *) malloc(sizeof(float)*ny) ;
for( kk=0 ; kk < nz ; kk++ ){
for( ii=0 ; ii < nx ; ii++ ){
off = ii + kk*nxy ;
r[0] = WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D]; off+=D;
r[1] = WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D]; off+=D;
for( jj=2 ; jj < top ; jj++,off+=D ){
r[jj] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D];
}
r[jj] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]; off+=D; jj++;
r[jj] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off] ;
off = ii + kk*nxy ;
for( jj=0 ; jj < ny ; jj++ ) f[jj*D+off] = r[jj] ;
}
}
free(r) ;
}
/* blur in z direction */
#undef D
#define D nxy
if( nz > 3 ){
top = nz-2 ;
r = (float *) malloc(sizeof(float)*nz) ;
for( jj=0 ; jj < ny ; jj++ ){
for( ii=0 ; ii < nx ; ii++ ){
off = ii + jj*nx ;
r[0] = WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D]; off+=D;
r[1] = WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D]; off+=D;
for( kk=2 ; kk < top ; kk++,off+=D ){
r[kk] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]+WT2*f[off+2*D];
}
r[kk] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off]+WT1*f[off+D]; off+=D; kk++;
r[kk] = WT2*f[off-2*D]+WT1*f[off-D]+WT0*f[off] ;
off = ii + jj*nx ;
for( kk=0 ; kk < nz ; kk++ ) f[kk*D+off] = r[kk] ;
}
}
free(r) ;
}
EXRETURN ;
}
syntax highlighted by Code2HTML, v. 0.9.1