vigra::MultiArray<2, coordinate_t> drtile(const vigra::MultiArrayView<N, weight_t, Stride>& A, unsigned long w) { #ifdef DEBUG_PRINTING std::cout << "drtile(A,w)" << std::endl; std::cout << " A =" << std::endl; printArray(A, std::string(" ")); std::cout << " A.shape =" << A.shape() << std::endl; std::cout << " w =" << w << std::endl; #endif std::vector< vigra::TinyVector<coordinate_t, 3> > t; vigra::TinyVector<coordinate_t, N> currentCoordinate; ::detail<N,N,Stride>::drtileImpl(A,w,t, currentCoordinate); #ifdef DEBUG_PRINTING std::cout << "drtile returned:" << std::endl; for(unsigned long i=0; i<t.size(); ++i) { const coordinate_t& d = t[i][0]; const coordinate_t& s = t[i][1]; const coordinate_t& e = t[i][2]; std::cout << "dimension " << d << ": [" << s << "," << e << ")" << std::endl; } #endif typedef vigra::TinyVector<coordinate_t, 2*N> bbox_t; typedef vigra::MultiArray<2, coordinate_t> bbox_vector_t; unsigned long bboxCount = 0; for(unsigned long i=0; i<t.size(); ++i) { const coordinate_t& d = t[i][0]; if(d==1) { // || (i < t.size()-1 && d<t[i+1][0])) { ++bboxCount; } } bbox_vector_t bb(typename bbox_vector_t::size_type(bboxCount, 2*N)); bbox_t b; unsigned long j = 0; for(unsigned long i=0; i<t.size(); ++i) { const coordinate_t& d = t[i][0]; const coordinate_t& s = t[i][1]; const coordinate_t& e = t[i][2]; b[d-1] = s; b[N+d-1] = e; if(d==1) { // || (i < t.size()-1 && d<t[i+1][0])) { for(unsigned long k=0; k<2*N; ++k) { bb(j,k) = b[k]; } ++j; } } return bb; }
IterativeRegionMerging::IterativeRegionMerging( vigra::MultiArrayView<2, int> initialRegions) : _grid(initialRegions.shape()), _gridEdgeWeights(_grid), _ragToGridEdges(_rag), _parentNodes(_rag), _edgeScores(_rag), _mergeTree(initialRegions.shape()*2), _mergeEdges(EdgeCompare(_edgeScores)) { // get initial region adjecancy graph RagType::EdgeMap<std::vector<GridGraphType::Edge> > affiliatedEdges; vigra::makeRegionAdjacencyGraph( _grid, initialRegions, _rag, affiliatedEdges); // get grid edges for each rag edge for (RagType::EdgeIt edge(_rag); edge != lemon::INVALID; ++edge) _ragToGridEdges[*edge] = affiliatedEdges[*edge]; // prepare merge-tree image _mergeTree = 0; // logging int numRegions = 0; for (RagType::NodeIt node(_rag); node != lemon::INVALID; ++node) numRegions++; int numRegionEdges = _ragToGridEdges.size(); LOG_USER(mergetreelog) << "got region adjecancy graph with " << numRegions << " regions and " << numRegionEdges << " edges" << std::endl; }
static void drtileImpl(const vigra::MultiArrayView<M, weight_t, Stride>& A, unsigned long w, std::vector< vigra::TinyVector<coordinate_t, 3> > & t, vigra::TinyVector<coordinate_t, N>& currentShape ) { #ifdef DEBUG_PRINTING std::cout << "detail<"<<N<<","<<M<<">::drtileImpl(A,w="<<w<<") " << std::endl; std::cout << " A =" << std::endl; printArray(A, std::string(" ")); std::cout << " A.shape =" << A.shape() << std::endl; std::cout << " w =" << w << std::endl; #endif typedef vigra::TinyVector<coordinate_t, 3> t_t; //create Abar typename if_<M-1==0, vigra::TinyVector<coordinate_t, 1>, vigra::TinyVector<coordinate_t, M-1> >::result Abar_shape; if(M-1>=1) { for(unsigned long i=0; i<M-1; ++i) Abar_shape[i] = A.shape(i); } else { Abar_shape[0] = 1; } //typename if_<M-1==0, vigra::MultiArray<0, weight_t>, vigra::MultiArray<M-1, weight_t> >::result Abar(Abar_shape); vigra::MultiArray<M-1, weight_t> Abar(Abar_shape); const unsigned long d = M; const unsigned long nd = A.shape(d-1); coordinate_t prev_k = 0; while(prev_k != nd) { for(coordinate_t k=prev_k; k<nd+1; ++k) { #ifdef DEBUG_PRINTING std::cout << " * prev_k=" << prev_k << ", k=" << k << std::endl; #endif //extend Abar if(k<=A.shape(d-1)-1) { if(d-1 == 0) { Abar[0] += A[k]; } else { Abar += A.template bind<d-1>(k); } } currentShape[d-1] = k-prev_k; #ifdef DEBUG_PRINTING std::cout << " * Abar [extend] =" << std::endl; printArray(Abar, std::string(" ")); #endif //find maximum weight_t max = std::numeric_limits<weight_t>::min(); for(size_t i=0; i<Abar.size(); ++i) { if(Abar[i] > max) {max = Abar[i]; } } #ifdef DEBUG_PRINTING std::cout << " * max=" << (int)max << std::endl; #endif if(k==nd || max > w) { //unextend Abar if(k<=A.shape(d-1)-1) { if(d-1 == 0) { Abar[0] -= A[k]; } else { Abar -= A.template bind<d-1>(k); } } #ifdef DEBUG_PRINTING std::cout << " * Abar [unextend] =" << std::endl; printArray(Abar, std::string(" ")); std::cout << "PUSH: " << d << " " << prev_k << " " << k << std::endl; #endif if(d!=1) { t.push_back(t_t(d, prev_k, k)); } else { unsigned long p = 1; for(unsigned long l=0; l<currentShape.size(); ++l) p *= currentShape[l]; if (!(p == 1 && Abar[0] ==w)) { t.push_back(t_t(d, prev_k, k)); } } if(d>1) { #ifdef DEBUG_PRINTING std::cout << "RECURSE" << std::endl; #endif detail<N,M-1,vigra::StridedArrayTag>::drtileImpl(Abar, w, t, currentShape); } Abar.init(0); prev_k = k; #ifdef DEBUG_PRINTING std::cout << " * Abar [cleared] =" << std::endl; printArray(Abar, std::string(" ")); std::cout << " * prev_k=" << prev_k << std::endl; #endif break; } } } }