35 #ifndef AIMS_PRIMALSKETCH_PERONAMALIKSMOOTHER_D_H 36 #define AIMS_PRIMALSKETCH_PERONAMALIKSMOOTHER_D_H 55 std::map<float, int> valueSet;
56 std::map<float,int>::iterator itVal;
58 float gxm, gxp, gym, gyp, gzm, gzp, cxm, cxp, cym, cyp, czm, czp;
70 std::cout <<
"Evaluating gradient bound : " << std::endl;
72 grad=gaussGrad.
doit(imaF);
74 writerG.
write( grad );
78 std::cout <<
"Ordering values" << std::endl;
86 if (valueSet.find(grad(x,y,z)) != valueSet.end())
87 valueSet[grad(x,y,z)]++;
89 valueSet.insert(std::pair<float,int>(grad(x,y,z), 1));
91 itVal=valueSet.begin();
93 std::cout <<
"Looking for bound with K= " << _K <<
" at value number " << nbThresh << std::endl;
94 for (; itVal!=valueSet.end(); ++itVal)
96 count+=(*itVal).second;
97 if ((count>=nbThresh) && ((count-1)<nbThresh))
98 _gradK=(*itVal).first;
100 std::cout <<
"Gradient bound has been set to " << _gradK << std::endl;
102 tmp1=&imaF; tmp2=&ima2;
103 std::cout <<
"Starting " << maxiter <<
" iterations of diffusion process" << std::endl;
105 for (i=0; i<maxiter; i++)
107 std::cout <<
"+" << std::flush;
108 grad=gaussGrad.
doit((*tmp1));
116 gxm=0; gxp=(*tmp1)(x+1,y,z) - (*tmp1)(x,y,z);
117 cxm=0; cxp=conductance( (grad(x+1,y,z)+grad(x,y,z))/2.0);
121 gxm=(*tmp1)(x-1,y,z) - (*tmp1)(x,y,z); gxp=0;
122 cxm=conductance( (grad(x-1,y,z)+grad(x,y,z))/2.0); cxp=0;
126 gxm=(*tmp1)(x-1,y,z) - (*tmp1)(x,y,z); gxp=(*tmp1)(x+1,y,z) - (*tmp1)(x,y,z);
127 cxm=conductance( (grad(x-1,y,z)+grad(x,y,z))/2.0); cxp=conductance( (grad(x+1,y,z)+grad(x,y,z))/2.0);
132 gym=0; gyp=(*tmp1)(x,y+1,z) - (*tmp1)(x,y,z);
133 cym=0; cyp=conductance( (grad(x,y+1,z)+grad(x,y,z))/2.0);
137 gym=(*tmp1)(x,y-1,z) - (*tmp1)(x,y,z); gyp=0;
138 cym=conductance( (grad(x,y-1,z)+grad(x,y,z))/2.0); cyp=0;
142 gym=(*tmp1)(x,y-1,z) - (*tmp1)(x,y,z); gyp=(*tmp1)(x,y+1,z) - (*tmp1)(x,y,z);
143 cym=conductance( (grad(x,y-1,z)+grad(x,y,z))/2.0); cyp=conductance( (grad(x,y+1,z)+grad(x,y,z))/2.0);
148 gzm=0; gzp=(*tmp1)(x,y,z+1) - (*tmp1)(x,y,z);
149 czm=0; czp=conductance( (grad(x,y,z+1)+grad(x,y,z))/2.0);
153 gzm=(*tmp1)(x,y,z-1) - (*tmp1)(x,y,z); gzp=0;
154 czm=conductance( (grad(x,y,z-1)+grad(x,y,z))/2.0); czp=0;
158 gzm=(*tmp1)(x,y,z-1) - (*tmp1)(x,y,z); gzp=(*tmp1)(x,y,z+1) - (*tmp1)(x,y,z);
159 czm=conductance( (grad(x,y,z-1)+grad(x,y,z))/2.0); czp=conductance( (grad(x,y,z+1)+grad(x,y,z))/2.0);
162 (*tmp2)(x,y,z)=(*tmp1)(x,y,z) + _dt *
165 +czm*gzm + czp*gzp );
171 std::cout <<
"Finished" << std::endl;
180 std::cerr <<
"PeronaMalik smoother must have tIn < tOut" << std::endl;
AimsData< T > doSmoothing(const AimsData< T > &ima, 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)
void swap(scoped_ptr< T > &x, scoped_ptr< T > &y)
AimsData< float > doit(const AimsData< T > &)