void volume_file_info::calcMinMax(unsigned int var, unsigned int time) const { thread_info ti(BOOST_CURRENT_FUNCTION); volume vol; const uint64 maxdim = 128; //read in 128^3 chunks for(unsigned int off_z = 0; off_z < ZDim(); off_z+=maxdim) for(unsigned int off_y = 0; off_y < YDim(); off_y+=maxdim) for(unsigned int off_x = 0; off_x < XDim(); off_x+=maxdim) { dimension read_dim(std::min(XDim()-off_x,maxdim), std::min(YDim()-off_y,maxdim), std::min(ZDim()-off_z,maxdim)); readVolumeFile(vol,filename(),var,time, off_x,off_y,off_z,read_dim); if(off_x==0 && off_y==0 && off_z==0) { _data._min[var][time] = vol.min(); _data._max[var][time] = vol.max(); } else { if(_data._min[var][time] > vol.min()) _data._min[var][time] = vol.min(); if(_data._max[var][time] < vol.max()) _data._max[var][time] = vol.max(); } } _data._minIsSet[var][time] = true; _data._maxIsSet[var][time] = true; }
Voxels& Voxels::anisotropicDiffusion(unsigned int iterations) { CVC::ThreadInfo ti(BOOST_CURRENT_FUNCTION); double cn, cs, ce, cw, cu, cd; double delta_n, delta_s, delta_e, delta_w, delta_u, delta_d; double K_para = 3; double Lamda_para = 0.16f; unsigned int m; VolMagick::uint64 i,j,k, stepnum = 0; Voxels tempt(*this); if(_vosm) _vosm->start(this, VoxelOperationStatusMessenger::AnisotropicDiffusion, ZDim()*iterations); uint64 numSteps = ZDim()*iterations; for (m=0; m<iterations; m++) { for (k=0; k<ZDim(); k++) { for (j=0; j<YDim(); j++) for (i=0; i<XDim(); i++) { if (j < YDim()-1) delta_s = (*this)(i,j+1,k) - (*this)(i,j,k); else delta_s = 0.0; if (j > 0) delta_n = (*this)(i,j-1,k) - (*this)(i,j,k); else delta_n = 0.0; if (i < XDim()-1) delta_e = (*this)(i+1,j,k) - (*this)(i,j,k); else delta_e = 0.0; if (i > 0) delta_w = (*this)(i-1,j,k) - (*this)(i,j,k); else delta_w = 0.0; if (k < ZDim()-1) delta_u = (*this)(i,j,k+1) - (*this)(i,j,k); else delta_u = 0.0; if (k > 0) delta_d = (*this)(i,j,k-1) - (*this)(i,j,k); else delta_d = 0.0; cn = 1.0f / (1.0f + ((delta_n * delta_n) / (K_para * K_para))); cs = 1.0f / (1.0f + ((delta_s * delta_s) / (K_para * K_para))); ce = 1.0f / (1.0f + ((delta_e * delta_e) / (K_para * K_para))); cw = 1.0f / (1.0f + ((delta_w * delta_w) / (K_para * K_para))); cu = 1.0f / (1.0f + ((delta_u * delta_u) / (K_para * K_para))); cd = 1.0f / (1.0f + ((delta_d * delta_d) / (K_para * K_para))); tempt(i,j,k, (*this)(i,j,k) + Lamda_para * (cn * delta_n + cs * delta_s + ce * delta_e + cw * delta_w + cu * delta_u + cd * delta_d)); } if(_vosm) _vosm->step(this, VoxelOperationStatusMessenger::AnisotropicDiffusion, stepnum); cvcapp.threadProgress(float(stepnum)/float(numSteps)); stepnum++; } (*this) = tempt; } if(_vosm) _vosm->end(this, VoxelOperationStatusMessenger::AnisotropicDiffusion); cvcapp.threadProgress(1.0f); return *this; }