void evaluate_connection( const tipl::geometry<3>& dim, float otsu, const fib_fa_type& fib_fa, fun1 dir, fun2 f, bool check_trajectory = true) { unsigned char num_fib = fib_fa.size(); char dx[13] = {1,0,0,1,1,0, 1, 1, 0, 1,-1, 1, 1}; char dy[13] = {0,1,0,1,0,1,-1, 0, 1, 1, 1,-1, 1}; char dz[13] = {0,0,1,0,1,1, 0,-1,-1, 1, 1, 1,-1}; std::vector<tipl::vector<3> > dis(13); for(unsigned int i = 0;i < 13;++i) { dis[i] = tipl::vector<3>(dx[i],dy[i],dz[i]); dis[i].normalize(); } for(tipl::pixel_index<3> index(dim);index < dim.size();++index) { if(fib_fa[0][index.index()] <= otsu) continue; for(unsigned char fib1 = 0;fib1 < num_fib;++fib1) { if(fib_fa[fib1][index.index()] <= otsu) break; for(unsigned int j = 0;j < 2;++j) for(unsigned int i = 0;i < 13;++i) { tipl::vector<3,int> pos; pos = j ? tipl::vector<3,int>(index[0] + dx[i],index[1] + dy[i],index[2] + dz[i]) :tipl::vector<3,int>(index[0] - dx[i],index[1] - dy[i],index[2] - dz[i]); if(!dim.is_valid(pos)) continue; tipl::pixel_index<3> other_index(pos[0],pos[1],pos[2],dim); if(check_trajectory) { if(std::abs(dir(index.index(),fib1)*dis[i]) <= 0.8665) continue; for(unsigned char fib2 = 0;fib2 < num_fib;++fib2) if(fib_fa[fib2][other_index.index()] > otsu && std::abs(dir(other_index.index(),fib2)*dis[i]) > 0.8665) f(index.index(),fib1,other_index.index(),fib2); } else { for(unsigned char fib2 = 0;fib2 < num_fib;++fib2) if(fib_fa[fib2][other_index.index()] > otsu && std::abs(dir(other_index.index(),fib2)*dir(index.index(),fib1)) > 0.8665) f(index.index(),fib1,other_index.index(),fib2); } } } } }
std::pair<float,float> evaluate_fib( const image::geometry<3>& dim, const std::vector<std::vector<float> >& fib_fa, const std::vector<std::vector<float> >& fib_dir) { unsigned char num_fib = fib_fa.size(); char dx[13] = {1,0,0,1,1,0, 1, 1, 0, 1,-1, 1, 1}; char dy[13] = {0,1,0,1,0,1,-1, 0, 1, 1, 1,-1, 1}; char dz[13] = {0,0,1,0,1,1, 0,-1,-1, 1, 1, 1,-1}; std::vector<image::vector<3> > dis(13); for(unsigned int i = 0;i < 13;++i) { dis[i] = image::vector<3>(dx[i],dy[i],dz[i]); dis[i].normalize(); } float otsu = *std::max_element(fib_fa[0].begin(),fib_fa[0].end())*0.1; std::vector<std::vector<unsigned char> > connected(fib_fa.size()); for(unsigned int index = 0;index < connected.size();++index) connected[index].resize(dim.size()); float connection_count = 0; for(image::pixel_index<3> index(dim);index < dim.size();++index) { if(fib_fa[0][index.index()] <= otsu) continue; unsigned int index3 = index.index()+index.index()+index.index(); for(unsigned char fib1 = 0;fib1 < num_fib;++fib1) { if(fib_fa[fib1][index.index()] <= otsu) break; for(unsigned int j = 0;j < 2;++j) for(unsigned int i = 0;i < 13;++i) { image::vector<3,int> pos; pos = j ? image::vector<3,int>(index[0] + dx[i],index[1] + dy[i],index[2] + dz[i]) :image::vector<3,int>(index[0] - dx[i],index[1] - dy[i],index[2] - dz[i]); if(!dim.is_valid(pos)) continue; image::pixel_index<3> other_index(pos[0],pos[1],pos[2],dim); unsigned int other_index3 = other_index.index()+other_index.index()+other_index.index(); if(std::abs(image::vector<3>(&fib_dir[fib1][index3])*dis[i]) <= 0.8665) continue; for(unsigned char fib2 = 0;fib2 < num_fib;++fib2) if(fib_fa[fib2][other_index.index()] > otsu && std::abs(image::vector<3>(&fib_dir[fib2][other_index3])*dis[i]) > 0.8665) { connected[fib1][index.index()] = 1; connected[fib2][other_index.index()] = 1; connection_count += fib_fa[fib2][other_index.index()]; } } } } float no_connection_count = 0; for(image::pixel_index<3> index(dim);index < dim.size();++index) { for(unsigned int i = 0;i < num_fib;++i) if(fib_fa[i][index.index()] > otsu && !connected[i][index.index()]) { no_connection_count += fib_fa[i][index.index()]; } } return std::make_pair(connection_count,no_connection_count); }