Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

mri_shift2D.c File Reference

#include "mrilib.h"

Go to the source code of this file.


Defines

#define FINS(i, j)

Functions

MRI_IMAGEmri_shift2D_bilinear (MRI_IMAGE *im, float aa, float bb)

Define Documentation

#define FINS i,
j   
 

Value:

(  ( (i)<0 || (j)<0 || (i)>=nx || (j)>=ny ) \
                     ? 0.0 : far[(i)+(j)*nx] )

Definition at line 5 of file mri_shift2D.c.


Function Documentation

MRI_IMAGE* mri_shift2D_bilinear MRI_IMAGE   im,
float    aa,
float    bb
 

------------------------------------------------------------------- Shift an image, using bilinear interpolation: aa = shift in x bb = shift in y Like mri_rota_bilinear, with phi=0 -- RWCox - 11 Sep 2001 ----------------------------------------------------------------------*

Definition at line 15 of file mri_shift2D.c.

References ENTRY, EXIT, far, FINS, FREE_IMARR, IMAGE_IN_IMARR, MRI_IMAGE::kind, mri_complex_to_pair(), MRI_COPY_AUX, MRI_FLOAT_PTR, mri_free(), MRI_IS_2D, mri_new(), mri_pair_to_complex(), mri_to_float(), MRI_IMAGE::nx, MRI_IMAGE::ny, and RETURN.

00016 {
00017    float dx , dy ;
00018    MRI_IMAGE *imfl , *newImg ;
00019    MRI_IMARR *impair ;
00020    float *far , *nar ;
00021    float xx,yy , fx,fy ;
00022    int ii,jj, nx,ny , ix,jy ;
00023    float f_j00,f_jp1 , wt_00,wt_p1 ;
00024 
00025 ENTRY("mri_shift2D_bilinear") ;
00026 
00027    if( im == NULL || !MRI_IS_2D(im) ){
00028       fprintf(stderr,"*** mri_shift2D_bilinear only works on 2D images!\n") ;
00029       EXIT(1) ;
00030    }
00031 
00032    /** if complex image, break into pairs, do each separately, put back together **/
00033 
00034    if( im->kind == MRI_complex ){
00035       MRI_IMARR *impair ;
00036       MRI_IMAGE *rim , *iim , *tim ;
00037       impair = mri_complex_to_pair( im ) ;
00038       if( impair == NULL ){
00039          fprintf(stderr,"*** mri_complex_to_pair fails in mri_shift2D_bilinear!\n");
00040          EXIT(1) ;
00041       }
00042       rim = IMAGE_IN_IMARR(impair,0) ;
00043       iim = IMAGE_IN_IMARR(impair,1) ;  FREE_IMARR(impair) ;
00044       tim = mri_shift2D_bilinear( rim , aa,bb ); mri_free(rim); rim = tim;
00045       tim = mri_shift2D_bilinear( iim , aa,bb ); mri_free(iim); iim = tim;
00046       newImg = mri_pair_to_complex( rim , iim ) ;
00047       mri_free(rim) ; mri_free(iim) ;
00048       MRI_COPY_AUX(newImg,im) ;
00049       RETURN(newImg) ;
00050    }
00051 
00052    /** shift params **/
00053 
00054    dx = - aa ;
00055    dy = - bb ;
00056 
00057    /** other initialization **/
00058 
00059    nx = im->nx ;  /* image dimensions */
00060    ny = im->ny ;
00061 
00062    if( im->kind == MRI_float ) imfl = im ;
00063    else                        imfl = mri_to_float( im ) ;
00064 
00065    far = MRI_FLOAT_PTR(imfl) ;              /* access to float data */
00066    newImg = mri_new( nx , nx , MRI_float ) ;   /* output image */
00067    nar = MRI_FLOAT_PTR(newImg) ;               /* output image data */
00068 
00069    /*** loop over output points and warp to them ***/
00070 
00071    for( jj=0 ; jj < nx ; jj++ ){
00072       xx = dx - 1.0 ;
00073       yy = jj + dy ;
00074 
00075       jy = (yy >= 0.0) ? ((int) yy) : ((int) yy)-1 ;
00076 
00077       for( ii=0 ; ii < nx ; ii++ ){
00078 
00079          xx += 1.0 ;  /* get x,y in original image */
00080 
00081          ix = (xx >= 0.0) ? ((int) xx) : ((int) xx)-1 ;  /* floor */
00082 
00083          fx = xx-ix ; wt_00 = 1.0 - fx ; wt_p1 = fx ;
00084 
00085          if( ix >= 0 && ix < nx-1 && jy >= 0 && jy < ny-1 ){
00086             float *fy00 , *fyp1 ;
00087 
00088             fy00 = far + (ix + jy*nx) ; fyp1 = fy00 + nx ;
00089 
00090             f_j00 = wt_00 * fy00[0] + wt_p1 * fy00[1] ;
00091             f_jp1 = wt_00 * fyp1[0] + wt_p1 * fyp1[1] ;
00092 
00093          } else {
00094             f_j00 = wt_00 * FINS(ix,jy  ) + wt_p1 * FINS(ix+1,jy  ) ;
00095             f_jp1 = wt_00 * FINS(ix,jy+1) + wt_p1 * FINS(ix+1,jy+1) ;
00096          }
00097 
00098          fy  = yy-jy ; nar[ii+jj*nx] = (1.0-fy) * f_j00 + fy * f_jp1 ;
00099 
00100       }
00101    }
00102 
00103    /*** cleanup and return ***/
00104 
00105    if( im != imfl ) mri_free(imfl) ;  /* throw away unneeded workspace */
00106    MRI_COPY_AUX(newImg,im) ;
00107    RETURN(newImg) ;
00108 }
 

Powered by Plone

This site conforms to the following standards: