1 #include "mrilib.h"
2
3 /*----------------------------------------------------------------------------*/
4 /* Interleave two images in a checkerboard */
5
mri_check_2D(int bsiz,MRI_IMAGE * ima,MRI_IMAGE * imb)6 MRI_IMAGE * mri_check_2D( int bsiz , MRI_IMAGE *ima , MRI_IMAGE *imb )
7 {
8 MRI_IMAGE *imc ;
9 int nx , ny , ii , jj , ib,jb , ps , kk ;
10 char *aar , *bar , *car , *sar ;
11
12 ENTRY("mri_check_2D") ;
13
14 if( ima == NULL || imb == NULL ) RETURN(NULL) ;
15 nx = ima->nx ; ny = ima->ny ;
16 if( imb->nx != nx || imb->ny != ny || ima->kind != imb->kind ) RETURN(NULL);
17
18 if( bsiz < 1 ) bsiz = (int)sqrt(0.5*(nx+ny)) ;
19
20 aar = (char *)mri_data_pointer(ima) ; if( aar == NULL ) RETURN(NULL) ;
21 bar = (char *)mri_data_pointer(imb) ; if( bar == NULL ) RETURN(NULL) ;
22 ps = ima->pixel_size ;
23 imc = mri_new( nx , ny , ima->kind ) ;
24 car = (char *)mri_data_pointer(imc) ;
25
26 for( kk=jj=0 ; jj < ny ; jj++ ){
27 jb = (jj/bsiz) % 2 ;
28 for( ii=0 ; ii < nx ; ii++ ){
29 ib = (ii/bsiz) % 2 ;
30 sar = (ib==jb) ? aar : bar ; /* choose source image */
31
32 switch( ps ){ /* copy ps bytes from source to result */
33 default:
34 memcpy( car+kk , sar+kk , ps ) ; kk += ps ;
35 break ;
36
37 case 4: car[kk] = sar[kk] ; kk++ ; /* fall thru */
38 case 3: car[kk] = sar[kk] ; kk++ ; /* fall thru */
39 case 2: car[kk] = sar[kk] ; kk++ ; /* fall thru */
40 case 1: car[kk] = sar[kk] ; kk++ ; break ;
41 }
42 }
43 }
44
45 MRI_COPY_AUX(imc,ima) ; RETURN(imc) ;
46 }
47
48 /*----------------------------------------------------------------------------*/
49 /* 'Wiper' combine 2 images, according to wcode method */
50
mri_wiper_2D(int wcode,float wfac,MRI_IMAGE * ima,MRI_IMAGE * imb)51 MRI_IMAGE * mri_wiper_2D( int wcode,float wfac, MRI_IMAGE *ima, MRI_IMAGE *imb )
52 {
53 MRI_IMAGE *imc ;
54 int nx , ny , ii , jj , ib,jb , ps , kk ;
55 char *aar , *bar , *car , *sar ;
56 byte *mar ;
57
58 ENTRY("mri_wiper_2D") ;
59
60 if( ima == NULL || imb == NULL ) RETURN(NULL) ;
61 nx = ima->nx ; ny = ima->ny ;
62 if( imb->nx != nx || imb->ny != ny || ima->kind != imb->kind ) RETURN(NULL);
63
64 if( wfac <= 0.0f ){ imc = mri_copy(imb) ; RETURN(imc) ; }
65 else if( wfac >= 1.0f ){ imc = mri_copy(ima) ; RETURN(imc) ; }
66
67 #undef IJ
68 #define IJ(i,j) ((i)+(j)*nx)
69
70 mar = (byte *)calloc(sizeof(byte),nx*ny) ;
71 imc = mri_new( nx , ny , ima->kind ) ;
72 car = (char *)mri_data_pointer(imc) ;
73
74 ps = ima->pixel_size ;
75 aar = (char *)mri_data_pointer(ima) ; if( aar == NULL ) RETURN(NULL) ;
76 bar = (char *)mri_data_pointer(imb) ; if( bar == NULL ) RETURN(NULL) ;
77
78 /* make mask */
79
80 switch( wcode ){
81 default:
82 case WIPER_FROM_LEFT:
83 ib = (int)rintf(wfac*nx) ;
84 for( jj=0 ; jj < ny ; jj++ )
85 for( ii=ib ; ii < nx ; ii++ ) mar[IJ(ii,jj)] = 1 ;
86 break ;
87
88 case WIPER_FROM_BOTTOM:
89 jb = (int)rintf(wfac*ny) ;
90 for( jj=jb ; jj < ny ; jj++ )
91 for( ii=0 ; ii < nx ; ii++ ) mar[IJ(ii,jj)] = 1 ;
92 break ;
93
94 case WIPER_FROM_CENTER:{
95 float nxh=0.5f*(nx-1) , nyh=0.5f*(ny-1) ;
96 float nxq=1.0f/(nxh*nxh) , nyq=1.0f/(nyh*nyh) ;
97 float jr,rr ;
98 for( jj=0 ; jj < ny ; jj++ ){
99 jr = (jj-nyh)*(jj-nyh)*nyq ;
100 for( ii=0 ; ii < nx ; ii++ ){
101 rr = (ii-nxh)*(ii-nxh)*nxq+jr; if( rr >= wfac ) mar[IJ(ii,jj)] = 1;
102 }
103 }
104 }
105 break ;
106 }
107
108 /* copy data, depending on mask */
109
110 for( kk=jj=0 ; jj < ny ; jj++ ){
111 for( ii=0 ; ii < nx ; ii++ ){
112 sar = mar[IJ(ii,jj)] ? bar : aar ; /* choose source image */
113
114 switch( ps ){ /* copy ps bytes from source to result */
115 default:
116 memcpy( car+kk , sar+kk , ps ) ; kk += ps ;
117 break ;
118
119 case 4: car[kk] = sar[kk] ; kk++ ; /* fall thru */
120 case 3: car[kk] = sar[kk] ; kk++ ; /* fall thru */
121 case 2: car[kk] = sar[kk] ; kk++ ; /* fall thru */
122 case 1: car[kk] = sar[kk] ; kk++ ; break ;
123 }
124 }
125 }
126
127 free(mar) ; MRI_COPY_AUX(imc,ima) ; RETURN(imc) ;
128 }
129
130 /*----------------------------------------------------------------------------*/
131 /* Mix 2 images in a fraction from 0 to 1 (0=ima 1=imb). */
132
mri_mix_2D(float wfac,MRI_IMAGE * ima,MRI_IMAGE * imb)133 MRI_IMAGE * mri_mix_2D( float wfac, MRI_IMAGE *ima, MRI_IMAGE *imb )
134 {
135 MRI_IMAGE *imc=NULL ;
136 int nx , ny , ii , nxy ;
137 float fa , fb ;
138
139 ENTRY("mri_mix_2D") ;
140
141 if( ima == NULL || imb == NULL ) RETURN(NULL) ;
142 nx = ima->nx ; ny = ima->ny ; nxy = nx*ny ;
143 if( imb->nx != nx || imb->ny != ny || ima->kind != imb->kind ) RETURN(NULL);
144
145 if( wfac <= 0.0f ){ imc = mri_copy(ima) ; RETURN(imc) ; }
146 else if( wfac >= 1.0f ){ imc = mri_copy(imb) ; RETURN(imc) ; }
147
148 imc = mri_new( nx , ny , ima->kind ) ;
149 fa = 1.0f-wfac ; fb = wfac ;
150
151 switch( ima->kind ){
152
153 default: mri_free(imc) ; imc = NULL ; break ; /* bad */
154
155 case MRI_byte:{
156 byte *ar=MRI_BYTE_PTR(ima), *br=MRI_BYTE_PTR(imb), *cr=MRI_BYTE_PTR(imc) ;
157 for( ii=0 ; ii < nxy ; ii++ )
158 cr[ii] = (byte)(fa*ar[ii]+fb*br[ii]+0.49f) ;
159 }
160 break ;
161
162 case MRI_short:{
163 short *ar=MRI_SHORT_PTR(ima), *br=MRI_SHORT_PTR(imb), *cr=MRI_SHORT_PTR(imc) ;
164 for( ii=0 ; ii < nxy ; ii++ )
165 cr[ii] = (short)(fa*ar[ii]+fb*br[ii]+0.49f) ;
166 }
167 break ;
168
169 case MRI_float:{
170 float *ar=MRI_FLOAT_PTR(ima), *br=MRI_FLOAT_PTR(imb), *cr=MRI_FLOAT_PTR(imc) ;
171 for( ii=0 ; ii < nxy ; ii++ )
172 cr[ii] = fa*ar[ii]+fb*br[ii] ;
173 }
174 break ;
175
176 case MRI_rgb:{
177 byte *ar=MRI_BYTE_PTR(ima), *br=MRI_BYTE_PTR(imb), *cr=MRI_BYTE_PTR(imc) ;
178 for( ii=0 ; ii < 3*nxy ; ii++ )
179 cr[ii] = (byte)(fa*ar[ii]+fb*br[ii]+0.49f) ;
180 }
181 break ;
182
183 case MRI_complex:{
184 complex *ar=MRI_COMPLEX_PTR(ima), *br=MRI_COMPLEX_PTR(imb), *cr=MRI_COMPLEX_PTR(imc) ;
185 for( ii=0 ; ii < nxy ; ii++ ){
186 cr[ii].r = fa*ar[ii].r+fb*br[ii].r ; cr[ii].i = fa*ar[ii].i+fb*br[ii].i ;
187 }
188 }
189 break ;
190
191 }
192
193 RETURN(imc) ;
194 }
195