1 #include "Imagen.h"
2
Imagen()3 Imagen::Imagen()
4 {
5 dim[0]=0;
6 dim[1]=0;
7 datos=new float[1];
8 }
9
Imagen(Imagen & im2)10 Imagen::Imagen(Imagen & im2)
11 {
12 dim[0]=im2.fils();
13 dim[1]=im2.cols();
14 int largo=dim[0]*dim[1];
15 datos=new float[largo];
16 for(int i=0; i< largo; i++)
17 datos[i]=im2.datos[i];
18 }
19
Imagen(int fil,int col)20 Imagen::Imagen(int fil, int col)
21 {
22 dim[0]=fil;
23 dim[1]=col;
24 datos=new float[fil*col];
25 }
26
Imagen(int fil,int col,float val)27 Imagen::Imagen(int fil, int col, float val)
28 {
29 dim[0]=fil;
30 dim[1]=col;
31 datos=new float[fil*col];
32 for(int i=0; i<fil*col;i++)
33 datos[i]=val;
34 }
35
36
~Imagen()37 Imagen::~Imagen()
38 {
39 delete[] datos;
40 }
41
42
operator *=(float dt)43 void Imagen::operator*=(float dt)
44 {
45 int largo=dim[0]*dim[1];
46 for(int i=0;i<largo;i++)
47 datos[i]*=dt;
48 }
49
operator +=(float dt)50 void Imagen::operator+=(float dt)
51 {
52 int largo=dim[0]*dim[1];
53 for(int i=0;i<largo;i++)
54 datos[i]+=dt;
55 }
56
operator +=(Imagen & im2)57 void Imagen::operator+=(Imagen & im2)
58 {
59 int fil2=im2.fils();
60 int col2=im2.cols();
61 if(dim[0]!=fil2 || dim[1]!=col2)
62 {
63 fprintf(stderr,"Diferentes dimensiones al sumar imagenes \n");
64 return;
65 }
66
67 int largo=dim[0]*dim[1];
68 for(int i=0; i<largo; i++)
69 datos[i]+=im2.datos[i];
70
71 return;
72 }
73
operator -=(Imagen & im2)74 void Imagen::operator-=(Imagen & im2)
75 {
76 int fil2=im2.fils();
77 int col2=im2.cols();
78 if(dim[0]!=fil2 || dim[1]!=col2)
79 {
80 fprintf(stderr,"Diferentes dimensiones al restar imagenes \n");
81 return;
82 }
83
84 int largo=dim[0]*dim[1];
85 for(int i=0; i<largo; i++)
86 datos[i]-=im2.datos[i];
87
88 return;
89 }
90
91
operator *=(Imagen & im2)92 void Imagen::operator*=(Imagen & im2)
93 {
94 int fil2=im2.fils();
95 int col2=im2.cols();
96 if(dim[0]!=fil2 || dim[1]!=col2)
97 {
98 fprintf(stderr,"Diferentes dimensiones al multiplicar imagenes \n");
99 return;
100 }
101
102 int largo=dim[0]*dim[1];
103 for(int i=0; i<largo; i++)
104 this->datos[i] *= (&im2)->datos[i];
105
106 return;
107 }
108
operator /=(Imagen & im2)109 void Imagen::operator/=(Imagen & im2)
110 {
111 // si el divisor es 0, pone 0 en el cociente...
112 int fil2=im2.fils();
113 int col2=im2.cols();
114 if(dim[0]!=fil2 || dim[1]!=col2)
115 {
116 fprintf(stderr,"Diferentes dimensiones al multiplicar imagenes \n");
117 return;
118 }
119
120 int largo=dim[0]*dim[1];
121 double div;
122 for(int i=0; i<largo; i++)
123 {
124 div=im2.datos[i];
125 if(fabs(div)>1e-10)
126 datos[i]/=div;
127 else
128 datos[i]=0.0;
129 }
130 return;
131 }
132
operator =(Imagen & im2)133 void Imagen::operator=(Imagen & im2)
134 {
135 // este operador no duplica la memoria //
136 int fil2=im2.fils();
137 int col2=im2.cols();
138 if(dim[0]!=fil2 || dim[1]!=col2)
139 {
140 // fprintf(stderr,"Diferentes dimensiones al copiar imagenes \n");
141 dim[0]=fil2;
142 dim[1]=col2;
143
144 delete[] datos;
145 datos=new float[fil2*col2];
146 }
147
148 int largo=dim[0]*dim[1];
149 for(int i=0; i<largo; i++)
150 datos[i]=im2.datos[i];
151
152 return;
153 }
154
setvalues(int fil,int col,float * val)155 void Imagen::setvalues(int fil, int col, float* val)
156 {
157 dim[0]=fil;
158 dim[1]=col;
159 datos=val;
160 }
161
162
minval()163 float Imagen::minval()
164 {
165 float m=1e20;
166 int largo=dim[0]*dim[1];
167 for(int i=0; i<largo; i++)
168 m=min(m,datos[i]);
169
170 return m;
171 }
172
173
maxval()174 float Imagen::maxval()
175 {
176 float m=-1e20;
177 int largo=dim[0]*dim[1];
178 for(int i=0; i<largo; i++)
179 m=max(m,datos[i]);
180
181 return m;
182 }
183
maxabsval()184 float Imagen::maxabsval()
185 {
186 float m=-1e20;
187 int largo=dim[0]*dim[1];
188 for(int i=0; i<largo; i++)
189 m=max(m,fabs(datos[i]));
190
191 return m;
192 }
193
194
medval()195 float Imagen::medval()
196 {
197 float m=0.0;
198 int largo=dim[0]*dim[1];
199 for(int i=0; i<largo; i++)
200 m+=datos[i];
201 m/= (double)largo;
202 return m;
203 }
204
recorta(float M,float m)205 void Imagen::recorta(float M,float m)
206 {
207 // recorta los valores mayores que M y menores que m
208
209 int largo=dim[0]*dim[1];
210 for(int i=0;i<largo;i++)
211 {
212 datos[i]=min(datos[i],M);
213 datos[i]=max(datos[i],m);
214 }
215 }
216
217
218
MSE(Imagen & Im2,float escala)219 float Imagen::MSE(Imagen & Im2, float escala)
220 {
221 int largo=dim[0]*dim[1];
222 float res=0.0;
223 float tmp;
224 float v=1.0/escala;
225 float v2=1.0;
226 for(int i=0;i<largo;i++)
227 {
228 tmp=(datos[i])*v-(Im2.datos[i])*v2;
229 tmp=fabs(tmp);
230 res+=tmp;
231 }
232 return(res/largo);
233
234 }
235
236
escala(float maxv,float minv)237 void Imagen::escala(float maxv, float minv)
238 {
239 int largo=dim[0]*dim[1];
240 float M=this->maxval();
241 float m=this->minval();
242
243 float R;
244 float eps=1e-6;
245 float s=(maxv-minv)/(M-m);
246 for(int i=0;i<largo;i++)
247 {
248 R=datos[i];
249 datos[i]=minv+s*(R-m);
250 }
251 }
252
253 // Related to fft
fftshift()254 void Imagen::fftshift()
255 {
256 int fil=dim[0];
257 int col=dim[1];
258 float tmp;
259
260 for(int i=0;i<fil/2;i++)
261 for(int j=0;j<col/2;j++)
262 {
263 tmp=(*this)(i,j);
264 (*this)(i,j)=(*this)(i+fil/2,j+col/2);
265 (*this)(i+fil/2,j+col/2)=tmp;
266 tmp=(*this)(i+fil/2,j);
267 (*this)(i+fil/2,j)=(*this)(i,j+col/2);
268 (*this)(i,j+col/2)=tmp;
269 }
270 }
271
nucleo_gaussiano(int fil,int col,float sigma)272 Imagen & nucleo_gaussiano(int fil, int col, float sigma)
273 {
274 Imagen * res= new Imagen(fil,col,0.0);
275 float normaliza=1.0/(sqrt(2*M_PI)*sigma+1e-6);
276 int i_;
277 int mitfil=fil/2;
278 int mitcol=col/2;
279 for(int i=0;i<fil;i++)
280 for(int j=0;j<col;j++)
281 (*res)(i,j)=normaliza*exp( -((i-mitfil)*(i-mitfil)+(j-mitcol)*(j-mitcol) )/(2*sigma*sigma) );
282
283 return(*res);
284 }
285
286
producto(fftwf_complex * A,fftwf_complex * B,fftwf_complex * AB,int fil,int col)287 void producto(fftwf_complex* A, fftwf_complex* B,fftwf_complex* AB, int fil, int col)
288 {
289 // int length=fil*(col/2+1);
290 //fftw_complex* C= (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * length);
291 int length=fil*col;
292
293 for (int i = 0; i < length; i++)
294 {
295 AB[i][0] = (A[i][0] * B[i][0] - A[i][1] * B[i][1]);
296 AB[i][1] = (A[i][0] * B[i][1] + A[i][1] * B[i][0]);
297 }
298
299
300 }
301
302