35 #ifndef AIMS_PRIMALSKETCH_COUPLEDDIFFUSION2DSMOOTHER_D_H 36 #define AIMS_PRIMALSKETCH_COUPLEDDIFFUSION2DSMOOTHER_D_H 60 template<
class T> std::pair<AimsData<T>,
AimsData<T> >
77 if ((ima.first.dimZ()>1) || (ima.second.dimZ()>1))
79 std::cerr <<
"coupledDiffusion2DSmoother: only for 2D images !!" 85 || (!
hasSameDim(ima.first, constraints.second)))
87 std::cerr <<
"coupledDiffusion2DSmoother: images do not all have the same size..." << std::endl;
91 int sx=ima.first.dimX(), sy=ima.first.dimY(), x, y;
95 float lapl1, lapl2, div1, div2, lapx1, lapy1, lapx2, lapy2;
97 std::vector<std::pair<int, int> > vcont1, vcont2;
98 std::vector<std::pair<int, int> >
::iterator pt1, pt2;
102 imaB1( sx, sy ),imaB2( sx, sy ),
103 grad1_x( sx, sy ), grad1_y( sx, sy ),
104 grad2_x( sx, sy ), grad2_y( sx, sy );
105 conv.
convert( ima.first, imaF1 );
106 conv.
convert( ima.second, imaF2 );
107 float cdiff1, cdiff2, diff1, diff2, diffMax1, diffMax2;
108 tmp1_1=&imaF1; tmp1_2=&imaB1;
109 tmp2_1=&imaF2; tmp2_2=&imaB2;
111 std::cout <<
"Initalizing images with constraints" << std::endl;
116 if ((fabs(constraints.first(x,y)-1) < epsilon) || (fabs(constraints.first(x,y)-80)<epsilon))
118 imaF1(x,y)=(float) constraints.first(x,y);
119 vcont1.push_back(std::pair<int,int>(x,y));
121 if ((fabs(constraints.second(x,y)-1) < epsilon) || (fabs(constraints.second(x,y)-80)<epsilon))
123 imaF2(x,y)=(float) constraints.second(x,y);
124 vcont2.push_back(std::pair<int,int>(x,y));
136 std::cout <<
"Starting " << maxiter
137 <<
" iterations of diffusion process" << std::endl;
139 int sz=(maxiter/PAS) + 1;
140 AimsData<T> debug1(sx, sy, sz), debug2(sx, sy, sz);
141 AimsData<T> grad1x(sx, sy, sz), grad1y(sx, sy, sz), grad2x(sx, sy, sz), grad2y(sx, sy, sz);
142 AimsData<T> gugv(sx, sy), scal(sx, sy, sz), gu(sx, sy, sz), gv(sx, sy, sz);
147 debug1(x, y, 0)=(*tmp1_1)(x, y);
148 debug2(x, y, 0)=(*tmp2_1)(x, y);
151 diffMax1=diffMax2=0.0;
153 for (i=0; i<maxiter; i++)
157 std::cout <<
"(t=" << i*_dt <<
") -> diff=(" << diffMax1 <<
"," 158 << diffMax2 <<
") - "<< std::endl;;
161 diffMax1=diffMax2=0.0;
168 grad1_x(x,y)=((*tmp1_1)(x+1,y) - (*tmp1_1)(x,y))/2.0;
169 grad2_x(x,y)=((*tmp2_1)(x+1,y) - (*tmp2_1)(x,y))/2.0;
173 grad1_x(x,y)=((*tmp1_1)(x,y) - (*tmp1_1)(x-1,y))/2.0;
174 grad2_x(x,y)=((*tmp2_1)(x,y) - (*tmp2_1)(x-1,y))/2.0;
178 grad1_x(x,y)=((*tmp1_1)(x+1,y) - (*tmp1_1)(x-1,y))/2.0;
179 grad2_x(x,y)=((*tmp2_1)(x+1,y) - (*tmp2_1)(x-1,y))/2.0;
183 grad1_y(x,y)=((*tmp1_1)(x,y+1) - (*tmp1_1)(x,y))/2.0;
184 grad2_y(x,y)=((*tmp2_1)(x,y+1) - (*tmp2_1)(x,y))/2.0;
188 grad1_y(x,y)=((*tmp1_1)(x,y) - (*tmp1_1)(x,y-1))/2.0;
189 grad2_y(x,y)=((*tmp2_1)(x,y) - (*tmp2_1)(x,y-1))/2.0;
193 grad1_y(x,y)=((*tmp1_1)(x,y+1) - (*tmp1_1)(x,y-1))/2.0;
194 grad2_y(x,y)=((*tmp2_1)(x,y+1) - (*tmp2_1)(x,y-1))/2.0;
197 gugv(x,y)=grad1_x(x,y)*grad2_x(x,y) + grad1_y(x,y)*grad2_y(x,y);
205 g1x=g2d.
doit(grad1_x);
206 g2x=g2d.
doit(grad2_x);
207 g1y=g2d.
doit(grad1_y);
208 g2y=g2d.
doit(grad2_y);
213 double prod=g1x(x,y)*g2x(x,y) + g1y(x,y)*g2y(x,y);
214 gugv(x,y)=float(2*prod*exp(-prod*prod));
219 float div1x, div1y, div2x, div2y;
220 for (y=0; y<(sy); y++)
221 for (x=0; x<(sx); x++)
225 lapx1=(*tmp1_1)(x+1,y) + (*tmp1_1)(x,y) -2*(*tmp1_1)(x,y);
226 lapx2=(*tmp2_1)(x+1,y) + (*tmp2_1)(x,y) -2*(*tmp2_1)(x,y);
227 div1x=( (g1x(x+1,y)*g2x(x+1,y) + g1y(x+1,y)*g2x(x+1,y) )*g2x(x+1,y)
228 - (g1x(x,y)*g2x(x,y) + g1y(x,y)*g2x(x,y) )*g2x(x,y) )/2.0;
229 div2x=( (g1x(x+1,y)*g2x(x+1,y) + g1y(x+1,y)*g2x(x+1,y) )*g1x(x+1,y)
230 - (g1x(x,y)*g2x(x,y) + g1y(x,y)*g2x(x,y) )*g1x(x,y) )/2.0;
234 lapx1=(*tmp1_1)(x,y) + (*tmp1_1)(x-1,y) -2*(*tmp1_1)(x,y);
235 lapx2=(*tmp2_1)(x,y) + (*tmp2_1)(x-1,y) -2*(*tmp2_1)(x,y);
236 div1x=( (g1x(x,y)*g2x(x,y) + g1y(x,y)*g2x(x,y) )*g2x(x,y)
237 - (g1x(x-1,y)*g2x(x-1,y) + g1y(x-1,y)*g2x(x-1,y) )*g2x(x-1,y) )/2.0;
238 div2x=( (g1x(x,y)*g2x(x,y) + g1y(x,y)*g2x(x,y) )*g1x(x,y)
239 - (g1x(x-1,y)*g2x(x-1,y) + g1y(x-1,y)*g2x(x-1,y) )*g1x(x-1,y) )/2.0;
243 lapx1=(*tmp1_1)(x+1,y) + (*tmp1_1)(x-1,y) -2*(*tmp1_1)(x,y);
244 lapx2=(*tmp2_1)(x+1,y) + (*tmp2_1)(x-1,y) -2*(*tmp2_1)(x,y);
245 div1x=( (g1x(x+1,y)*g2x(x+1,y) + g1y(x+1,y)*g2x(x+1,y) )*g2x(x+1,y)
246 - (g1x(x-1,y)*g2x(x-1,y) + g1y(x-1,y)*g2x(x-1,y) )*g2x(x-1,y) )/2.0;
247 div2x=( (g1x(x+1,y)*g2x(x+1,y) + g1y(x+1,y)*g2x(x+1,y) )*g1x(x+1,y)
248 - (g1x(x-1,y)*g2x(x-1,y) + g1y(x-1,y)*g2x(x-1,y) )*g1x(x-1,y) )/2.0;
252 lapy1=(*tmp1_1)(x,y+1) + (*tmp1_1)(x,y) -2*(*tmp1_1)(x,y);
253 lapy2=(*tmp2_1)(x,y+1) + (*tmp2_1)(x,y) -2*(*tmp2_1)(x,y);
254 div1y=( (g1x(x,y+1)*g2x(x,y+1) + g1y(x,y+1)*g2x(x,y+1) )*g2y(x,y+1)
255 - (g1x(x,y)*g2x(x,y) + g1y(x,y)*g2x(x,y) )*g2y(x,y) )/2.0;
256 div2y=( (g1x(x,y+1)*g2x(x,y+1) + g1y(x,y+1)*g2x(x,y+1) )*g1y(x,y+1)
257 - (g1x(x,y)*g2x(x,y) + g1y(x,y)*g2x(x,y) )*g1y(x,y) )/2.0;
261 lapy1=(*tmp1_1)(x,y) + (*tmp1_1)(x,y-1) -2*(*tmp1_1)(x,y);
262 lapy2=(*tmp2_1)(x,y) + (*tmp2_1)(x,y-1) -2*(*tmp2_1)(x,y);
263 div1y=( (g1x(x,y)*g2x(x,y) + g1y(x,y)*g2x(x,y) )*g2y(x,y)
264 - (g1x(x,y-1)*g2x(x,y-1) + g1y(x,y-1)*g2x(x,y-1) )*g2y(x,y-1) )/2.0;
265 div2y=( (g1x(x,y)*g2x(x,y) + g1y(x,y)*g2x(x,y) )*g1y(x,y)
266 - (g1x(x,y-1)*g2x(x,y-1) + g1y(x,y-1)*g2x(x,y-1) )*g1y(x,y-1) )/2.0;
270 lapy1=(*tmp1_1)(x,y+1) + (*tmp1_1)(x,y-1) -2*(*tmp1_1)(x,y);
271 lapy2=(*tmp2_1)(x,y+1) + (*tmp2_1)(x,y-1) -2*(*tmp2_1)(x,y);
272 div1y=( (g1x(x,y+1)*g2x(x,y+1) + g1y(x,y+1)*g2x(x,y+1) )*g2y(x,y+1)
273 - (g1x(x,y-1)*g2x(x,y-1) + g1y(x,y-1)*g2x(x,y-1) )*g2y(x,y-1) )/2.0;
274 div2y=( (g1x(x,y+1)*g2x(x,y+1) + g1y(x,y+1)*g2x(x,y+1) )*g1y(x,y+1)
275 - (g1x(x,y-1)*g2x(x,y-1) + g1y(x,y-1)*g2x(x,y-1) )*g1y(x,y-1) )/2.0;
283 if ((fabs(constraints.first(x,y))>epsilon) && (fabs(constraints.first(x,y)-0) > epsilon) && (fabs(constraints.first(x,y)-80) > epsilon))
284 cdiff1=(*tmp1_1)(x,y) - constraints.first(x,y);
287 if ((fabs(constraints.second(x,y)) > epsilon) && (fabs(constraints.second(x,y)-0) > epsilon) && (fabs(constraints.second(x,y)-80)> epsilon))
288 cdiff2=(*tmp2_1)(x,y) - constraints.second(x,y);
291 (*tmp1_2)(x,y) = (*tmp1_1)(x,y) + _dt*(_alpha*lapl1 + _beta*div1 -
_gamma*cdiff1);
292 (*tmp2_2)(x,y) = (*tmp2_1)(x,y) + _dt*(_alpha*lapl2 + _beta*div2 -
_gamma*cdiff2);
293 diff1 = fabs((*tmp1_2)(x,y) - (*tmp1_1)(x,y));
294 diff2 = fabs((*tmp2_2)(x,y) - (*tmp2_1)(x,y));
296 diffMax1 += diff1; diffMax2 += diff2;
299 diffMax1=diffMax1/float(sx*sy);
300 diffMax2=diffMax2/float(sx*sy);
302 for (pt1=vcont1.begin(); pt1!=vcont1.end(); ++pt1)
303 (*tmp1_2)((*pt1).first, (*pt1).second)= (
float) constraints.first((*pt1).first, (*pt1).second);
304 for (pt2=vcont2.begin(); pt2!=vcont2.end(); ++pt2)
305 (*tmp2_2)((*pt2).first, (*pt2).second)= (
float) constraints.second((*pt2).first, (*pt2).second);
318 debug1(x, y, z)=(*tmp1_1)(x, y);
319 debug2(x, y, z)=(*tmp2_1)(x, y);
320 grad1x(x, y, z)=grad1_x(x,y);
321 grad1y(x, y, z)=grad1_y(x,y);
322 grad2x(x, y, z)=grad2_x(x,y);
323 grad2y(x, y, z)=grad2_y(x,y);
324 scal(x, y, z)=gugv(x,y);
330 std::cout <<
"Finished" << std::endl;
333 conv2.
convert( (*tmp1_1),out1);
334 conv2.
convert( (*tmp2_1),out2);
338 std::cout <<
"Computing and writing iso-contours" << std::endl;
341 for (y=0; y<sy-1; y++)
342 for (x=0; x<sx-1; x++)
347 for (y=0; y<sy-1; y++)
348 for (x=0; x<sx-1; x++)
351 for (value=0; value < 80; value=value+5)
355 if ((((debug1(x,y,z)-
float(value))*(debug1(x,y+1,z)-
float(value)))<=0)
356 || (((debug1(x,y,z)-
float(value))*(debug1(x+1,y,z)-
float(value)))<=0))
358 if ((((debug2(x,y,z)-
float(value))*(debug2(x,y+1,z)-
float(value)))<=0)
359 || (((debug2(x,y,z)-
float(value))*(debug2(x+1,y,z)-
float(value)))<=0))
365 writerIso.
write(iso);
369 writerD1.
write(debug1);
370 writerD2.
write(debug2);
373 writerG1x.
write(grad1x);
374 writerG2x.
write(grad2x);
377 writerG1y.
write(grad1y);
378 writerG2y.
write(grad2y);
380 writerGuGv.
write(scal);
386 std::cerr <<
"coupledDiffusion2DSmoother: must have tIn < tOut" std::pair< AimsData< T >, AimsData< T > > doSmoothing(const std::pair< AimsData< T >, AimsData< T > > &ima, const std::pair< AimsData< T >, AimsData< T > > &constraint, int maxiter, bool verbose=false)
virtual void convert(const INP &in, OUTP &out) const
virtual bool write(const T &obj, bool ascii=false, const std::string *format=0)
bool hasSameDim(const AimsData< T > &v1, const AimsData< T > &v2)
AimsData< T > doit(const AimsData< T > &)