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:
|