Doxygen Source Code Documentation
mri_aff2d.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Defines | |
#define | FINS(i, j) |
#define | RINS(i, j) |
#define | GINS(i, j) |
#define | BINS(i, j) |
Functions | |
void | invert2d (float axx, float axy, float ayx, float ayy, float *bxx, float *bxy, float *byx, float *byy) |
MRI_IMAGE * | mri_aff2d_byte (MRI_IMAGE *im, int flag, float axx, float axy, float ayx, float ayy) |
MRI_IMAGE * | mri_aff2d_rgb (MRI_IMAGE *im, int flag, float axx, float axy, float ayx, float ayy) |
Define Documentation
|
Value: ( ( (i)<0 || (j)<0 || (i)>=nx || (j)>=ny ) \ ? 0.0 : far[3*((i)+(j)*nx)+2] ) Definition at line 127 of file mri_aff2d.c. Referenced by mri_aff2d_rgb(). |
|
Value: ( ( (i)<0 || (j)<0 || (i)>=nx || (j)>=ny ) \ ? 0.0 : far[(i)+(j)*nx] ) Definition at line 13 of file mri_aff2d.c. Referenced by cub_shift(), hept_shift(), lin_shift(), mri_aff2d_byte(), mri_affine_bicubic(), mri_rota(), mri_rota_bilinear(), mri_shift2D_bilinear(), mri_warp_bicubic(), mri_warp_bilinear(), nn_shift(), quint_shift(), and ts_shift(). |
|
Value: ( ( (i)<0 || (j)<0 || (i)>=nx || (j)>=ny ) \ ? 0.0 : far[3*((i)+(j)*nx)+1] ) Definition at line 122 of file mri_aff2d.c. Referenced by mri_aff2d_rgb(). |
|
Value: ( ( (i)<0 || (j)<0 || (i)>=nx || (j)>=ny ) \ ? 0.0 : far[3*((i)+(j)*nx)] ) Definition at line 117 of file mri_aff2d.c. Referenced by mri_aff2d_rgb(). |
Function Documentation
|
Invert a 2D matrix, dude. Definition at line 19 of file mri_aff2d.c. Referenced by mri_aff2d_byte(), and mri_aff2d_rgb().
00021 { 00022 float det = axx*ayy - axy*ayx ; 00023 if( det == 0.0 ){ *bxx=*byy=*bxy=*byx = 0.0 ; return ; } 00024 *bxx = ayy / det ; 00025 *byy = axx / det ; 00026 *bxy = -axy / det ; 00027 *byx = -ayx / det ; 00028 return ; 00029 } |
|
Affine transform a 2D image, using bilinear interpolation: If flag == 0 [ xout ] = [ axx axy ] [ xin ] [ yout ] = [ ayx ayy ] [ yin ] If flag == 1 [ xin ] = [ axx axy ] [ xout ] [ yin ] = [ ayx ayy ] [ yout ] These are index coordinates, not spatial. ---------------------------------------------------------------------- Definition at line 42 of file mri_aff2d.c. References ENTRY, far, FINS, invert2d(), MRI_IMAGE::kind, MRI_BYTE_PTR, MRI_COPY_AUX, MRI_IS_2D, mri_new(), MRI_IMAGE::nx, MRI_IMAGE::ny, and RETURN. Referenced by project_byte_mip().
00044 { 00045 float bxx,bxy,byx,byy , xbase,ybase , xx,yy , fx,fy ; 00046 float f_j00,f_jp1 , wt_00,wt_p1 ; 00047 int ii,jj , nx,ny , ix,jy ; 00048 MRI_IMAGE *newImg ; 00049 byte *far , *nar ; 00050 00051 ENTRY("mri_aff2d_byte") ; 00052 00053 if( im == NULL || !MRI_IS_2D(im) || im->kind != MRI_byte ){ 00054 fprintf(stderr,"*** mri_aff2d_byte only works on 2D byte images!\n"); 00055 RETURN( NULL ); 00056 } 00057 00058 if( flag == 0 ){ 00059 invert2d( axx,axy,ayx,ayy , &bxx,&bxy,&byx,&byy ) ; 00060 } else { 00061 bxx = axx ; bxy = axy ; byx = ayx ; byy = ayy ; 00062 } 00063 if( (bxx == 0.0 && bxy == 0.0) || (byx == 0.0 && byy == 0.0) ){ 00064 fprintf(stderr,"*** mri_aff2d_byte: input matrix is singular!\n") ; 00065 RETURN( NULL ); 00066 } 00067 00068 nx = im->nx ; ny = im->ny ; 00069 xbase = 0.5*nx*(1.0-bxx) - 0.5*ny*bxy ; 00070 ybase = 0.5*ny*(1.0-byy) - 0.5*nx*byx ; 00071 00072 far = MRI_BYTE_PTR(im) ; /* input image data */ 00073 newImg = mri_new( nx , nx , MRI_byte ) ; /* output image */ 00074 nar = MRI_BYTE_PTR(newImg) ; /* output image data */ 00075 00076 /*** loop over output points and warp to them ***/ 00077 00078 for( jj=0 ; jj < nx ; jj++ ){ 00079 xx = xbase-bxx + bxy * jj ; 00080 yy = ybase-byx + byy * jj ; 00081 for( ii=0 ; ii < nx ; ii++ ){ 00082 00083 xx += bxx ; /* get x,y in original image */ 00084 yy += byx ; 00085 00086 ix = (xx >= 0.0) ? ((int) xx) : ((int) xx)-1 ; /* floor */ 00087 jy = (yy >= 0.0) ? ((int) yy) : ((int) yy)-1 ; 00088 00089 fx = xx-ix ; wt_00 = 1.0 - fx ; wt_p1 = fx ; 00090 00091 if( ix >= 0 && ix < nx-1 && jy >= 0 && jy < ny-1 ){ 00092 byte *fy00 , *fyp1 ; 00093 00094 fy00 = far + (ix + jy*nx) ; fyp1 = fy00 + nx ; 00095 00096 f_j00 = wt_00 * fy00[0] + wt_p1 * fy00[1] ; 00097 f_jp1 = wt_00 * fyp1[0] + wt_p1 * fyp1[1] ; 00098 00099 } else { 00100 f_j00 = wt_00 * FINS(ix,jy ) + wt_p1 * FINS(ix+1,jy ) ; 00101 f_jp1 = wt_00 * FINS(ix,jy+1) + wt_p1 * FINS(ix+1,jy+1) ; 00102 } 00103 00104 fy = yy-jy ; nar[ii+jj*nx] = (1.0-fy) * f_j00 + fy * f_jp1 ; 00105 00106 } 00107 } 00108 00109 MRI_COPY_AUX(newImg,im) ; 00110 RETURN( newImg ) ; 00111 } |
|
Same as mri_aff2d_byte(), but for RGB images [11 Dec 2000]. ------------------------------------------------------------------------ Definition at line 134 of file mri_aff2d.c. References BINS, ENTRY, far, GINS, invert2d(), MRI_IMAGE::kind, MRI_COPY_AUX, MRI_IS_2D, mri_new(), MRI_RGB_PTR, MRI_IMAGE::nx, MRI_IMAGE::ny, RETURN, and RINS. Referenced by CREN_render().
00136 { 00137 float bxx,bxy,byx,byy , xbase,ybase , xx,yy , fx,fy ; 00138 float f_j00r,f_jp1r , f_j00g,f_jp1g , f_j00b,f_jp1b , wt_00,wt_p1 ; 00139 int jj , nx,ny , ix,jy ; 00140 MRI_IMAGE *newImg ; 00141 byte *far , *nar ; 00142 register int ii ; 00143 00144 ENTRY("mri_aff2d_rgb") ; 00145 00146 if( im == NULL || !MRI_IS_2D(im) || im->kind != MRI_rgb ){ 00147 fprintf(stderr,"*** mri_aff2d_rgb only works on 2D RGB images!\n"); 00148 RETURN( NULL ); 00149 } 00150 00151 if( flag == 0 ){ 00152 invert2d( axx,axy,ayx,ayy , &bxx,&bxy,&byx,&byy ) ; 00153 } else { 00154 bxx = axx ; bxy = axy ; byx = ayx ; byy = ayy ; 00155 } 00156 if( (bxx == 0.0 && bxy == 0.0) || (byx == 0.0 && byy == 0.0) ){ 00157 fprintf(stderr,"*** mri_aff2d_byte: input matrix is singular!\n") ; 00158 RETURN( NULL ); 00159 } 00160 00161 nx = im->nx ; ny = im->ny ; 00162 xbase = 0.5*nx*(1.0-bxx) - 0.5*ny*bxy ; 00163 ybase = 0.5*ny*(1.0-byy) - 0.5*nx*byx ; 00164 00165 far = MRI_RGB_PTR(im) ; /* input image data */ 00166 newImg = mri_new( nx , nx , MRI_rgb ) ; /* output image */ 00167 nar = MRI_RGB_PTR(newImg) ; /* output image data */ 00168 00169 /*** loop over output points and warp to them ***/ 00170 00171 for( jj=0 ; jj < nx ; jj++ ){ 00172 xx = xbase-bxx + bxy * jj ; 00173 yy = ybase-byx + byy * jj ; 00174 for( ii=0 ; ii < nx ; ii++ ){ 00175 00176 xx += bxx ; /* get x,y in original image */ 00177 yy += byx ; 00178 00179 ix = (xx >= 0.0) ? ((int) xx) : ((int) xx)-1 ; /* floor */ 00180 jy = (yy >= 0.0) ? ((int) yy) : ((int) yy)-1 ; 00181 00182 fx = xx-ix ; wt_00 = 1.0 - fx ; wt_p1 = fx ; 00183 00184 if( ix >= 0 && ix < nx-1 && jy >= 0 && jy < ny-1 ){ 00185 byte *fy00 , *fyp1 ; 00186 00187 fy00 = far + 3*(ix+jy*nx) ; fyp1 = fy00 + 3*nx ; 00188 00189 f_j00r = wt_00 * fy00[0] + wt_p1 * fy00[3] ; 00190 f_j00g = wt_00 * fy00[1] + wt_p1 * fy00[4] ; 00191 f_j00b = wt_00 * fy00[2] + wt_p1 * fy00[5] ; 00192 00193 f_jp1r = wt_00 * fyp1[0] + wt_p1 * fyp1[3] ; 00194 f_jp1g = wt_00 * fyp1[1] + wt_p1 * fyp1[4] ; 00195 f_jp1b = wt_00 * fyp1[2] + wt_p1 * fyp1[5] ; 00196 00197 } else { 00198 f_j00r = wt_00 * RINS(ix,jy ) + wt_p1 * RINS(ix+1,jy ) ; 00199 f_j00g = wt_00 * GINS(ix,jy ) + wt_p1 * GINS(ix+1,jy ) ; 00200 f_j00b = wt_00 * BINS(ix,jy ) + wt_p1 * BINS(ix+1,jy ) ; 00201 00202 f_jp1r = wt_00 * RINS(ix,jy+1) + wt_p1 * RINS(ix+1,jy+1) ; 00203 f_jp1g = wt_00 * GINS(ix,jy+1) + wt_p1 * GINS(ix+1,jy+1) ; 00204 f_jp1b = wt_00 * BINS(ix,jy+1) + wt_p1 * BINS(ix+1,jy+1) ; 00205 } 00206 00207 fy = yy-jy ; 00208 nar[3*ii+ 3*jj*nx ] = (1.0-fy) * f_j00r + fy * f_jp1r ; 00209 nar[3*ii+(3*jj*nx+1)] = (1.0-fy) * f_j00g + fy * f_jp1g ; 00210 nar[3*ii+(3*jj*nx+2)] = (1.0-fy) * f_j00b + fy * f_jp1b ; 00211 00212 } 00213 } 00214 00215 MRI_COPY_AUX(newImg,im) ; 00216 RETURN( newImg ); 00217 } |