Doxygen Source Code Documentation
mri_shift2D.c File Reference
#include "mrilib.h"Go to the source code of this file.
Defines | |
| #define | FINS(i, j) |
Functions | |
| MRI_IMAGE * | mri_shift2D_bilinear (MRI_IMAGE *im, float aa, float bb) |
Define Documentation
|
|
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
|
||||||||||||||||
|
------------------------------------------------------------------- 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 }
|