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 } |