35 #ifndef AIMS_PRIMALSKETCH_PERONAMALIKSMOOTHER_D_H
36 #define AIMS_PRIMALSKETCH_PERONAMALIKSMOOTHER_D_H
53 carto::AllocatorContext::fast() );
58 std::map<float, int> valueSet;
59 std::map<float,int>::iterator itVal;
61 float gxm, gxp, gym, gyp, gzm, gzp, cxm, cxp, cym, cyp, czm, czp;
74 std::cout <<
"Evaluating gradient bound : " << std::endl;
76 grad=gaussGrad.
doit(imaF);
82 std::cout <<
"Ordering values" << std::endl;
90 if (valueSet.find(grad(x,y,z)) != valueSet.end())
91 valueSet[grad(x,y,z)]++;
93 valueSet.insert(std::pair<float,int>(grad(x,y,z), 1));
95 itVal=valueSet.
begin();
97 std::cout <<
"Looking for bound with K= " << _K <<
" at value number " << nbThresh << std::endl;
98 for (; itVal!=valueSet.end(); ++itVal)
100 count+=(*itVal).second;
101 if ((count>=nbThresh) && ((count-1)<nbThresh))
102 _gradK=(*itVal).first;
104 std::cout <<
"Gradient bound has been set to " << _gradK << std::endl;
106 tmp1=&imaF; tmp2=&ima2;
107 std::cout <<
"Starting " << maxiter <<
" iterations of diffusion process" << std::endl;
109 for (i=0; i<maxiter; i++)
111 std::cout <<
"+" << std::flush;
112 grad=gaussGrad.
doit((*tmp1));
120 gxm=0; gxp=(*tmp1)(x+1,y,z) - (*tmp1)(x,y,z);
121 cxm=0; cxp=conductance( (grad(x+1,y,z)+grad(x,y,z))/2.0);
125 gxm=(*tmp1)(x-1,y,z) - (*tmp1)(x,y,z); gxp=0;
126 cxm=conductance( (grad(x-1,y,z)+grad(x,y,z))/2.0); cxp=0;
130 gxm=(*tmp1)(x-1,y,z) - (*tmp1)(x,y,z); gxp=(*tmp1)(x+1,y,z) - (*tmp1)(x,y,z);
131 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);
136 gym=0; gyp=(*tmp1)(x,y+1,z) - (*tmp1)(x,y,z);
137 cym=0; cyp=conductance( (grad(x,y+1,z)+grad(x,y,z))/2.0);
141 gym=(*tmp1)(x,y-1,z) - (*tmp1)(x,y,z); gyp=0;
142 cym=conductance( (grad(x,y-1,z)+grad(x,y,z))/2.0); cyp=0;
146 gym=(*tmp1)(x,y-1,z) - (*tmp1)(x,y,z); gyp=(*tmp1)(x,y+1,z) - (*tmp1)(x,y,z);
147 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);
152 gzm=0; gzp=(*tmp1)(x,y,z+1) - (*tmp1)(x,y,z);
153 czm=0; czp=conductance( (grad(x,y,z+1)+grad(x,y,z))/2.0);
157 gzm=(*tmp1)(x,y,z-1) - (*tmp1)(x,y,z); gzp=0;
158 czm=conductance( (grad(x,y,z-1)+grad(x,y,z))/2.0); czp=0;
162 gzm=(*tmp1)(x,y,z-1) - (*tmp1)(x,y,z); gzp=(*tmp1)(x,y,z+1) - (*tmp1)(x,y,z);
163 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);
166 (*tmp2)(x,y,z)=(*tmp1)(x,y,z) + _dt *
169 +czm*gzm + czp*gzp );
175 std::cout <<
"Finished" << std::endl;
185 std::cerr <<
"PeronaMalik smoother must have tIn < tOut" << std::endl;
carto::VolumeRef< float > doit(const carto::rc_ptr< carto::Volume< T > > &)
carto::VolumeRef< T > doSmoothing(const carto::VolumeRef< T > &ima, int maxiter, bool verbose=false)
virtual void convert(const INP &in, OUTP &out) const
std::vector< int > getSize() const
void swap(scoped_ptr< T > &x, scoped_ptr< T > &y)