Doxygen Source Code Documentation
mri_warp.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Defines | |
#define | FINS(i, j) |
#define | P_M1(x) (-(x)*((x)-1)*((x)-2)) |
#define | P_00(x) (3*((x)+1)*((x)-1)*((x)-2)) |
#define | P_P1(x) (-3*(x)*((x)+1)*((x)-2)) |
#define | P_P2(x) ((x)*((x)+1)*((x)-1)) |
Functions | |
INLINE void | xxMRI_scaler (float xpr, float ypr, float *xx, float *yy) |
MRI_IMAGE * | mri_warp (MRI_IMAGE *im, int nxnew, int nynew, int wtype, void wfunc(float, float, float *, float *)) |
MRI_IMAGE * | mri_resize_NN (MRI_IMAGE *im, int nxnew, int nynew) |
MRI_IMAGE * | mri_squareaspect (MRI_IMAGE *im) |
MRI_IMAGE * | mri_resize (MRI_IMAGE *im, int nxnew, int nynew) |
MRI_IMAGE * | mri_warp_bicubic (MRI_IMAGE *im, int nxnew, int nynew, void wf(float, float, float *, float *)) |
MRI_IMAGE * | mri_warp_bilinear (MRI_IMAGE *im, int nxnew, int nynew, void wf(float, float, float *, float *)) |
INLINE void | xxMRI_rotfunc (float xpr, float ypr, float *xx, float *yy) |
MRI_IMAGE * | mri_rotate (MRI_IMAGE *im, float aa, float bb, float phi, float scl) |
MRI_IMAGE * | mri_rotate_bilinear (MRI_IMAGE *im, float aa, float bb, float phi, float scl) |
Variables | |
float | sx_scale |
float | sy_scale |
float | rot_dx |
float | rot_dy |
float | rot_cph |
float | rot_sph |
Define Documentation
|
Value: ( ( (i)<0 || (j)<0 || (i)>=nx || (j)>=ny ) \ ? 0.0 : far[(i)+(j)*nx] ) Definition at line 19 of file mri_warp.c. |
|
|
|
|
|
|
|
|
Function Documentation
|
Definition at line 115 of file mri_warp.c. References MRI_BICUBIC, MRI_BILINEAR, MRI_FATAL_ERROR, mri_warp(), mri_warp_bicubic(), MRI_IMAGE::nx, MRI_IMAGE::ny, sx_scale, sy_scale, and xxMRI_scaler(). Referenced by AFNI_read_images(), AFNI_splashup(), and PH_loadim().
00116 { 00117 int nx,ny , nnx,nny , wtype ; 00118 00119 nx = im->nx ; ny = im->ny ; 00120 nnx = nxnew ; nny = nynew ; 00121 00122 if( nnx <= 0 && nny <= 0 ){ 00123 fprintf( stderr , "mri_resize: nxnew,nynew = %d %d\n",nxnew,nynew ) ; 00124 MRI_FATAL_ERROR ; 00125 } 00126 00127 sx_scale = (nnx > 0) ? ((float)nx)/nnx : 0.0 ; 00128 sy_scale = (nny > 0) ? ((float)ny)/nny : 0.0 ; 00129 00130 if( nnx <= 0 ){ 00131 sx_scale = sy_scale ; 00132 nnx = sx_scale * nx ; 00133 } else if( nny <= 0 ){ 00134 sy_scale = sx_scale ; 00135 nny = sy_scale * ny ; 00136 } 00137 00138 00139 #if 0 00140 wtype = MRI_BICUBIC ; 00141 00142 if( ( ((nnx>=nx) && (nnx%nx==0)) || ((nnx<nx) && (nx%nnx==0)) ) && 00143 ( ((nny>=ny) && (nny%ny==0)) || ((nny<ny) && (ny%nny==0)) ) ){ 00144 00145 wtype = MRI_BILINEAR ; 00146 } else { 00147 wtype = MRI_BICUBIC ; 00148 } 00149 00150 return mri_warp( im , nnx,nny , wtype , xxMRI_scaler ) ; 00151 #else 00152 return mri_warp_bicubic( im , nnx,nny , xxMRI_scaler ) ; 00153 #endif 00154 } |
|
Definition at line 54 of file mri_warp.c. References MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::kind, MRI_COPY_AUX, mri_data_pointer(), mri_new(), MRI_IMAGE::nx, MRI_IMAGE::ny, and MRI_IMAGE::pixel_size. Referenced by mri_squareaspect().
00055 { 00056 int nx,ny , nnx,nny , ii,jj , pp,qq , bb ; 00057 float fx,fy ; 00058 MRI_IMAGE *nim ; 00059 char *nar , *ar ; 00060 00061 if( im == NULL ) return NULL ; 00062 00063 nx = im->nx ; ny = im->ny ; 00064 nnx = nxnew ; nny = nynew ; 00065 fx = ((float)nx) / (float)nnx ; 00066 fy = ((float)ny) / (float)nny ; 00067 00068 nim = mri_new( nnx , nny , im->kind ) ; 00069 nar = mri_data_pointer( nim ) ; 00070 ar = mri_data_pointer( im ) ; 00071 bb = im->pixel_size ; 00072 00073 for( jj=0 ; jj < nny ; jj++ ){ 00074 qq = (int)( fy*jj ) ; 00075 for( ii=0 ; ii < nnx ; ii++ ){ 00076 pp = (int)( fx*ii ) ; 00077 memcpy( nar + (ii+jj*nnx)*bb , ar + (pp+qq*nx)*bb , bb ) ; 00078 } 00079 } 00080 00081 MRI_COPY_AUX(nim,im) ; 00082 nim->dx *= fx ; 00083 nim->dy *= fy ; 00084 return nim ; 00085 } |
|
-------------------------------------------------------------------------------- Rotate and shift an image, using bicubic interpolation: aa = shift in x bb = shift in y phi = angle in radians scl = size scale factor (0.0 --> leave the same size) -----------------------------------------------------------------------------------* Definition at line 356 of file mri_warp.c. References mri_warp_bicubic(), MRI_IMAGE::nx, MRI_IMAGE::ny, rot_cph, rot_dx, rot_dy, rot_sph, and xxMRI_rotfunc().
00357 { 00358 MRI_IMAGE *imwarp ; 00359 int nxnew , nynew ; 00360 00361 rot_cph = cos(phi) ; 00362 rot_sph = sin(phi) ; 00363 00364 rot_dx = (0.5 * im->nx) * (1.0-rot_cph) - aa*rot_cph - bb*rot_sph 00365 -(0.5 * im->ny) * rot_sph ; 00366 00367 rot_dy = (0.5 * im->nx) * rot_sph + aa*rot_sph - bb*rot_cph 00368 +(0.5 * im->ny) * (1.0-rot_cph) ; 00369 00370 if( scl <= 0.0 ){ 00371 nxnew = nynew = 0 ; 00372 } else { 00373 nxnew = scl * im->nx + 0.49 ; 00374 nynew = scl * im->ny + 0.49 ; 00375 rot_cph /= scl ; 00376 rot_sph /= scl ; 00377 } 00378 00379 return mri_warp_bicubic( im , nxnew,nynew , xxMRI_rotfunc ) ; 00380 } |
|
Definition at line 382 of file mri_warp.c. References mri_warp_bilinear(), MRI_IMAGE::nx, MRI_IMAGE::ny, rot_cph, rot_dx, rot_dy, rot_sph, and xxMRI_rotfunc().
00383 { 00384 MRI_IMAGE *imwarp ; 00385 int nxnew , nynew ; 00386 00387 rot_cph = cos(phi) ; 00388 rot_sph = sin(phi) ; 00389 00390 rot_dx = (0.5 * im->nx) * (1.0-rot_cph) - aa*rot_cph - bb*rot_sph 00391 -(0.5 * im->ny) * rot_sph ; 00392 00393 rot_dy = (0.5 * im->nx) * rot_sph + aa*rot_sph - bb*rot_cph 00394 +(0.5 * im->ny) * (1.0-rot_cph) ; 00395 00396 if( scl <= 0.0 ){ 00397 nxnew = nynew = 0 ; 00398 } else { 00399 nxnew = scl * im->nx + 0.49 ; 00400 nynew = scl * im->ny + 0.49 ; 00401 rot_cph /= scl ; 00402 rot_sph /= scl ; 00403 } 00404 00405 return mri_warp_bilinear( im , nxnew,nynew , xxMRI_rotfunc ) ; 00406 } |
|
Definition at line 89 of file mri_warp.c. References MRI_IMAGE::dx, MRI_IMAGE::dy, mri_resize_NN(), MRI_IMAGE::nx, and MRI_IMAGE::ny. Referenced by ISQ_save_jpeg(), and ISQ_saver_CB().
00090 { 00091 int nx,ny , nxnew,nynew ; 00092 float dx,dy , rr ; 00093 00094 if( im == NULL ) return NULL ; 00095 00096 dx = fabs(im->dx) ; dy = fabs(im->dy) ; 00097 if( dx == 0.0 || dy == 0.0 ) return NULL ; 00098 rr = dy / dx ; if( rr == 1.0 ) return NULL ; 00099 00100 nx = im->nx ; ny = im->ny ; 00101 00102 if( rr < 1.0 ){ 00103 nxnew = rint( nx/rr ) ; if( nxnew <= nx ) return NULL ; 00104 nynew = ny ; 00105 } else { 00106 nynew = rint( ny*rr ) ; if( nynew <= ny ) return NULL ; 00107 nxnew = nx ; 00108 } 00109 00110 return mri_resize_NN( im , nxnew , nynew ) ; 00111 } |
|
Definition at line 35 of file mri_warp.c. References MRI_BICUBIC, MRI_BILINEAR, MRI_FATAL_ERROR, mri_warp_bicubic(), and mri_warp_bilinear(). Referenced by mri_resize().
00037 { 00038 switch( wtype ){ 00039 case MRI_BILINEAR: 00040 return mri_warp_bilinear( im , nxnew , nynew , wfunc ) ; 00041 00042 case MRI_BICUBIC: 00043 return mri_warp_bicubic( im , nxnew , nynew , wfunc ) ; 00044 00045 default: 00046 fprintf( stderr , "mri_warp: illegal wtype %d\n" , wtype ) ; 00047 MRI_FATAL_ERROR ; 00048 } 00049 return NULL ; 00050 } |
|
Definition at line 158 of file mri_warp.c. References DESTROY_IMARR, far, FINS, IMARR_SUBIM, MRI_IMAGE::kind, mri_3to_rgb(), mri_data_pointer(), mri_free(), mri_new(), mri_rgb_to_3float(), mri_to_float(), mri_to_mri(), MRI_IMAGE::nvox, MRI_IMAGE::nx, MRI_IMAGE::ny, P_00, P_M1, P_P1, P_P2, and top. Referenced by mri_resize(), mri_rotate(), and mri_warp().
00160 { 00161 MRI_IMAGE *imfl , *newImg ; 00162 float *far , *nar ; 00163 float xpr,ypr , xx,yy , fx,fy ; 00164 int ii,jj, nx,ny , ix,jy ; 00165 float f_jm1,f_j00,f_jp1,f_jp2 , wt_m1,wt_00,wt_p1,wt_p2 ; 00166 float bot,top,val ; /* 29 Mar 2003 */ 00167 00168 nx = im->nx ; /* input image dimensions, for convenience */ 00169 ny = im->ny ; 00170 00171 nxnew = (nxnew > 0) ? nxnew : nx ; /* default output image sizes */ 00172 nynew = (nynew > 0) ? nynew : ny ; 00173 00174 switch( im->kind ){ /* 29 Mar 2003: allow for different input types */ 00175 /* by doing components 1 at a time */ 00176 case MRI_float: 00177 imfl = im ; break ; 00178 00179 default: 00180 imfl = mri_to_float(im) ; break ; 00181 00182 case MRI_short:{ 00183 imfl = mri_to_float(im) ; 00184 newImg = mri_warp_bicubic( imfl , nxnew,nynew , wf ) ; 00185 mri_free(imfl) ; 00186 imfl = mri_to_mri(MRI_short,newImg) ; 00187 mri_free(newImg) ; return imfl ; 00188 } 00189 00190 case MRI_byte:{ 00191 imfl = mri_to_float(im) ; 00192 newImg = mri_warp_bicubic( imfl , nxnew,nynew , wf ) ; 00193 mri_free(imfl) ; 00194 imfl = mri_to_mri(MRI_byte,newImg) ; 00195 mri_free(newImg) ; return imfl ; 00196 } 00197 00198 case MRI_rgb:{ 00199 MRI_IMARR *imar = mri_rgb_to_3float(im) ; 00200 MRI_IMAGE *rim,*gim,*bim ; 00201 rim = mri_warp_bicubic( IMARR_SUBIM(imar,0), nxnew,nynew, wf ) ; 00202 gim = mri_warp_bicubic( IMARR_SUBIM(imar,1), nxnew,nynew, wf ) ; 00203 bim = mri_warp_bicubic( IMARR_SUBIM(imar,2), nxnew,nynew, wf ) ; 00204 DESTROY_IMARR(imar) ; 00205 newImg = mri_3to_rgb( rim,gim,bim ) ; 00206 mri_free(rim); mri_free(gim); mri_free(bim); return newImg; 00207 } 00208 00209 } 00210 00211 /* at this point, imfl is in MRI_float format */ 00212 00213 far = mri_data_pointer( imfl ) ; /* easy access to float data */ 00214 00215 newImg = mri_new( nxnew , nynew , MRI_float ) ; /* output image */ 00216 nar = mri_data_pointer( newImg ) ; /* output image data */ 00217 00218 bot = top = far[0] ; /* 29 Mar 2003: */ 00219 for( ii=1 ; ii < imfl->nvox ; ii++ ){ /* clip output data range */ 00220 if( far[ii] > top ) top = far[ii] ; 00221 else if( far[ii] < bot ) bot = far[ii] ; 00222 } 00223 00224 /*** loop over output points and warp to them ***/ 00225 00226 for( jj=0 ; jj < nynew ; jj++ ){ 00227 ypr = jj ; 00228 for( ii=0 ; ii < nxnew ; ii++ ){ 00229 xpr = ii ; 00230 wf( xpr,ypr , &xx,&yy ) ; /* get xx,yy in original image */ 00231 00232 ix = floor( xx ) ; fx = xx - ix ; /* integer and */ 00233 jy = floor( yy ) ; fy = yy - jy ; /* fractional coords */ 00234 00235 /* define cubic interpolation polynomials and data from original grid */ 00236 00237 #define P_M1(x) (-(x)*((x)-1)*((x)-2)) 00238 #define P_00(x) (3*((x)+1)*((x)-1)*((x)-2)) 00239 #define P_P1(x) (-3*(x)*((x)+1)*((x)-2)) 00240 #define P_P2(x) ((x)*((x)+1)*((x)-1)) 00241 00242 wt_m1 = P_M1(fx) ; wt_00 = P_00(fx) ; /* weights for interpolating */ 00243 wt_p1 = P_P1(fx) ; wt_p2 = P_P2(fx) ; /* in the x-direction */ 00244 00245 f_jm1 = wt_m1 * FINS(ix-1,jy-1) /* interpolate to ix + fx */ 00246 + wt_00 * FINS(ix ,jy-1) /* at levels jy-1 .. jy+2 */ 00247 + wt_p1 * FINS(ix+1,jy-1) 00248 + wt_p2 * FINS(ix+2,jy-1) ; 00249 00250 f_j00 = wt_m1 * FINS(ix-1,jy) 00251 + wt_00 * FINS(ix ,jy) 00252 + wt_p1 * FINS(ix+1,jy) 00253 + wt_p2 * FINS(ix+2,jy) ; 00254 00255 f_jp1 = wt_m1 * FINS(ix-1,jy+1) 00256 + wt_00 * FINS(ix ,jy+1) 00257 + wt_p1 * FINS(ix+1,jy+1) 00258 + wt_p2 * FINS(ix+2,jy+1) ; 00259 00260 f_jp2 = wt_m1 * FINS(ix-1,jy+2) 00261 + wt_00 * FINS(ix ,jy+2) 00262 + wt_p1 * FINS(ix+1,jy+2) 00263 + wt_p2 * FINS(ix+2,jy+2) ; 00264 00265 /* interpolate between y-levels to jy+fy */ 00266 00267 val = ( P_M1(fy) * f_jm1 + P_00(fy) * f_j00 00268 + P_P1(fy) * f_jp1 + P_P2(fy) * f_jp2 ) / 36.0 ; 00269 00270 if( val > top ) val = top ; /* 29 Mar 2003 */ 00271 else if( val < bot ) val = bot ; 00272 00273 nar[ii+jj*nxnew] = val ; 00274 } 00275 } 00276 00277 /*** cleanup and return ***/ 00278 00279 if( im != imfl ) mri_free(imfl) ; /* throw away unneeded workspace */ 00280 return newImg ; 00281 } |
|
Definition at line 285 of file mri_warp.c. References far, FINS, MRI_IMAGE::kind, mri_data_pointer(), mri_free(), mri_new(), mri_to_float(), MRI_IMAGE::nx, and MRI_IMAGE::ny. Referenced by mri_rotate_bilinear(), and mri_warp().
00287 { 00288 MRI_IMAGE *imfl , *newImg ; 00289 float *far , *nar ; 00290 float xpr,ypr , xx,yy , fx,fx1,fy,fy1 , f00,f10,f01,f11 ; 00291 int ii,jj, nx,ny , ix,jy ; 00292 00293 nx = im->nx ; /* dimensions, for convenience */ 00294 ny = im->ny ; 00295 00296 nxnew = (nxnew > 0) ? nxnew : nx ; /* default output image sizes */ 00297 nynew = (nynew > 0) ? nynew : ny ; 00298 00299 if( im->kind == MRI_float ){ /* convert input to float, if needed */ 00300 imfl = im ; 00301 } else { 00302 imfl = mri_to_float( im ) ; 00303 } 00304 far = mri_data_pointer( imfl ) ; /* easy access to float data */ 00305 00306 newImg = mri_new( nxnew , nynew , MRI_float ) ; /* output image */ 00307 nar = mri_data_pointer( newImg ) ; /* output image data */ 00308 00309 /*** loop over output points and warp to them ***/ 00310 00311 for( jj=0 ; jj < nynew ; jj++ ){ 00312 ypr = jj ; 00313 for( ii=0 ; ii < nxnew ; ii++ ){ 00314 xpr = ii ; 00315 wf( xpr,ypr , &xx,&yy ) ; /* get xx,yy in original image */ 00316 00317 ix = floor( xx ) ; fx = xx - ix ; fx1 = 1.0 - fx ; 00318 jy = floor( yy ) ; fy = yy - jy ; fy1 = 1.0 - fy ; 00319 00320 f00 = FINS(ix ,jy ) ; 00321 f01 = FINS(ix+1,jy ) ; 00322 f10 = FINS(ix ,jy+1) ; 00323 f11 = FINS(ix+1,jy+1) ; 00324 00325 nar[ii+jj*nxnew] = fx1 * ( fy1 * f00 + fy * f01 ) 00326 +fx * ( fy1 * f10 + fy * f11 ) ; 00327 00328 } 00329 } 00330 00331 /*** cleanup and return ***/ 00332 00333 if( im != imfl ) mri_free(imfl) ; /* throw away unneeded workspace */ 00334 return newImg ; 00335 } |
|
Definition at line 341 of file mri_warp.c. References rot_cph, rot_dx, rot_dy, and rot_sph. Referenced by mri_rotate(), and mri_rotate_bilinear().
|
|
Definition at line 26 of file mri_warp.c. References sx_scale, and sy_scale. Referenced by mri_resize().
|
Variable Documentation
|
Definition at line 339 of file mri_warp.c. Referenced by mri_rotate(), mri_rotate_bilinear(), and xxMRI_rotfunc(). |
|
Definition at line 339 of file mri_warp.c. Referenced by mri_rotate(), mri_rotate_bilinear(), and xxMRI_rotfunc(). |
|
Definition at line 339 of file mri_warp.c. Referenced by mri_rotate(), mri_rotate_bilinear(), and xxMRI_rotfunc(). |
|
Definition at line 339 of file mri_warp.c. Referenced by mri_rotate(), mri_rotate_bilinear(), and xxMRI_rotfunc(). |
|
Definition at line 24 of file mri_warp.c. Referenced by mri_resize(), and xxMRI_scaler(). |
|
Definition at line 24 of file mri_warp.c. Referenced by mri_resize(), and xxMRI_scaler(). |