Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

void Impala::Core::Array::mergeRegions ( pixgroup *  rg,
int  nrClusters,
const VectorDouble &  clusterMap,
const MatrixDouble &  m,
int  width,
int  height,
double  threshold 
)

Definition at line 336 of file ColorSegmentation.h.

References Impala::Core::Array::pixgroup::label, Impala::Core::Array::pixgroup::nrPixInGroup, regionDistance(), and rgmerge().

Referenced by ColorSegmentation().

00338 {
00339 
00340     MatrixTem<int> adjacencyTable(nrClusters, nrClusters, 0) ;
00341 
00342     // initialization of adjacency table
00343     // if cluster i and j are adjacent to each other then adjacencyTable[i][j] = 1 
00344     for (int y=1; y<height-1; y++) {
00345         for (int x=1; x<width-1; x++)   {   
00346                 // convert y and x to pixelnumber i
00347             int i = y*width + x;
00348             for (int u=-1; u<=1; u++)
00349                 for (int v=-1; v<=1; v++)   {
00350                     int nb = i+u*width+v;
00351                     if (clusterMap[i] != clusterMap[nb])
00352                         adjacencyTable[(int)clusterMap[i]][(int)clusterMap[nb]] =
00353  adjacencyTable[(int)clusterMap[nb]][(int)clusterMap[i]] = 1;
00354                 }
00355         }
00356     }
00357     
00358     double minval = 1E10; //min distance between regions
00359     int umin, vmin;
00360 
00361         //initialize the joint distance table
00362     MatrixDouble distanceTable(nrClusters, nrClusters,0.0) ;
00363     for (int u=0; u<nrClusters; u++) {
00364         for (int v=u+1; v<nrClusters; v++)  {
00365             if (adjacencyTable[u][v]>0) { //adjacent
00366                 double d = regionDistance(rg[u],rg[v]) ;
00367                 distanceTable[u][v] = distanceTable[v][u] = d;
00368                     // find the most similar adjacent regions u and v
00369                 if (d < minval) {
00370                     minval = d; umin = u; vmin = v;
00371                 }
00372             }
00373         }
00374     }
00375 
00376     bool ismerged = (minval <= threshold);
00377 
00378     //main loop for merging
00379     while (ismerged) {
00380 
00381             // merge vmin to umin
00382         rgmerge(rg[umin],rg[vmin], m);
00383 
00384         //int nrRegionsLeft = 0;
00385             //update the adjacencyTable
00386         adjacencyTable[umin][vmin] = adjacencyTable[vmin][umin] = 0;
00387         for (int i=0; i<nrClusters; i++) {
00388             if(adjacencyTable[vmin][i]>0) {
00389                     //vmin has been merged to umin
00390                 adjacencyTable[i][umin] = adjacencyTable[umin][i] = 1; 
00391                 adjacencyTable[i][vmin] = adjacencyTable[vmin][i] = 0;
00392             }
00393             //if (rg[i].nrPixInGroup > 0)
00394             //  nrRegionsLeft++;
00395         }
00396         //std::cout << "nrRegionsLeft : " << nrRegionsLeft << std::endl;
00397 
00398         //now recompute the statistic distance between new region u and others
00399         bool foundmin = false;
00400         for (int i=0; i<nrClusters; i++) {
00401             if (i!=umin && adjacencyTable[umin][i]>0) {
00402                 double d = regionDistance(rg[umin],rg[i]) ;
00403                 distanceTable[umin][i] = distanceTable[i][umin] = d;
00404                 if (d <= minval) {
00405                     minval = d; vmin = i; //found another min value
00406                     // DK : ignore this one so we always find the real min (?)
00407                     //foundmin = true;
00408                 }
00409             }
00410         }
00411 
00412         if (!foundmin) //min value has not been found, find it
00413         {
00414             minval = 1E10;
00415             for (int u=0; u<nrClusters; u++) 
00416                 for (int v=u+1; v<nrClusters; v++)
00417                     if (adjacencyTable[u][v] && (distanceTable[u][v]<minval)) {
00418                         minval = distanceTable[u][v]; umin = u; vmin = v;
00419                     }
00420         }
00421         if (minval > threshold) ismerged = false; //no merge anymore
00422 
00423     } //while
00424 
00425     //regenerate new labels
00426     int count = 0;
00427 
00428     for (int c=0; c<nrClusters; c++) {
00429         if (rg[c].nrPixInGroup!=0)  {
00430 
00431             for (int i=0; i<rg[c].nrPixInGroup; i++) 
00432                     clusterMap[rg[c].idx[i]] = count;
00433 
00434             rg[c].label = count++;
00435         }
00436     }
00437 }

Here is the call graph for this function:


Generated on Fri Mar 19 10:56:21 2010 for ImpalaSrc by  doxygen 1.5.1