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