void saliency_map(const char * filename, Mesh & m) { int width, height; unsigned char * buf = imageio_load_image(filename, &width, &height); m.adjlist(); MaxMapper mapper(buf,width,height); for(size_t tidx=0; tidx<m.t.size(); tidx++) { mapper.max=0; for(size_t jj=0; jj<m.adjMat[tidx].size(); jj++) { int nbr=m.adjMat[tidx][jj]; int kk=0; bool foundExclude=false; for(kk=0; kk<3; kk++) { int vidx=m.t[tidx][kk]; if(!contains(m.t[nbr].x, vidx,3)) { foundExclude=true; break; } } if(!foundExclude) { //shouldn't really happen continue; } trace_edge(m,tidx,(kk+1)%3,(kk+2)%3,mapper); trace_edge(m,nbr,(kk+1)%3,(kk+2)%3,mapper); m.saliency[EdgeId(tidx,nbr)]=mapper.max/255.0; } } delete []buf; }
/* traces along a set of edges and returns the edge members and the perimeter */ void trace_edges(unsigned char * edgesImage, int width, int height, struct line_segments * segments) { int x,y,n,index=0,max; int tx = segments->image_border; int ty = segments->image_border; int bx = width - segments->image_border - 1; int by = height - segments->image_border - 1; int border_tx,border_ty,border_bx,border_by; int * memb,no_of_memb=0; segments->no_of_segments = 0; for (y=ty; y<=by; y++) { for (x=tx; x<=bx; x++) { n = y*width + x; if (edgesImage[n]==0) { border_tx = width; border_ty = height; border_bx = 0; border_by = 0; memb = &(segments->members[index*2]); max = segments->max_members - index - 1; trace_edge(edgesImage, width, height, x, y, segments->image_border, &border_tx, &border_ty, &border_bx, &border_by, segments->ignore_periphery, max,memb, &no_of_memb); segments->no_of_members[segments->no_of_segments] = no_of_memb; if (segments->no_of_members[segments->no_of_segments] > segments->minimum_segment_length) { index += segments->no_of_members[segments->no_of_segments]; segments->no_of_segments++; if (segments->no_of_segments >= segments->max_segments) return; } } } } }